Merge "resourceloader: Add unit tests for ResourceLoaderImage"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Tue, 11 Apr 2017 22:25:33 +0000 (22:25 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Tue, 11 Apr 2017 22:25:33 +0000 (22:25 +0000)
843 files changed:
.gitignore
.travis.yml
CREDITS
Gruntfile.js
HISTORY
RELEASE-NOTES-1.29
autoload.php
composer.json
docs/hooks.txt
includes/Block.php
includes/CategoryFinder.php
includes/CategoryViewer.php
includes/DefaultSettings.php
includes/Defines.php
includes/EditPage.php
includes/Linker.php
includes/MediaWiki.php
includes/MergeHistory.php
includes/OutputPage.php
includes/Revision.php
includes/RevisionList.php
includes/SiteStats.php
includes/Title.php
includes/TrackingCategories.php
includes/WatchedItemQueryService.php
includes/WatchedItemQueryServiceExtension.php
includes/WatchedItemStore.php
includes/Xml.php
includes/actions/PurgeAction.php
includes/actions/ViewAction.php
includes/api/ApiAMCreateAccount.php
includes/api/ApiAuthManagerHelper.php
includes/api/ApiBase.php
includes/api/ApiBlock.php
includes/api/ApiChangeAuthenticationData.php
includes/api/ApiCheckToken.php
includes/api/ApiClearHasMsg.php
includes/api/ApiClientLogin.php
includes/api/ApiDelete.php
includes/api/ApiEditPage.php
includes/api/ApiEmailUser.php
includes/api/ApiExpandTemplates.php
includes/api/ApiFeedWatchlist.php
includes/api/ApiFormatBase.php
includes/api/ApiHelp.php
includes/api/ApiImport.php
includes/api/ApiLinkAccount.php
includes/api/ApiLogin.php
includes/api/ApiLogout.php
includes/api/ApiMain.php
includes/api/ApiManageTags.php
includes/api/ApiMergeHistory.php
includes/api/ApiMove.php
includes/api/ApiOpenSearch.php
includes/api/ApiOptions.php
includes/api/ApiPageSet.php
includes/api/ApiParamInfo.php
includes/api/ApiParse.php
includes/api/ApiPatrol.php
includes/api/ApiProtect.php
includes/api/ApiPurge.php
includes/api/ApiQuery.php
includes/api/ApiQueryAllCategories.php
includes/api/ApiQueryAllDeletedRevisions.php
includes/api/ApiQueryAllImages.php
includes/api/ApiQueryAllLinks.php
includes/api/ApiQueryAllMessages.php
includes/api/ApiQueryAllPages.php
includes/api/ApiQueryAllRevisions.php
includes/api/ApiQueryAllUsers.php
includes/api/ApiQueryAuthManagerInfo.php
includes/api/ApiQueryBacklinks.php
includes/api/ApiQueryBacklinksprop.php
includes/api/ApiQueryBlocks.php
includes/api/ApiQueryCategories.php
includes/api/ApiQueryCategoryInfo.php
includes/api/ApiQueryCategoryMembers.php
includes/api/ApiQueryContributors.php
includes/api/ApiQueryDeletedRevisions.php
includes/api/ApiQueryDeletedrevs.php
includes/api/ApiQueryDuplicateFiles.php
includes/api/ApiQueryExtLinksUsage.php
includes/api/ApiQueryExternalLinks.php
includes/api/ApiQueryFileRepoInfo.php
includes/api/ApiQueryFilearchive.php
includes/api/ApiQueryIWBacklinks.php
includes/api/ApiQueryIWLinks.php
includes/api/ApiQueryImageInfo.php
includes/api/ApiQueryImages.php
includes/api/ApiQueryInfo.php
includes/api/ApiQueryLangBacklinks.php
includes/api/ApiQueryLangLinks.php
includes/api/ApiQueryLinks.php
includes/api/ApiQueryLogEvents.php
includes/api/ApiQueryMyStashedFiles.php
includes/api/ApiQueryPagePropNames.php
includes/api/ApiQueryPageProps.php
includes/api/ApiQueryPagesWithProp.php
includes/api/ApiQueryPrefixSearch.php
includes/api/ApiQueryProtectedTitles.php
includes/api/ApiQueryQueryPage.php
includes/api/ApiQueryRandom.php
includes/api/ApiQueryRecentChanges.php
includes/api/ApiQueryRevisions.php
includes/api/ApiQuerySearch.php
includes/api/ApiQuerySiteinfo.php
includes/api/ApiQueryStashImageInfo.php
includes/api/ApiQueryTags.php
includes/api/ApiQueryTokens.php
includes/api/ApiQueryUserContributions.php
includes/api/ApiQueryUserInfo.php
includes/api/ApiQueryUsers.php
includes/api/ApiQueryWatchlist.php
includes/api/ApiQueryWatchlistRaw.php
includes/api/ApiRemoveAuthenticationData.php
includes/api/ApiResetPassword.php
includes/api/ApiRevisionDelete.php
includes/api/ApiRollback.php
includes/api/ApiRsd.php
includes/api/ApiSetNotificationTimestamp.php
includes/api/ApiSetPageLanguage.php
includes/api/ApiTag.php
includes/api/ApiUnblock.php
includes/api/ApiUndelete.php
includes/api/ApiUpload.php
includes/api/ApiUserrights.php
includes/api/ApiValidatePassword.php
includes/api/ApiWatch.php
includes/api/i18n/cs.json
includes/api/i18n/de.json
includes/api/i18n/en.json
includes/api/i18n/fr.json
includes/api/i18n/gl.json
includes/api/i18n/he.json
includes/api/i18n/it.json
includes/api/i18n/ja.json
includes/api/i18n/ko.json
includes/api/i18n/lb.json
includes/api/i18n/nl.json
includes/api/i18n/pl.json
includes/api/i18n/pt-br.json
includes/api/i18n/qqq.json
includes/api/i18n/ru.json
includes/api/i18n/sv.json
includes/api/i18n/uk.json
includes/api/i18n/zh-hans.json
includes/cache/BacklinkCache.php
includes/cache/LinkBatch.php
includes/cache/LinkCache.php
includes/cache/MessageBlobStore.php
includes/cache/MessageCache.php
includes/cache/localisation/LCStoreDB.php
includes/cache/localisation/LocalisationCache.php
includes/changes/ChangesListBooleanFilter.php
includes/changes/ChangesListFilter.php
includes/changes/ChangesListFilterGroup.php
includes/changes/ChangesListStringOptionsFilter.php
includes/changes/ChangesListStringOptionsFilterGroup.php
includes/changetags/ChangeTagsList.php
includes/changetags/ChangeTagsLogList.php
includes/changetags/ChangeTagsRevisionList.php
includes/config/EtcdConfig.php [new file with mode: 0644]
includes/context/ContextSource.php
includes/db/CloneDatabase.php
includes/db/ORAResult.php
includes/deferred/AtomicSectionUpdate.php
includes/deferred/AutoCommitUpdate.php
includes/deferred/DeferredUpdates.php
includes/deferred/LinksDeletionUpdate.php
includes/deferred/LinksUpdate.php
includes/deferred/MWCallableUpdate.php
includes/deferred/SiteStatsUpdate.php
includes/deferred/SqlDataUpdate.php
includes/deferred/WANCacheReapUpdate.php
includes/diff/DifferenceEngine.php
includes/export/WikiExporter.php
includes/externalstore/ExternalStoreDB.php
includes/filebackend/filejournal/DBFileJournal.php
includes/filebackend/lockmanager/MySqlLockManager.php
includes/filerepo/FileBackendDBRepoWrapper.php
includes/filerepo/ForeignDBRepo.php
includes/filerepo/LocalRepo.php
includes/filerepo/file/File.php
includes/filerepo/file/LocalFile.php
includes/htmlform/HTMLFormField.php
includes/http/Http.php
includes/http/MWHttpRequest.php
includes/import/WikiRevision.php
includes/installer/DatabaseInstaller.php
includes/installer/DatabaseUpdater.php
includes/installer/Installer.php
includes/installer/MysqlUpdater.php
includes/installer/OracleUpdater.php
includes/installer/i18n/bg.json
includes/installer/i18n/br.json
includes/installer/i18n/mk.json
includes/installer/i18n/pt-br.json
includes/installer/i18n/roa-tara.json
includes/installer/i18n/th.json
includes/installer/i18n/tr.json
includes/interwiki/ClassicInterwikiLookup.php
includes/jobqueue/JobQueue.php
includes/jobqueue/JobQueueDB.php
includes/jobqueue/utils/PurgeJobUtils.php
includes/libs/CSSMin.php
includes/libs/DnsSrvDiscoverer.php [new file with mode: 0644]
includes/libs/filebackend/FileBackendStore.php
includes/libs/filebackend/SwiftFileBackend.php
includes/libs/lockmanager/DBLockManager.php
includes/libs/lockmanager/QuorumLockManager.php
includes/libs/mime/XmlTypeCheck.php
includes/libs/objectcache/CachedBagOStuff.php
includes/libs/rdbms/connectionmanager/ConnectionManager.php
includes/libs/rdbms/connectionmanager/SessionConsistentConnectionManager.php
includes/libs/rdbms/database/DBConnRef.php
includes/libs/rdbms/database/Database.php
includes/libs/rdbms/database/DatabaseMysqlBase.php
includes/libs/rdbms/database/DatabasePostgres.php
includes/libs/rdbms/database/IDatabase.php
includes/libs/rdbms/database/IMaintainableDatabase.php
includes/libs/rdbms/database/MaintainableDBConnRef.php
includes/libs/rdbms/database/resultwrapper/ResultWrapper.php
includes/libs/rdbms/defines.php
includes/libs/rdbms/exception/DBConnectionError.php
includes/libs/rdbms/exception/DBError.php
includes/libs/rdbms/exception/DBExpectedError.php
includes/libs/rdbms/exception/DBQueryError.php
includes/libs/rdbms/lbfactory/LBFactory.php
includes/libs/rdbms/lbfactory/LBFactoryMulti.php
includes/libs/rdbms/lbfactory/LBFactorySimple.php
includes/libs/rdbms/lbfactory/LBFactorySingle.php
includes/libs/rdbms/loadbalancer/ILoadBalancer.php
includes/libs/rdbms/loadbalancer/LoadBalancer.php
includes/libs/rdbms/loadbalancer/LoadBalancerSingle.php
includes/libs/rdbms/loadmonitor/LoadMonitor.php
includes/libs/rdbms/loadmonitor/LoadMonitorMySQL.php
includes/logging/DeleteLogFormatter.php
includes/logging/LogEntry.php
includes/logging/LogEventsList.php
includes/media/IPTC.php
includes/objectcache/ObjectCache.php
includes/objectcache/SqlBagOStuff.php
includes/page/Article.php
includes/page/ImageHistoryPseudoPager.php
includes/page/PageArchive.php
includes/page/WikiFilePage.php
includes/page/WikiPage.php
includes/pager/IndexPager.php
includes/parser/CoreTagHooks.php
includes/parser/Parser.php
includes/parser/ParserOptions.php
includes/parser/ParserOutput.php
includes/profiler/output/ProfilerOutputStats.php
includes/resourceloader/ResourceLoader.php
includes/resourceloader/ResourceLoaderImage.php
includes/resourceloader/ResourceLoaderImageModule.php
includes/resourceloader/ResourceLoaderJqueryMsgModule.php
includes/resourceloader/ResourceLoaderModule.php
includes/resourceloader/ResourceLoaderSkinModule.php
includes/resourceloader/ResourceLoaderSpecialCharacterDataModule.php
includes/resourceloader/ResourceLoaderStartUpModule.php
includes/resourceloader/ResourceLoaderUserDefaultsModule.php
includes/resourceloader/ResourceLoaderUserOptionsModule.php
includes/resourceloader/ResourceLoaderUserTokensModule.php
includes/resourceloader/ResourceLoaderWikiModule.php
includes/revisiondelete/RevDelArchiveList.php
includes/revisiondelete/RevDelArchivedFileList.php
includes/revisiondelete/RevDelFileItem.php
includes/revisiondelete/RevDelFileList.php
includes/revisiondelete/RevDelLogList.php
includes/revisiondelete/RevDelRevisionList.php
includes/revisiondelete/RevisionDeleteUser.php
includes/search/SearchDatabase.php
includes/search/SearchEngine.php
includes/search/SearchEngineFactory.php
includes/search/SearchHighlighter.php
includes/skins/BaseTemplate.php
includes/specialpage/ChangesListSpecialPage.php
includes/specialpage/ImageQueryPage.php
includes/specialpage/PageQueryPage.php
includes/specialpage/QueryPage.php
includes/specialpage/RedirectSpecialPage.php
includes/specialpage/SpecialPageFactory.php
includes/specialpage/WantedQueryPage.php
includes/specials/SpecialAllMessages.php
includes/specials/SpecialAllPages.php
includes/specials/SpecialAutoblockList.php [new file with mode: 0644]
includes/specials/SpecialBrokenRedirects.php
includes/specials/SpecialChangeCredentials.php
includes/specials/SpecialChangeEmail.php
includes/specials/SpecialDoubleRedirects.php
includes/specials/SpecialGoToInterwiki.php [new file with mode: 0644]
includes/specials/SpecialLinkSearch.php
includes/specials/SpecialListDuplicatedFiles.php
includes/specials/SpecialListredirects.php
includes/specials/SpecialMediaStatistics.php
includes/specials/SpecialMostcategories.php
includes/specials/SpecialMostinterwikis.php
includes/specials/SpecialMostlinked.php
includes/specials/SpecialMostlinkedcategories.php
includes/specials/SpecialMostlinkedtemplates.php
includes/specials/SpecialNewimages.php
includes/specials/SpecialNewpages.php [changed mode: 0755->0644]
includes/specials/SpecialPageLanguage.php
includes/specials/SpecialPreferences.php
includes/specials/SpecialRecentchanges.php
includes/specials/SpecialSearch.php
includes/specials/SpecialShortpages.php
includes/specials/SpecialUndelete.php
includes/specials/SpecialUnwatchedpages.php
includes/specials/SpecialUserrights.php
includes/specials/SpecialWatchlist.php
includes/specials/SpecialWhatlinkshere.php
includes/specials/helpers/LoginHelper.php
includes/specials/pagers/ContribsPager.php
includes/specials/pagers/DeletedContribsPager.php
includes/specials/pagers/ImageListPager.php
includes/specials/pagers/NewFilesPager.php
includes/tidy/RemexCompatMunger.php
includes/upload/UploadBase.php
includes/upload/UploadFromUrl.php
includes/user/User.php
includes/user/UserGroupMembership.php
includes/user/UserRightsProxy.php
includes/utils/BatchRowIterator.php
includes/utils/BatchRowWriter.php
includes/widget/search/InterwikiSearchResultSetWidget.php
jsduck.json
languages/LanguageConverter.php
languages/classes/LanguageAz.php
languages/classes/LanguageKk.php
languages/data/Names.php
languages/i18n/af.json
languages/i18n/ar.json
languages/i18n/arz.json
languages/i18n/ast.json
languages/i18n/atj.json [new file with mode: 0644]
languages/i18n/azb.json
languages/i18n/ba.json
languages/i18n/bar.json
languages/i18n/be-tarask.json
languages/i18n/be.json
languages/i18n/bg.json
languages/i18n/bn.json
languages/i18n/bqi.json
languages/i18n/br.json
languages/i18n/bs.json
languages/i18n/ca.json
languages/i18n/ce.json
languages/i18n/ceb.json
languages/i18n/ckb.json
languages/i18n/crh-cyrl.json
languages/i18n/crh-latn.json
languages/i18n/cs.json
languages/i18n/csb.json
languages/i18n/de.json
languages/i18n/diq.json
languages/i18n/dty.json
languages/i18n/el.json
languages/i18n/en.json
languages/i18n/eo.json
languages/i18n/es.json
languages/i18n/et.json
languages/i18n/eu.json
languages/i18n/fa.json
languages/i18n/fi.json
languages/i18n/fr.json
languages/i18n/frc.json
languages/i18n/frr.json
languages/i18n/fy.json
languages/i18n/gl.json
languages/i18n/got.json
languages/i18n/gsw.json
languages/i18n/he.json
languages/i18n/hi.json
languages/i18n/hr.json
languages/i18n/hu.json
languages/i18n/ia.json
languages/i18n/id.json
languages/i18n/ilo.json
languages/i18n/inh.json
languages/i18n/is.json
languages/i18n/it.json
languages/i18n/ja.json
languages/i18n/jv.json
languages/i18n/ka.json
languages/i18n/kiu.json
languages/i18n/km.json
languages/i18n/ko.json
languages/i18n/krl.json
languages/i18n/lb.json
languages/i18n/lt.json
languages/i18n/map-bms.json
languages/i18n/mg.json
languages/i18n/mhr.json
languages/i18n/mk.json
languages/i18n/mr.json
languages/i18n/ms.json
languages/i18n/my.json
languages/i18n/nan.json
languages/i18n/nb.json
languages/i18n/nl.json
languages/i18n/nn.json
languages/i18n/oc.json
languages/i18n/olo.json
languages/i18n/or.json
languages/i18n/pl.json
languages/i18n/pt-br.json
languages/i18n/pt.json
languages/i18n/qqq.json
languages/i18n/qu.json
languages/i18n/rm.json
languages/i18n/ro.json
languages/i18n/roa-tara.json
languages/i18n/ru.json
languages/i18n/sc.json
languages/i18n/sco.json
languages/i18n/sd.json
languages/i18n/sh.json
languages/i18n/shn.json
languages/i18n/sk.json
languages/i18n/sl.json
languages/i18n/sq.json
languages/i18n/sr-ec.json
languages/i18n/sr-el.json
languages/i18n/su.json
languages/i18n/sv.json
languages/i18n/tcy.json
languages/i18n/tet.json
languages/i18n/tl.json
languages/i18n/tr.json
languages/i18n/tt-cyrl.json
languages/i18n/uk.json
languages/i18n/vi.json
languages/i18n/wa.json
languages/i18n/yi.json
languages/i18n/yue.json
languages/i18n/zh-hans.json
languages/i18n/zh-hant.json
languages/messages/MessagesAtj.php [new file with mode: 0644]
languages/messages/MessagesEn.php
maintenance/Maintenance.php
maintenance/archives/patch-rename-ar_usertext_timestamp.sql [new file with mode: 0644]
maintenance/archives/upgradeLogging.php
maintenance/backup.inc
maintenance/benchmarks/bench_delete_truncate.php
maintenance/cleanupRemovedModules.php
maintenance/convertUserOptions.php
maintenance/createCommonPasswordCdb.php
maintenance/deleteOrphanedRevisions.php
maintenance/deleteRevision.php
maintenance/dumpIterator.php
maintenance/dumpTextPass.php
maintenance/fetchText.php
maintenance/getLagTimes.php
maintenance/jsduck/categories.json
maintenance/jsduck/eg-iframe.html
maintenance/namespaceDupes.php
maintenance/orphans.php
maintenance/populateContentModel.php
maintenance/populateRecentChangesSource.php
maintenance/purgeModuleDeps.php
maintenance/rebuildImages.php
maintenance/rebuildtextindex.php
maintenance/refreshImageMetadata.php
maintenance/refreshLinks.php
maintenance/runBatchedQuery.php
maintenance/sql.php
maintenance/update.php
maintenance/updateCollation.php
package.json
resources/Resources.php
resources/ResourcesOOUI.php
resources/lib/es5-shim/es5-shim.js [deleted file]
resources/lib/oojs-ui/i18n/bqi.json
resources/lib/oojs-ui/oojs-ui-apex.js
resources/lib/oojs-ui/oojs-ui-core-apex.css
resources/lib/oojs-ui/oojs-ui-core-mediawiki.css
resources/lib/oojs-ui/oojs-ui-core.js
resources/lib/oojs-ui/oojs-ui-mediawiki.js
resources/lib/oojs-ui/oojs-ui-toolbars-apex.css
resources/lib/oojs-ui/oojs-ui-toolbars-mediawiki.css
resources/lib/oojs-ui/oojs-ui-toolbars.js
resources/lib/oojs-ui/oojs-ui-widgets-apex.css
resources/lib/oojs-ui/oojs-ui-widgets-mediawiki.css
resources/lib/oojs-ui/oojs-ui-widgets.js
resources/lib/oojs-ui/oojs-ui-windows-apex.css
resources/lib/oojs-ui/oojs-ui-windows-mediawiki.css
resources/lib/oojs-ui/oojs-ui-windows.js
resources/lib/oojs-ui/themes/apex/icons-alerts.json
resources/lib/oojs-ui/themes/apex/icons-content.json
resources/lib/oojs-ui/themes/apex/icons-interactions.json
resources/lib/oojs-ui/themes/apex/icons-layout.json [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/icons-moderation.json
resources/lib/oojs-ui/themes/apex/icons-movement.json
resources/lib/oojs-ui/themes/apex/icons.json
resources/lib/oojs-ui/themes/apex/images/icons/add-invert.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/add-invert.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/beta-invert.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/beta-invert.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/beta.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/beta.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/bookmark-ltr-invert.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/bookmark-ltr-invert.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/bookmark-rtl-invert.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/bookmark-rtl-invert.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/browser-ltr-invert.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/browser-ltr-invert.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/browser-rtl-invert.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/browser-rtl-invert.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/clear-invert.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/clear-invert.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/clock-invert.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/clock-invert.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/feedback-ltr-invert.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/feedback-ltr-invert.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/feedback-rtl-invert.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/feedback-rtl-invert.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/funnel-ltr-invert.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/funnel-ltr-invert.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/funnel-rtl-invert.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/funnel-rtl-invert.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/heart-invert.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/heart-invert.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/key-ltr-invert.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/key-ltr-invert.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/key-rtl-invert.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/key-rtl-invert.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/keyboard-ltr-invert.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/keyboard-ltr-invert.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/keyboard-rtl-invert.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/keyboard-rtl-invert.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/logOut-ltr-invert.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/logOut-ltr-invert.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/logOut-rtl-invert.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/logOut-rtl-invert.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/logo-wikimediaDiscovery-invert.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/logo-wikimediaDiscovery-invert.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/logo-wikimediaDiscovery.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/logo-wikimediaDiscovery.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/newWindow-ltr-invert.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/newWindow-ltr-invert.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/newWindow-rtl-invert.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/newWindow-rtl-invert.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/printer-ltr-invert.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/printer-ltr-invert.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/printer-rtl-invert.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/printer-rtl-invert.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/ribbonPrize-invert.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/ribbonPrize-invert.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/ribbonPrize.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/ribbonPrize.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/search-ltr.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/search-ltr.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/search-rtl.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/search-rtl.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/search.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/search.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/stripeFlow-ltr.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/stripeFlow-ltr.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/stripeFlow-rtl.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/stripeFlow-rtl.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/stripeSideMenu.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/stripeSideMenu.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/stripeSummary-ltr.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/stripeSummary-ltr.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/stripeSummary-rtl.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/stripeSummary-rtl.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/stripeToC-ltr.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/stripeToC-ltr.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/stripeToC-rtl.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/stripeToC-rtl.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/subtract-invert.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/subtract-invert.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/sun-ltr-invert.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/sun-ltr-invert.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/sun-rtl-invert.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/sun-rtl-invert.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/viewCompact.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/viewCompact.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/viewDetails-ltr.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/viewDetails-ltr.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/viewDetails-rtl.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/viewDetails-rtl.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/watchlist-ltr-invert.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/watchlist-ltr-invert.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/watchlist-rtl-invert.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/watchlist-rtl-invert.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/icons-alerts.json
resources/lib/oojs-ui/themes/mediawiki/icons-content.json
resources/lib/oojs-ui/themes/mediawiki/icons-interactions.json
resources/lib/oojs-ui/themes/mediawiki/icons-layout.json
resources/lib/oojs-ui/themes/mediawiki/icons-location.json
resources/lib/oojs-ui/themes/mediawiki/icons-moderation.json
resources/lib/oojs-ui/themes/mediawiki/icons-movement.json
resources/lib/oojs-ui/themes/mediawiki/icons-wikimedia.json
resources/lib/oojs-ui/themes/mediawiki/icons.json
resources/lib/oojs-ui/themes/mediawiki/images/icons/beta-invert.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/beta-invert.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/beta-progressive.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/beta-progressive.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/beta.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/beta.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/mapTrail-ltr-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/mapTrail-ltr-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/mapTrail-ltr-progressive.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/mapTrail-ltr-progressive.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/mapTrail-ltr.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/mapTrail-ltr.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/mapTrail-rtl-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/mapTrail-rtl-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/mapTrail-rtl-progressive.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/mapTrail-rtl-progressive.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/mapTrail-rtl.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/mapTrail-rtl.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/ribbonPrize-invert.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/ribbonPrize-invert.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/ribbonPrize-progressive.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/ribbonPrize-progressive.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/ribbonPrize.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/ribbonPrize.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-ltr-invert.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-ltr-invert.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-ltr-progressive.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-ltr-progressive.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-ltr.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-ltr.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-rtl-invert.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-rtl-invert.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-rtl-progressive.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-rtl-progressive.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-rtl.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-rtl.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/indicators/alert-progressive.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/indicators/alert-progressive.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-down-progressive.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-down-progressive.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-ltr-progressive.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-ltr-progressive.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-rtl-progressive.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-rtl-progressive.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-up-progressive.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-up-progressive.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/indicators/clear-progressive.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/indicators/clear-progressive.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/indicators/required-progressive.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/indicators/required-progressive.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/indicators/search-ltr-progressive.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/indicators/search-ltr-progressive.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/indicators/search-rtl-progressive.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/indicators/search-rtl-progressive.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/indicators.json
resources/lib/oojs/oojs.jquery.js
resources/src/es5-skip.js [deleted file]
resources/src/jquery/images/jquery.arrowSteps.divider-ltr.png [deleted file]
resources/src/jquery/images/jquery.arrowSteps.divider-rtl.png [deleted file]
resources/src/jquery/images/jquery.arrowSteps.head-ltr.png [deleted file]
resources/src/jquery/images/jquery.arrowSteps.head-rtl.png [deleted file]
resources/src/jquery/images/jquery.arrowSteps.tail-ltr.png [deleted file]
resources/src/jquery/images/jquery.arrowSteps.tail-rtl.png [deleted file]
resources/src/jquery/jquery.arrowSteps.css [deleted file]
resources/src/jquery/jquery.arrowSteps.js [deleted file]
resources/src/jquery/jquery.color.js
resources/src/jquery/jquery.colorUtil.js
resources/src/jquery/jquery.makeCollapsible.js
resources/src/jquery/jquery.mwExtension.js
resources/src/jquery/jquery.placeholder.js
resources/src/jquery/jquery.qunit.completenessTest.js [deleted file]
resources/src/jquery/jquery.suggestions.js
resources/src/mediawiki.language/specialcharacters.json
resources/src/mediawiki.legacy/oldshared.css
resources/src/mediawiki.legacy/shared.css
resources/src/mediawiki.libs/mediawiki.libs.jpegmeta.js
resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FilterGroup.js
resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FilterItem.js
resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FiltersViewModel.js
resources/src/mediawiki.rcfilters/mw.rcfilters.Controller.js
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.CapsuleItemWidget.less
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.CapsuleItemWidget.monobook.less [new file with mode: 0644]
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.ChangesListWrapperWidget.less
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterGroupWidget.less
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterItemWidget.less
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterWrapperWidget.less
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.Overlay.monobook.less [new file with mode: 0644]
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.variables.less
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.CapsuleItemWidget.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.ChangesListWrapperWidget.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterCapsuleMultiselectWidget.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterGroupWidget.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterWrapperWidget.js
resources/src/mediawiki.skinning/content.parsoid.less
resources/src/mediawiki.special/mediawiki.special.apisandbox.js
resources/src/mediawiki.special/mediawiki.special.changecredentials.js [new file with mode: 0644]
resources/src/mediawiki.special/mediawiki.special.search.interwikiwidget.styles.less
resources/src/mediawiki.special/mediawiki.special.userlogin.common.css
resources/src/mediawiki.special/mediawiki.special.userlogin.signup.js
resources/src/mediawiki.toolbar/toolbar.js
resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaResultWidget.css
resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaSearchWidget.js
resources/src/mediawiki.widgets/mw.widgets.CategoryMultiselectWidget.js [new file with mode: 0644]
resources/src/mediawiki.widgets/mw.widgets.CategorySelector.js [deleted file]
resources/src/mediawiki.widgets/mw.widgets.ComplexNamespaceInputWidget.js
resources/src/mediawiki.widgets/mw.widgets.ComplexTitleInputWidget.js
resources/src/mediawiki.widgets/mw.widgets.TitleOptionWidget.js
resources/src/mediawiki/api.js
resources/src/mediawiki/api/watch.js
resources/src/mediawiki/htmlform/hide-if.js
resources/src/mediawiki/htmlform/htmlform.Checker.js [new file with mode: 0644]
resources/src/mediawiki/mediawiki.ForeignStructuredUpload.BookletLayout.js
resources/src/mediawiki/mediawiki.Title.js
resources/src/mediawiki/mediawiki.Upload.BookletLayout.js
resources/src/mediawiki/mediawiki.Uri.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.css
resources/src/mediawiki/mediawiki.notification.js
resources/src/mediawiki/mediawiki.toc.js
resources/src/mediawiki/mediawiki.user.blockcookie.js [deleted file]
resources/src/mediawiki/mediawiki.util.js
resources/src/mediawiki/page/ready.js
resources/src/moment-locale-overrides.js
resources/src/polyfill-object-create.js [deleted file]
resources/src/startup.js
tests/parser/DbTestPreviewer.php
tests/parser/DbTestRecorder.php
tests/parser/ParserTestRunner.php
tests/parser/parserTests.txt
tests/phpunit/MediaWikiTestCase.php
tests/phpunit/includes/FauxRequestTest.php
tests/phpunit/includes/GlobalFunctions/GlobalTest.php
tests/phpunit/includes/HtmlTest.php
tests/phpunit/includes/MWTimestampTest.php
tests/phpunit/includes/MediaWikiServicesTest.php
tests/phpunit/includes/MessageTest.php
tests/phpunit/includes/OutputPageTest.php
tests/phpunit/includes/Services/ServiceContainerTest.php
tests/phpunit/includes/WatchedItemQueryServiceUnitTest.php
tests/phpunit/includes/WatchedItemStoreUnitTest.php
tests/phpunit/includes/WatchedItemUnitTest.php
tests/phpunit/includes/XmlTest.php
tests/phpunit/includes/api/ApiMainTest.php
tests/phpunit/includes/api/ApiPageSetTest.php
tests/phpunit/includes/auth/AbstractPrimaryAuthenticationProviderTest.php
tests/phpunit/includes/auth/AbstractSecondaryAuthenticationProviderTest.php
tests/phpunit/includes/auth/AuthManagerTest.php
tests/phpunit/includes/auth/AuthPluginPrimaryAuthenticationProviderTest.php
tests/phpunit/includes/auth/AuthenticationRequestTest.php
tests/phpunit/includes/auth/EmailNotificationSecondaryAuthenticationProviderTest.php
tests/phpunit/includes/auth/LegacyHookPreAuthenticationProviderTest.php
tests/phpunit/includes/auth/LocalPasswordPrimaryAuthenticationProviderTest.php
tests/phpunit/includes/auth/TemporaryPasswordPrimaryAuthenticationProviderTest.php
tests/phpunit/includes/auth/ThrottlePreAuthenticationProviderTest.php
tests/phpunit/includes/auth/ThrottlerTest.php
tests/phpunit/includes/changes/ChangesListBooleanFilterGroupTest.php
tests/phpunit/includes/changes/ChangesListBooleanFilterTest.php
tests/phpunit/includes/changes/ChangesListStringOptionsFilterGroupTest.php
tests/phpunit/includes/changes/RCCacheEntryFactoryTest.php
tests/phpunit/includes/changes/RecentChangeTest.php
tests/phpunit/includes/content/ContentHandlerTest.php
tests/phpunit/includes/content/FileContentHandlerTest.php
tests/phpunit/includes/content/TextContentHandlerTest.php
tests/phpunit/includes/content/WikitextContentHandlerTest.php
tests/phpunit/includes/db/DatabaseTest.php
tests/phpunit/includes/debug/logger/monolog/KafkaHandlerTest.php
tests/phpunit/includes/filerepo/FileBackendDBRepoWrapperTest.php
tests/phpunit/includes/filerepo/MigrateFileRepoLayoutTest.php
tests/phpunit/includes/filerepo/RepoGroupTest.php
tests/phpunit/includes/filerepo/file/FileTest.php
tests/phpunit/includes/http/HttpTest.php
tests/phpunit/includes/jobqueue/JobTest.php
tests/phpunit/includes/libs/CSSMinTest.php
tests/phpunit/includes/libs/DnsSrvDiscovererTest.php [new file with mode: 0644]
tests/phpunit/includes/libs/MemoizedCallableTest.php
tests/phpunit/includes/libs/ObjectFactoryTest.php
tests/phpunit/includes/libs/SamplingStatsdClientTest.php
tests/phpunit/includes/libs/objectcache/BagOStuffTest.php
tests/phpunit/includes/libs/objectcache/CachedBagOStuffTest.php
tests/phpunit/includes/libs/objectcache/HashBagOStuffTest.php
tests/phpunit/includes/libs/objectcache/WANObjectCacheTest.php
tests/phpunit/includes/libs/rdbms/connectionmanager/ConnectionManagerTest.php
tests/phpunit/includes/libs/rdbms/connectionmanager/SessionConsistentConnectionManagerTest.php
tests/phpunit/includes/linker/LinkRendererFactoryTest.php
tests/phpunit/includes/logging/DeleteLogFormatterTest.php
tests/phpunit/includes/mail/MailAddressTest.php
tests/phpunit/includes/objectcache/ObjectCacheTest.php [new file with mode: 0644]
tests/phpunit/includes/password/UserPasswordPolicyTest.php
tests/phpunit/includes/rcfeed/RCFeedIntegrationTest.php
tests/phpunit/includes/resourceloader/MessageBlobStoreTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderFileModuleTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderImageModuleTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderModuleTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderStartUpModuleTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderWikiModuleTest.php
tests/phpunit/includes/search/SearchEngineTest.php
tests/phpunit/includes/session/BotPasswordSessionProviderTest.php
tests/phpunit/includes/session/CookieSessionProviderTest.php
tests/phpunit/includes/session/ImmutableSessionProviderWithCookieTest.php
tests/phpunit/includes/session/SessionBackendTest.php
tests/phpunit/includes/session/SessionManagerTest.php
tests/phpunit/includes/session/SessionTest.php
tests/phpunit/includes/site/SiteExporterTest.php
tests/phpunit/includes/site/SiteImporterTest.php
tests/phpunit/includes/specialpage/AbstractChangesListSpecialPageTestCase.php
tests/phpunit/includes/specialpage/ChangesListSpecialPageTest.php
tests/phpunit/includes/specials/SpecialPreferencesTest.php
tests/phpunit/includes/specials/SpecialSearchTest.php
tests/phpunit/includes/specials/SpecialWatchlistTest.php
tests/phpunit/includes/title/NaiveImportTitleFactoryTest.php
tests/phpunit/includes/title/NamespaceImportTitleFactoryTest.php
tests/phpunit/includes/upload/UploadBaseTest.php
tests/phpunit/includes/user/BotPasswordTest.php
tests/phpunit/includes/user/PasswordResetTest.php
tests/phpunit/maintenance/MaintenanceTest.php
tests/phpunit/maintenance/backupTextPassTest.php
tests/phpunit/mocks/MockChangesListFilter.php
tests/phpunit/tests/MediaWikiTestCaseTest.php
tests/qunit/data/testrunner.js
tests/qunit/suites/resources/jquery/jquery.placeholder.test.js
tests/qunit/suites/resources/jquery/jquery.textSelection.test.js
tests/qunit/suites/resources/mediawiki.rcfilters/dm.FilterItem.test.js
tests/qunit/suites/resources/mediawiki.rcfilters/dm.FiltersViewModel.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.loader.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.toc.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.util.test.js
tests/qunit/suites/resources/startup.test.js
tests/selenium/.eslintrc.json [new file with mode: 0644]
tests/selenium/README.md [new file with mode: 0644]
tests/selenium/pageobjects/createaccount.page.js [new file with mode: 0644]
tests/selenium/pageobjects/edit.page.js [new file with mode: 0644]
tests/selenium/pageobjects/history.page.js [new file with mode: 0644]
tests/selenium/pageobjects/page.js [new file with mode: 0644]
tests/selenium/pageobjects/preferences.page.js [new file with mode: 0644]
tests/selenium/pageobjects/userlogin.page.js [new file with mode: 0644]
tests/selenium/pageobjects/userlogout.page.js [new file with mode: 0644]
tests/selenium/specs/page.js [new file with mode: 0644]
tests/selenium/specs/user.js [new file with mode: 0644]
tests/selenium/wdio.conf.jenkins.js [new file with mode: 0644]
tests/selenium/wdio.conf.js [new file with mode: 0644]
thumb.php

index b2c4d45..a82ae21 100644 (file)
@@ -72,3 +72,4 @@ Thumbs.db
 /.htaccess
 /.htpasswd
 /tests/phan/issues
+*.rej
index 5e2c7a0..baf7f03 100644 (file)
@@ -31,6 +31,11 @@ matrix:
       php: hhvm-3.12
     - env: dbtype=mysql dbuser=root
       php: 7
+  allow_failures:
+    # Postgres support for unit tests is still buggy
+    # https://phabricator.wikimedia.org/T75174
+    - env: dbtype=postgres dbuser=travis
+      php: 5.5
 
 services:
   - mysql
diff --git a/CREDITS b/CREDITS
index 6a51e08..80d4e0e 100644 (file)
--- a/CREDITS
+++ b/CREDITS
@@ -434,6 +434,7 @@ The following list can be found parsed under Special:Version/Credits -->
 * MrBlueSky
 * MrPete
 * Mukunda Modell
+* MusikAnimal
 * Mwalker
 * mwjames
 * mybugs.mail
index 0e1c8cb..6c56772 100644 (file)
@@ -4,6 +4,7 @@ module.exports = function ( grunt ) {
 
        var wgServer = process.env.MW_SERVER,
                wgScriptPath = process.env.MW_SCRIPT_PATH,
+               WebdriverIOconfigFile,
                karmaProxy = {};
 
        grunt.loadNpmTasks( 'grunt-banana-checker' );
@@ -13,12 +14,19 @@ module.exports = function ( grunt ) {
        grunt.loadNpmTasks( 'grunt-jsonlint' );
        grunt.loadNpmTasks( 'grunt-karma' );
        grunt.loadNpmTasks( 'grunt-stylelint' );
+       grunt.loadNpmTasks( 'grunt-webdriver' );
 
        karmaProxy[ wgScriptPath ] = {
                target: wgServer + wgScriptPath,
                changeOrigin: true
        };
 
+       if ( process.env.JENKINS_HOME ) {
+               WebdriverIOconfigFile = './tests/selenium/wdio.conf.jenkins.js';
+       } else {
+               WebdriverIOconfigFile = './tests/selenium/wdio.conf.js';
+       }
+
        grunt.initConfig( {
                eslint: {
                        all: [
@@ -80,7 +88,7 @@ module.exports = function ( grunt ) {
                                } ],
                                logLevel: 'DEBUG',
                                frameworks: [ 'qunit' ],
-                               reporters: [ 'progress' ],
+                               reporters: [ 'mocha' ],
                                singleRun: true,
                                autoWatch: false,
                                // Some tests in extensions don't yield for more than the default 10s (T89075)
@@ -105,7 +113,15 @@ module.exports = function ( grunt ) {
                                        return require( 'path' ).join( dest, src.replace( 'resources/', '' ) );
                                }
                        }
+               },
+
+               // Configure WebdriverIO task
+               webdriver: {
+                       test: {
+                               configFile: WebdriverIOconfigFile
+                       }
                }
+
        } );
 
        grunt.registerTask( 'assert-mw-env', function () {
diff --git a/HISTORY b/HISTORY
index 7f365ac..c6ce06c 100644 (file)
--- a/HISTORY
+++ b/HISTORY
@@ -1,5 +1,44 @@
 Change notes from older releases. For current info see RELEASE-NOTES-1.29.
 
+= MediaWiki 1.28 =
+
+== MediaWiki 1.28.1 ==
+
+This is a security and maintenance release of the MediaWiki 1.28 branch.
+
+=== Changes since 1.28.0 ===
+
+* $wgRunJobsAsync is now false by default (T142751). This change only affects
+  wikis with $wgJobRunRate > 0.
+* Fix fatal from "WaitConditionLoop" not being found, experienced when a wiki has
+  more than one database server setup.
+* (T152717) Better escaping for PHP mail() command,
+* (T154670) A missing method causing the MySQL installer to fatal in rare
+  circumstances was restored.
+* (T154672) Un-deprecate ArticleAfterFetchContentObject hook.
+* (T158766) Avoid SQL error on MSSQL when using selectRowCount().
+* (T145635) Fix too long index error when installing with MSSQL.
+* (T156184) $wgRawHtml will no longer apply to internationalization messages.
+* (T160519) CACHE_ANYTHING will not be CACHE_ACCEL if no accelerator is installed.
+* (T154872) Fix incorrect ar_usertext_timestamp index names in new 1.28 installs.
+* (T109140) (T122209) SECURITY: Special:UserLogin and Special:Search allow redirect
+  to interwiki links.
+* (T144845) SECURITY: XSS in SearchHighlighter::highlightText() when
+  $wgAdvancedSearchHighlighting is true.
+* (T125177) SECURITY: API parameters may now be marked as "sensitive" to keep
+  their values out of the logs.
+* (T150044) SECURITY: "Mark all pages visited" on the watchlist now requires a CSRF
+  token.
+* (T156184) SECURITY: Escape content model/format url parameter in message.
+* (T151735) SECURITY: SVG filter evasion using default attribute values in DTD
+  declaration.
+* (T161453) SECURITY: LocalisationCache will no longer use the temporary directory
+  in it's fallback chain when trying to work out where to write the cache.
+* (T48143) SECURITY: Spam blacklist ineffective on encoded URLs inside file inclusion
+  syntax's link parameter.
+* (T108138) SECURITY: Sysops can undelete pages, although the page is protected against
+  it.
+
 == MediaWiki 1.28 ==
 
 === Changes since 1.28.0-rc1 ===
@@ -326,6 +365,49 @@ There's usually someone online in #mediawiki on irc.freenode.net.
 
 = MediaWiki 1.27 =
 
+== MediaWiki 1.27.2 ==
+This is a security and maintenance release of the MediaWiki 1.27 branch.
+
+ApiCreateAccount was removed in 1.27.0. It was incorrectly still marked as
+deprecated (rather than already removed) in the RELEASE-NOTES at the point 1.27.0
+was released.
+
+=== Changes since 1.27.1 ===
+
+* (T68404) CSS3 attr() function with url type argument is no longer allowed
+  in inline styles.
+* $wgRunJobsAsync is now false by default (T142751). This change only affects
+  wikis with $wgJobRunRate > 0.
+* (T152717) Better escaping for PHP mail() command
+* 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.
+* (T158766) Avoid SQL error on MSSQL when using selectRowCount()
+* (T145635) Fix too long index error when installing with MSSQL.
+* (T156184) $wgRawHtml will no longer apply to internationalization messages.
+* (T160519) CACHE_ANYTHING will not be CACHE_ACCEL if no accelerator is installed.
+* (T109140) (T122209) SECURITY: Special:UserLogin and Special:Search allow redirect
+  to interwiki links.
+* (T144845) SECURITY: XSS in SearchHighlighter::highlightText() when
+  $wgAdvancedSearchHighlighting is true.
+* (T125177) SECURITY: API parameters may now be marked as "sensitive" to keep
+  their values out of the logs.
+* (T150044) SECURITY: "Mark all pages visited" on the watchlist now requires a CSRF
+  token.
+* (T156184) SECURITY: Escape content model/format url parameter in message.
+* (T151735) SECURITY: SVG filter evasion using default attribute values in DTD
+  declaration.
+* (T161453) SECURITY: LocalisationCache will no longer use the temporary directory
+  in it's fallback chain when trying to work out where to write the cache.
+* (T48143) SECURITY: Spam blacklist ineffective on encoded URLs inside file inclusion
+  syntax's link parameter.
+* (T108138) SECURITY: Sysops can undelete pages, although the page is protected against
+  it.
+
 == MediaWiki 1.27.1 ==
 
 This is a maintenance release of the MediaWiki 1.27 branch.
@@ -2670,6 +2752,32 @@ of files that are no longer available follows.
 
 = MediaWiki 1.23 =
 
+== MediaWiki 1.23.16 ==
+This is a security and maintenance release of the MediaWiki 1.23 branch.
+
+=== Changes since 1.23.15 ===
+* (T68404) CSS3 attr() function with url type is no longer allowed
+  in inline styles.
+* (T156184) $wgRawHtml will no longer apply to internationalization messages.
+* 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.
+* (T109140) (T122209) SECURITY: Special:UserLogin and Special:Search allow redirect
+  to interwiki links.
+* (T144845) SECURITY: XSS in SearchHighlighter::highlightText() when
+  $wgAdvancedSearchHighlighting is true.
+* (T125177) SECURITY: API parameters may now be marked as "sensitive" to keep
+  their values out of the logs.
+* (T150044) SECURITY: "Mark all pages visited" on the watchlist now requires a CSRF
+  token.
+* (T156184) SECURITY: Escape content model/format url parameter in message.
+* (T151735) SECURITY: SVG filter evasion using default attribute values in DTD
+  declaration.
+* (T48143) SECURITY: Spam blacklist ineffective on encoded URLs inside file inclusion
+  syntax's link parameter.
+* (T108138) SECURITY: Sysops can undelete pages, although the page is protected against
+  it.
+
 == MediaWiki 1.23.15 ==
 
 This is a maintenance release of the MediaWiki 1.23 branch.
index 8eb1f89..4b7de88 100644 (file)
@@ -35,6 +35,8 @@ production.
 * (T156983) $wgRateLimitsExcludedIPs now accepts CIDR ranges as well as single IPs.
 * $wgDummyLanguageCodes is deprecated. Additional language code mappings may be
   added to $wgExtraLanguageCodes instead.
+* (T161453) LocalisationCache will no longer use the temporary directory in it's
+  fallback chain when trying to work out where to write the cache.
 
 === New features in 1.29 ===
 * (T5233) A cookie can now be set when a user is autoblocked, to track that user
@@ -63,14 +65,18 @@ production.
 === External library changes in 1.29 ===
 
 ==== Upgraded external libraries ====
-* Added wikimedia/timestamp v1.0.0.
 * Updated QUnit from v1.22.0 to v1.23.1.
-* Updated cssjanus from v1.1.2 to 1.1.3.
+* Updated cssjanus from v1.1.2 to v1.2.0.
 * Updated psr/log from v1.0.0 to v1.0.2.
 * Update Moment.js from v2.8.4 to v2.15.0.
-* Updated oyejorge/less.php from v1.7.0.10 to v1.7.0.13.
+* Updated oyejorge/less.php from v1.7.0.10 to v1.7.0.14.
+* Updated monolog from v1.18.2 to 1.22.1.
+* Updated wikimedia/composer-merge-plugin from v1.3.1 to v1.4.0.
+* Updated OOjs from v1.1.10 to v2.0.0.
 
 ==== New external libraries ====
+* Added wikimedia/timestamp v1.0.0.
+* Added wikimedia/remex-html v1.0.1.
 
 ==== Removed and replaced external libraries ====
 
@@ -80,6 +86,25 @@ production.
 * (T27187) Search suggestions based on jquery.suggestions will now correctly only
   highlight prefix matches in the results.
 * (T157035) "new mw.Uri()" was ignoring options when using default URI.
+* Special:Allpages can no longer be filtered by redirect in miser mode.
+* (T160519) CACHE_ANYTHING will not be CACHE_ACCEL if no accelerator is installed.
+* (T109140) (T122209) SECURITY: Special:UserLogin and Special:Search allow redirect
+  to interwiki links.
+* (T144845) SECURITY: XSS in SearchHighlighter::highlightText() when
+  $wgAdvancedSearchHighlighting is true.
+* (T125177) SECURITY: API parameters may now be marked as "sensitive" to keep
+  their values out of the logs.
+* (T150044) SECURITY: "Mark all pages visited" on the watchlist now requires a CSRF
+  token.
+* (T156184) SECURITY: Escape content model/format url parameter in message.
+* (T151735) SECURITY: SVG filter evasion using default attribute values in DTD
+  declaration.
+* (T161453) SECURITY: LocalisationCache will no longer use the temporary directory
+  in it's fallback chain when trying to work out where to write the cache.
+* (T48143) SECURITY: Spam blacklist ineffective on encoded URLs inside file inclusion
+  syntax's link parameter.
+* (T108138) SECURITY: Sysops can undelete pages, although the page is protected against
+  it.
 
 === Action API changes in 1.29 ===
 * Submitting sensitive authentication request parameters to action=login,
@@ -114,6 +139,9 @@ production.
 * action=purge now requires a POST.
 * There is a new `languagevariants` siprop for action=query&meta=siteinfo,
   which returns a list of languages with active LanguageConverter instances.
+* action=query&query=allpages will no longer filter redirects using a database
+  query in miser mode. This may result in less results being returned than were
+  requested.
 
 === Action API internal changes in 1.29 ===
 * New methods were added to ApiBase to handle errors and warnings using i18n
@@ -137,6 +165,8 @@ production.
   various methods now take a module path rather than a module name.
 * ApiMessageTrait::getApiCode() now strips 'apierror-' and 'apiwarn-' prefixes
   from the message key, and maps some message keys for backwards compatibility.
+* API parameters may now be marked as "sensitive" to keep their values out of
+  the logs.
 
 === Languages updated in 1.29 ===
 
@@ -154,6 +184,7 @@ changes to languages because of Phabricator reports.
   The new or reinstated language fallbacks are (after cs ↔ sk in 1.28):
   ca ↔ oc; hsb ↔ dsb; io → eo; mdf → ru; pnt → el; roa-tara → it; rup → ro;
   sh → bs, sr-el, hr.
+* (T137376) New language support: Atikamekw (atj).
 * (T155957) Talk Namespaces for Javanese language (jv) have been updated.
 
 ==== No fallback for Ukrainian ====
@@ -256,9 +287,26 @@ changes to languages because of Phabricator reports.
   signature).  Subclasses are likely to call at least doMainQuery
   (possibly both), but other classes might too, because they were
   public.
-
   Also, some related hooks were deprecated, but this is not yet a
   breaking change.
+* Removed 'jquery.arrowSteps' module. (deprecated since 1.28)
+* The 'jquery.autoEllipsis' ResourceLoader module is now deprecated.
+* WikiRevision::$fileIsTemp was deprecated.
+* WikiRevision::$importer was deprecated.
+* WikiRevision::$user was deprecated.
+* Article::getLastPurgeTimestamp(), WikiPage::getLastPurgeTimestamp(), and the
+  WikiPage::PURGE_* constants are deprecated, and the functions will always
+  return false. They were a hack for an issue that has since been fixed.
+* Hook 'EditPageBeforeEditChecks' is now deprecated. Instead use the new hook
+  'EditPageGetCheckboxesDefinition', or 'EditPage::showStandardInputs:options'
+  if you don't actually care about checkboxes and just want to add some HTML
+  to the page.
+* Selflinks are now rendered as href-less <a> tags with the class mw-selflink
+  rather than <strong> tags. The old class name, "selflink", was deprecated
+  and will be removed in a future release. (T160480)
+* (T156184) $wgRawHtml will no longer apply to internationalization messages.
+* Browser support for non-ES5 JavaScript browsers, including Android 2,
+  Opera <12.10, and Internet Explorer 9, was lowered from Grade A to Grade C.
 
 == Compatibility ==
 
index 4ffaa11..0c26811 100644 (file)
@@ -383,6 +383,7 @@ $wgAutoloadLocalClasses = [
        'Digit2Html' => __DIR__ . '/maintenance/language/digit2html.php',
        'DjVuHandler' => __DIR__ . '/includes/media/DjVu.php',
        'DjVuImage' => __DIR__ . '/includes/media/DjVuImage.php',
+       'DnsSrvDiscoverer' => __DIR__ . '/includes/libs/DnsSrvDiscoverer.php',
        'DoubleRedirectJob' => __DIR__ . '/includes/jobqueue/jobs/DoubleRedirectJob.php',
        'DoubleRedirectsPage' => __DIR__ . '/includes/specials/SpecialDoubleRedirects.php',
        'DoubleReplacer' => __DIR__ . '/includes/libs/replacers/DoubleReplacer.php',
@@ -426,6 +427,7 @@ $wgAutoloadLocalClasses = [
        'EnqueueableDataUpdate' => __DIR__ . '/includes/deferred/EnqueueableDataUpdate.php',
        'EraseArchivedFile' => __DIR__ . '/maintenance/eraseArchivedFile.php',
        'ErrorPageError' => __DIR__ . '/includes/exception/ErrorPageError.php',
+       'EtcdConfig' => __DIR__ . '/includes/config/EtcdConfig.php',
        'EventRelayer' => __DIR__ . '/includes/libs/eventrelayer/EventRelayer.php',
        'EventRelayerGroup' => __DIR__ . '/includes/EventRelayerGroup.php',
        'EventRelayerKafka' => __DIR__ . '/includes/libs/eventrelayer/EventRelayerKafka.php',
@@ -1318,6 +1320,7 @@ $wgAutoloadLocalClasses = [
        'SpecialAllPages' => __DIR__ . '/includes/specials/SpecialAllPages.php',
        'SpecialApiHelp' => __DIR__ . '/includes/specials/SpecialApiHelp.php',
        'SpecialApiSandbox' => __DIR__ . '/includes/specials/SpecialApiSandbox.php',
+       'SpecialAutoblockList' => __DIR__ . '/includes/specials/SpecialAutoblockList.php',
        'SpecialBlankpage' => __DIR__ . '/includes/specials/SpecialBlankpage.php',
        'SpecialBlock' => __DIR__ . '/includes/specials/SpecialBlock.php',
        'SpecialBlockList' => __DIR__ . '/includes/specials/SpecialBlockList.php',
@@ -1339,6 +1342,7 @@ $wgAutoloadLocalClasses = [
        'SpecialExpandTemplates' => __DIR__ . '/includes/specials/SpecialExpandTemplates.php',
        'SpecialExport' => __DIR__ . '/includes/specials/SpecialExport.php',
        'SpecialFilepath' => __DIR__ . '/includes/specials/SpecialFilepath.php',
+       'SpecialGoToInterwiki' => __DIR__ . '/includes/specials/SpecialGoToInterwiki.php',
        'SpecialImport' => __DIR__ . '/includes/specials/SpecialImport.php',
        'SpecialJavaScriptTest' => __DIR__ . '/includes/specials/SpecialJavaScriptTest.php',
        'SpecialLinkAccounts' => __DIR__ . '/includes/specials/SpecialLinkAccounts.php',
@@ -1591,14 +1595,17 @@ $wgAutoloadLocalClasses = [
        'Wikimedia\\Rdbms\\Blob' => __DIR__ . '/includes/libs/rdbms/encasing/Blob.php',
        'Wikimedia\\Rdbms\\ChronologyProtector' => __DIR__ . '/includes/libs/rdbms/ChronologyProtector.php',
        'Wikimedia\\Rdbms\\ConnectionManager' => __DIR__ . '/includes/libs/rdbms/connectionmanager/ConnectionManager.php',
+       'Wikimedia\\Rdbms\\DBConnRef' => __DIR__ . '/includes/libs/rdbms/database/DBConnRef.php',
        'Wikimedia\\Rdbms\\DBMasterPos' => __DIR__ . '/includes/libs/rdbms/database/position/DBMasterPos.php',
        'Wikimedia\\Rdbms\\DatabaseDomain' => __DIR__ . '/includes/libs/rdbms/database/DatabaseDomain.php',
        'Wikimedia\\Rdbms\\FakeResultWrapper' => __DIR__ . '/includes/libs/rdbms/database/resultwrapper/FakeResultWrapper.php',
        'Wikimedia\\Rdbms\\Field' => __DIR__ . '/includes/libs/rdbms/field/Field.php',
        'Wikimedia\\Rdbms\\IBlob' => __DIR__ . '/includes/libs/rdbms/encasing/IBlob.php',
+       'Wikimedia\\Rdbms\\IDatabase' => __DIR__ . '/includes/libs/rdbms/database/IDatabase.php',
        'Wikimedia\\Rdbms\\ILBFactory' => __DIR__ . '/includes/libs/rdbms/lbfactory/ILBFactory.php',
        'Wikimedia\\Rdbms\\ILoadBalancer' => __DIR__ . '/includes/libs/rdbms/loadbalancer/ILoadBalancer.php',
        'Wikimedia\\Rdbms\\ILoadMonitor' => __DIR__ . '/includes/libs/rdbms/loadmonitor/ILoadMonitor.php',
+       'Wikimedia\\Rdbms\\IMaintainableDatabase' => __DIR__ . '/includes/libs/rdbms/database/IMaintainableDatabase.php',
        'Wikimedia\\Rdbms\\IResultWrapper' => __DIR__ . '/includes/libs/rdbms/database/resultwrapper/IResultWrapper.php',
        'Wikimedia\\Rdbms\\LBFactory' => __DIR__ . '/includes/libs/rdbms/lbfactory/LBFactory.php',
        'Wikimedia\\Rdbms\\LBFactoryMulti' => __DIR__ . '/includes/libs/rdbms/lbfactory/LBFactoryMulti.php',
@@ -1610,6 +1617,7 @@ $wgAutoloadLocalClasses = [
        'Wikimedia\\Rdbms\\LoadMonitor' => __DIR__ . '/includes/libs/rdbms/loadmonitor/LoadMonitor.php',
        'Wikimedia\\Rdbms\\LoadMonitorMySQL' => __DIR__ . '/includes/libs/rdbms/loadmonitor/LoadMonitorMySQL.php',
        'Wikimedia\\Rdbms\\LoadMonitorNull' => __DIR__ . '/includes/libs/rdbms/loadmonitor/LoadMonitorNull.php',
+       'Wikimedia\\Rdbms\\MaintainableDBConnRef' => __DIR__ . '/includes/libs/rdbms/database/MaintainableDBConnRef.php',
        'Wikimedia\\Rdbms\\MssqlBlob' => __DIR__ . '/includes/libs/rdbms/encasing/MssqlBlob.php',
        'Wikimedia\\Rdbms\\MssqlField' => __DIR__ . '/includes/libs/rdbms/field/MssqlField.php',
        'Wikimedia\\Rdbms\\MssqlResultWrapper' => __DIR__ . '/includes/libs/rdbms/database/resultwrapper/MssqlResultWrapper.php',
index af8635a..81abe40 100644 (file)
@@ -17,7 +17,7 @@
        },
        "require": {
                "composer/semver": "1.4.2",
-               "cssjanus/cssjanus": "1.1.3",
+               "cssjanus/cssjanus": "1.2.0",
                "ext-ctype": "*",
                "ext-iconv": "*",
                "ext-json": "*",
                "ext-xml": "*",
                "liuggio/statsd-php-client": "1.0.18",
                "mediawiki/at-ease": "1.1.0",
-               "oojs/oojs-ui": "0.19.5",
-               "oyejorge/less.php": "1.7.0.13",
+               "oojs/oojs-ui": "0.20.2",
+               "oyejorge/less.php": "1.7.0.14",
                "php": ">=5.5.9",
                "psr/log": "1.0.2",
                "wikimedia/assert": "0.2.2",
                "wikimedia/base-convert": "1.0.1",
                "wikimedia/cdb": "1.4.1",
                "wikimedia/cldr-plural-rule-parser": "1.0.0",
-               "wikimedia/composer-merge-plugin": "1.3.1",
+               "wikimedia/composer-merge-plugin": "1.4.0",
                "wikimedia/html-formatter": "1.0.1",
                "wikimedia/ip-set": "1.1.0",
                "wikimedia/php-session-serializer": "1.0.4",
                "wikimedia/relpath": "1.0.3",
-               "wikimedia/remex-html": "1.0.0",
+               "wikimedia/remex-html": "1.0.1",
                "wikimedia/running-stat": "1.1.0",
                "wikimedia/scoped-callback": "1.0.0",
                "wikimedia/utfnormal": "1.1.0",
                "justinrainbow/json-schema": "~3.0",
                "mediawiki/mediawiki-codesniffer": "0.7.2",
                "jetbrains/phpstorm-stubs": "dev-master#1b9906084d6635456fcf3f3a01f0d7d5b99a578a",
-               "monolog/monolog": "~1.18.2",
+               "monolog/monolog": "~1.22.1",
                "nikic/php-parser": "2.1.0",
                "nmred/kafka-php": "0.1.5",
-               "phpunit/phpunit": "4.8.31",
+               "phpunit/phpunit": "4.8.35",
                "wikimedia/avro": "1.7.7",
                "hamcrest/hamcrest-php": "^2.0",
                "wmde/hamcrest-html-matchers": "^0.1.0",
-               "psy/psysh": "0.8.1"
+               "psy/psysh": "0.8.3"
        },
        "suggest": {
                "ext-apc": "Local data and opcode cache",
index f307f45..060af89 100644 (file)
@@ -736,7 +736,10 @@ $current: the reverted revision
 $create: Whether or not the restoration caused the page to be created (i.e. it
   didn't exist before).
 $comment: The comment associated with the undeletion.
-$oldPageId: ID of page previously deleted (from archive table)
+$oldPageId: ID of page previously deleted (from archive table). This ID will be used
+  for the restored page.
+$restoredPages: Set of page IDs that have revisions restored for this undelete,
+  with keys being page IDs and values are 'true'.
 
 'ArticleUndeleteLogEntry': When a log entry is generated but not yet saved.
 $pageArchive: the PageArchive object
@@ -1018,7 +1021,8 @@ RecentChangesLinked, and Watchlist).  Generally, you will want to construct
 new ChangesListBooleanFilter or ChangesListStringOptionsFilter objects.
 
 When constructing them, you specify which group they belong to.  You can reuse
-existing groups (accessed through $special->getFilterGroup), or create your own.
+existing groups (accessed through $special->getFilterGroup), or create your own
+(ChangesListBooleanFilterGroup or ChangesListStringOptionsFilterGroup).
 If you create new groups, you must register them with $special->registerFilterGroup.
 $special: ChangesListSpecialPage instance
 
@@ -1403,10 +1407,12 @@ textarea in the edit form.
 &$buttons: Array of edit buttons "Save", "Preview", "Live", and "Diff"
 &$tabindex: HTML tabindex of the last edit check/button
 
-'EditPageBeforeEditChecks': Allows modifying the edit checks below the textarea
-in the edit form.
+'EditPageBeforeEditChecks': DEPRECATED! Use 'EditPageGetCheckboxesDefinition' instead,
+or 'EditPage::showStandardInputs:options' if you don't actually care about checkboxes
+and just want to add some HTML to the page.
+Allows modifying the edit checks below the textarea in the edit form.
 &$editpage: The current EditPage object
-&$checks: Array of edit checks like "watch this page"/"minor edit"
+&$checks: Array of the HTML for edit checks like "watch this page"/"minor edit"
 &$tabindex: HTML tabindex of the last edit check/button
 
 'EditPageBeforeEditToolbar': Allows modifying the edit toolbar above the
@@ -1419,6 +1425,12 @@ $title: title of page being edited
 &$msg: localization message name, overridable. Default is either
   'copyrightwarning' or 'copyrightwarning2'.
 
+'EditPageGetCheckboxesDefinition': Allows modifying the edit checkboxes
+below the textarea in the edit form.
+$editpage: The current EditPage object
+&$checkboxes: Array of checkbox definitions. See EditPage::getCheckboxesDefinition()
+for the format.
+
 'EditPageGetDiffContent': Allow modifying the wikitext that will be used in
 "Show changes". Note that it is preferable to implement diff handling for
 different data types using the ContentHandler facility.
@@ -2300,6 +2312,10 @@ $page: the Page that was rendered.
 $title: the Title of the rendered page.
 $parserOutput: ParserOutput resulting from rendering the page.
 
+'OtherAutoblockLogLink': Get links to the autoblock log from extensions which
+autoblocks users and/or IP addresses too.
+&$otherBlockLink: An array with links to other autoblock logs
+
 'OtherBlockLogLink': Get links to the block log from extensions which blocks
 users and/or IP addresses too.
 &$otherBlockLink: An array with links to other block logs
@@ -2702,6 +2718,13 @@ variables from $wgResourceLoaderLESSVars are added. Can be used to add
 context-based variables.
 &$lessVars: array of variables already added
 
+'ResourceLoaderJqueryMsgModuleMagicWords': Called in
+ResourceLoaderJqueryMsgModule to allow adding magic words for jQueryMsg.
+The value should be a string, and they can depend only on the
+ResourceLoaderContext.
+$context: ResourceLoaderContext
+&$magicWords: Associative array mapping all-caps magic word to a string value
+
 'ResourceLoaderRegisterModules': Right before modules information is required,
 such as when responding to a resource
 loader request or generating HTML output.
@@ -3570,6 +3593,10 @@ $removed: Groups removed
 $performer: User who performed the change, false if via autopromotion
 $reason: The reason, if any, given by the user performing the change,
 false if via autopromotion.
+$oldUGMs: An associative array (group name => UserGroupMembership object) of
+the user's group memberships before the change.
+$newUGMs: An associative array (group name => UserGroupMembership object) of
+the user's current group memberships.
 
 'UserIsBlockedFrom': Check if a user is blocked from a specific page (for
 specific block exemptions).
index 1f4041b..b6b3ae0 100644 (file)
@@ -20,6 +20,7 @@
  * @file
  */
 
+use Wikimedia\Rdbms\IDatabase;
 use MediaWiki\MediaWikiServices;
 
 class Block {
@@ -1450,13 +1451,9 @@ class Block {
         * Set the 'BlockID' cookie to this block's ID and expiry time. The cookie's expiry will be
         * the same as the block's, to a maximum of 24 hours.
         *
-        * 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 ) {
+       public function setCookie( WebResponse $response ) {
                // Calculate the default expiry time.
                $maxExpiryTime = wfTimestamp( TS_MW, wfTimestamp() + ( 24 * 60 * 60 ) );
 
@@ -1467,12 +1464,21 @@ class Block {
                }
 
                // Set the cookie. Reformat the MediaWiki datetime as a Unix timestamp for the cookie.
-               $cookieValue = $setEmpty ? '' : $this->getCookieValue();
                $expiryValue = DateTime::createFromFormat( 'YmdHis', $expiryTime )->format( 'U' );
                $cookieOptions = [ 'httpOnly' => false ];
+               $cookieValue = $this->getCookieValue();
                $response->setCookie( 'BlockID', $cookieValue, $expiryValue, $cookieOptions );
        }
 
+       /**
+        * Unset the 'BlockID' cookie.
+        *
+        * @param WebResponse $response The response on which to unset the cookie.
+        */
+       public static function clearCookie( WebResponse $response ) {
+               $response->clearCookie( 'BlockID', [ 'httpOnly' => false ] );
+       }
+
        /**
         * Get the BlockID cookie's value for this block. This is usually the block ID concatenated
         * with an HMAC in order to avoid spoofing (T152951), but if wgSecretKey is not set will just
index 504b35f..595cf95 100644 (file)
@@ -20,6 +20,8 @@
  * @file
  */
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * The "CategoryFinder" class takes a list of articles, creates an internal
  * representation of all their parent categories (as well as parents of
index 31369b0..0205d70 100644 (file)
@@ -742,7 +742,13 @@ class CategoryViewer extends ContextSource {
                        $totalcnt = $rescnt;
                        $category = $this->cat;
                        DeferredUpdates::addCallableUpdate( function () use ( $category ) {
-                               $category->refreshCounts();
+                               # Avoid excess contention on the same category (T162121)
+                               $dbw = wfGetDB( DB_MASTER );
+                               $name = __METHOD__ . ':' . md5( $this->mName );
+                               $scopedLock = $dbw->getScopedLockAndFlush( $name, __METHOD__, 1 );
+                               if ( $scopedLock ) {
+                                       $category->refreshCounts();
+                               }
                        } );
                } else {
                        // Case 3: hopeless.  Don't give a total count at all.
index 192ad08..53a147b 100644 (file)
@@ -4173,7 +4173,7 @@ $wgMaxPPExpandDepth = 40;
  *
  * WARNING: Do not add 'file:' to this or internal file links will be broken.
  * Instead, if you want to support file links, add 'file://'. The same applies
- * to any other protocols with the same name as a namespace. See bug #44011 for
+ * to any other protocols with the same name as a namespace. See task T46011 for
  * more information.
  *
  * @see wfParseUrl
@@ -7394,6 +7394,19 @@ $wgJobQueueAggregator = [
        'class' => 'JobQueueAggregatorNull'
 ];
 
+/**
+ * Whether to include the number of jobs that are queued
+ * for the API's maxlag parameter.
+ * The total number of jobs will be divided by this to get an
+ * estimated second of maxlag. Typically bots backoff at maxlag=5,
+ * so setting this to the max number of jobs that should be in your
+ * queue divided by 5 should have the effect of stopping bots once
+ * that limit is hit.
+ *
+ * @since 1.29
+ */
+$wgJobQueueIncludeInMaxLagFactor = false;
+
 /**
  * Additional functions to be performed with updateSpecialPages.
  * Expensive Querypages are already updated.
index bd92ff0..6bc70ed 100644 (file)
@@ -24,6 +24,8 @@ require_once __DIR__ . '/libs/mime/defines.php';
 require_once __DIR__ . '/libs/rdbms/defines.php';
 require_once __DIR__ . '/compat/normal/UtfNormalDefines.php';
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * @defgroup Constants MediaWiki constants
  */
index c22125a..7bdc3bc 100644 (file)
@@ -1027,7 +1027,7 @@ class EditPage {
                        throw new ErrorPageError(
                                'editpage-invalidcontentmodel-title',
                                'editpage-invalidcontentmodel-text',
-                               [ $this->contentModel ]
+                               [ wfEscapeWikiText( $this->contentModel ) ]
                        );
                }
 
@@ -1035,7 +1035,10 @@ class EditPage {
                        throw new ErrorPageError(
                                'editpage-notsupportedcontentformat-title',
                                'editpage-notsupportedcontentformat-text',
-                               [ $this->contentFormat, ContentHandler::getLocalizedName( $this->contentModel ) ]
+                               [
+                                       wfEscapeWikiText( $this->contentFormat ),
+                                       wfEscapeWikiText( ContentHandler::getLocalizedName( $this->contentModel ) )
+                               ]
                        );
                }
 
@@ -2318,12 +2321,9 @@ class EditPage {
        }
 
        public function setHeaders() {
-               global $wgOut, $wgUser, $wgAjaxEditStash, $wgCookieSetOnAutoblock;
+               global $wgOut, $wgUser, $wgAjaxEditStash;
 
                $wgOut->addModules( 'mediawiki.action.edit' );
-               if ( $wgCookieSetOnAutoblock === true ) {
-                       $wgOut->addModules( 'mediawiki.user.blockcookie' );
-               }
                $wgOut->addModuleStyles( 'mediawiki.action.edit.styles' );
 
                if ( $wgUser->getOption( 'showtoolbar' ) ) {
@@ -2424,7 +2424,7 @@ class EditPage {
                # Show log extract when the user is currently blocked
                if ( $namespace == NS_USER || $namespace == NS_USER_TALK ) {
                        $username = explode( '/', $this->mTitle->getText(), 2 )[0];
-                       $user = User::newFromName( $username, false /* allow IP users*/ );
+                       $user = User::newFromName( $username, false /* allow IP users */ );
                        $ip = User::isIP( $username );
                        $block = Block::newFromTarget( $user, $user );
                        if ( !( $user && $user->isLoggedIn() ) && !$ip ) { # User does not exist
@@ -2633,7 +2633,7 @@ class EditPage {
                }
 
                // @todo add EditForm plugin interface and use it here!
-               //       search for textarea1 and textares2, and allow EditForm to override all uses.
+               //       search for textarea1 and textarea2, and allow EditForm to override all uses.
                $wgOut->addHTML( Html::openElement(
                        'form',
                        [
@@ -3061,6 +3061,7 @@ class EditPage {
         */
        protected function showSummaryInput( $isSubjectPreview, $summary = "" ) {
                global $wgOut;
+
                # Add a class if 'missingsummary' is triggered to allow styling of the summary line
                $summaryClass = $this->missingSummary ? 'mw-summarymissed' : 'mw-summary';
                if ( $isSubjectPreview ) {
@@ -3509,12 +3510,12 @@ HTML
 
                $message = $this->context->msg( 'edithelppage' )->inContentLanguage()->text();
                $edithelpurl = Skin::makeInternalOrExternalUrl( $message );
-               $attrs = [
-                       'target' => 'helpwindow',
-                       'href' => $edithelpurl,
-               ];
-               $edithelp = Html::linkButton( $this->context->msg( 'edithelp' )->text(),
-                       $attrs, [ 'mw-ui-quiet' ] ) .
+               $edithelp =
+                       Html::linkButton(
+                               $this->context->msg( 'edithelp' )->text(),
+                               [ 'target' => 'helpwindow', 'href' => $edithelpurl ],
+                               [ 'mw-ui-quiet' ]
+                       ) .
                        $this->context->msg( 'word-separator' )->escaped() .
                        $this->context->msg( 'newwindow' )->parse();
 
@@ -3574,18 +3575,16 @@ HTML
         */
        public function getCancelLink() {
                $cancelParams = [];
-               $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
                if ( !$this->isConflict && $this->oldid > 0 ) {
                        $cancelParams['oldid'] = $this->oldid;
                } elseif ( $this->getContextTitle()->isRedirect() ) {
                        $cancelParams['redirect'] = 'no';
                }
-               $attrs = [ 'id' => 'mw-editform-cancel' ];
 
-               return $linkRenderer->makeKnownLink(
+               return MediaWikiServices::getInstance()->getLinkRenderer()->makeKnownLink(
                        $this->getContextTitle(),
                        new HtmlArmor( $this->context->msg( 'cancel' )->parse() ),
-                       Html::buttonAttributes( $attrs, [ 'mw-ui-quiet' ] ),
+                       Html::buttonAttributes( [ 'id' => 'mw-editform-cancel' ], [ 'mw-ui-quiet' ] ),
                        $cancelParams
                );
        }
@@ -4009,72 +4008,114 @@ HTML
                return $toolbar;
        }
 
+       /**
+        * Return an array of checkbox definitions.
+        *
+        * Array keys correspond to the `<input>` 'name' attribute to use for each checkbox.
+        *
+        * Array values are associative arrays with the following keys:
+        *  - 'label-message' (required): message for label text
+        *  - 'id' (required): 'id' attribute for the `<input>`
+        *  - 'default' (required): default checkedness (true or false)
+        *  - 'title-message' (optional): used to generate 'title' attribute for the `<label>`
+        *  - 'tooltip' (optional): used to generate 'title' and 'accesskey' attributes
+        *    from messages like 'tooltip-foo', 'accesskey-foo'
+        *  - 'label-id' (optional): 'id' attribute for the `<label>`
+        *  - 'legacy-name' (optional): short name for backwards-compatibility
+        * @param array $checked Array of checkbox name (matching the 'legacy-name') => bool,
+        *   where bool indicates the checked status of the checkbox
+        * @return array
+        */
+       protected function getCheckboxesDefinition( $checked ) {
+               global $wgUser;
+               $checkboxes = [];
+
+               // don't show the minor edit checkbox if it's a new page or section
+               if ( !$this->isNew && $wgUser->isAllowed( 'minoredit' ) ) {
+                       $checkboxes['wpMinoredit'] = [
+                               'id' => 'wpMinoredit',
+                               'label-message' => 'minoredit',
+                               // Uses messages: tooltip-minoredit, accesskey-minoredit
+                               'tooltip' => 'minoredit',
+                               'label-id' => 'mw-editpage-minoredit',
+                               'legacy-name' => 'minor',
+                               'default' => $checked['minor'],
+                       ];
+               }
+
+               if ( $wgUser->isLoggedIn() ) {
+                       $checkboxes['wpWatchthis'] = [
+                               'id' => 'wpWatchthis',
+                               'label-message' => 'watchthis',
+                               // Uses messages: tooltip-watch, accesskey-watch
+                               'tooltip' => 'watch',
+                               'label-id' => 'mw-editpage-watch',
+                               'legacy-name' => 'watch',
+                               'default' => $checked['watch'],
+                       ];
+               }
+
+               $editPage = $this;
+               Hooks::run( 'EditPageGetCheckboxesDefinition', [ $editPage, &$checkboxes ] );
+
+               return $checkboxes;
+       }
+
        /**
         * Returns an array of html code of the following checkboxes:
         * minor and watch
         *
         * @param int $tabindex Current tabindex
-        * @param array $checked Array of checkbox => bool, where bool indicates the checked
-        *                 status of the checkbox
-        *
+        * @param array $checked See getCheckboxesDefinition()
         * @return array
         */
        public function getCheckboxes( &$tabindex, $checked ) {
-               global $wgUser, $wgUseMediaWikiUIEverywhere;
+               global $wgUseMediaWikiUIEverywhere;
 
                $checkboxes = [];
+               $checkboxesDef = $this->getCheckboxesDefinition( $checked );
 
-               // don't show the minor edit checkbox if it's a new page or section
+               // Backwards-compatibility for the EditPageBeforeEditChecks hook
                if ( !$this->isNew ) {
                        $checkboxes['minor'] = '';
-                       $minorLabel = $this->context->msg( 'minoredit' )->parse();
-                       if ( $wgUser->isAllowed( 'minoredit' ) ) {
-                               $attribs = [
-                                       'tabindex' => ++$tabindex,
-                                       'accesskey' => $this->context->msg( 'accesskey-minoredit' )->text(),
-                                       'id' => 'wpMinoredit',
-                               ];
-                               $minorEditHtml =
-                                       Xml::check( 'wpMinoredit', $checked['minor'], $attribs ) .
-                                       "&#160;<label for='wpMinoredit' id='mw-editpage-minoredit'" .
-                                       Xml::expandAttributes( [ 'title' => Linker::titleAttrib( 'minoredit', 'withaccess' ) ] ) .
-                                       ">{$minorLabel}</label>";
-
-                               if ( $wgUseMediaWikiUIEverywhere ) {
-                                       $checkboxes['minor'] = Html::openElement( 'div', [ 'class' => 'mw-ui-checkbox' ] ) .
-                                               $minorEditHtml .
-                                       Html::closeElement( 'div' );
-                               } else {
-                                       $checkboxes['minor'] = $minorEditHtml;
-                               }
-                       }
                }
-
-               $watchLabel = $this->context->msg( 'watchthis' )->parse();
                $checkboxes['watch'] = '';
-               if ( $wgUser->isLoggedIn() ) {
+
+               foreach ( $checkboxesDef as $name => $options ) {
+                       $legacyName = isset( $options['legacy-name'] ) ? $options['legacy-name'] : $name;
+                       $label = $this->context->msg( $options['label-message'] )->parse();
                        $attribs = [
                                'tabindex' => ++$tabindex,
-                               'accesskey' => $this->context->msg( 'accesskey-watch' )->text(),
-                               'id' => 'wpWatchthis',
+                               'id' => $options['id'],
+                       ];
+                       $labelAttribs = [
+                               'for' => $options['id'],
                        ];
-                       $watchThisHtml =
-                               Xml::check( 'wpWatchthis', $checked['watch'], $attribs ) .
-                               "&#160;<label for='wpWatchthis' id='mw-editpage-watch'" .
-                               Xml::expandAttributes( [ 'title' => Linker::titleAttrib( 'watch', 'withaccess' ) ] ) .
-                               ">{$watchLabel}</label>";
+                       if ( isset( $options['tooltip'] ) ) {
+                               $attribs['accesskey'] = $this->context->msg( "accesskey-{$options['tooltip']}" )->text();
+                               $labelAttribs['title'] = Linker::titleAttrib( $options['tooltip'], 'withaccess' );
+                       }
+                       if ( isset( $options['title-message'] ) ) {
+                               $labelAttribs['title'] = $this->context->msg( $options['title-message'] )->text();
+                       }
+                       if ( isset( $options['label-id'] ) ) {
+                               $labelAttribs['id'] = $options['label-id'];
+                       }
+                       $checkboxHtml =
+                               Xml::check( $name, $options['default'], $attribs ) .
+                               '&#160;' .
+                               Xml::tags( 'label', $labelAttribs, $label );
+
                        if ( $wgUseMediaWikiUIEverywhere ) {
-                               $checkboxes['watch'] = Html::openElement( 'div', [ 'class' => 'mw-ui-checkbox' ] ) .
-                                       $watchThisHtml .
-                                       Html::closeElement( 'div' );
-                       } else {
-                               $checkboxes['watch'] = $watchThisHtml;
+                               $checkboxHtml = Html::rawElement( 'div', [ 'class' => 'mw-ui-checkbox' ], $checkboxHtml );
                        }
+
+                       $checkboxes[ $legacyName ] = $checkboxHtml;
                }
 
                // Avoid PHP 7.1 warning of passing $this by reference
                $editPage = $this;
-               Hooks::run( 'EditPageBeforeEditChecks', [ &$editPage, &$checkboxes, &$tabindex ] );
+               Hooks::run( 'EditPageBeforeEditChecks', [ &$editPage, &$checkboxes, &$tabindex ], '1.29' );
                return $checkboxes;
        }
 
@@ -4098,34 +4139,41 @@ HTML
                } else {
                        $buttonLabelKey = !$this->mTitle->exists() ? 'savearticle' : 'savechanges';
                }
-               $buttonLabel = $this->context->msg( $buttonLabelKey )->text();
                $attribs = [
                        'id' => 'wpSave',
                        'name' => 'wpSave',
                        'tabindex' => ++$tabindex,
                ] + Linker::tooltipAndAccesskeyAttribs( 'save' );
-               $buttons['save'] = Html::submitButton( $buttonLabel, $attribs, [ 'mw-ui-progressive' ] );
+               $buttons['save'] = Html::submitButton(
+                       $this->context->msg( $buttonLabelKey )->text(),
+                       $attribs,
+                       [ 'mw-ui-progressive' ]
+               );
 
-               ++$tabindex; // use the same for preview and live preview
                $attribs = [
                        'id' => 'wpPreview',
                        'name' => 'wpPreview',
-                       'tabindex' => $tabindex,
+                       'tabindex' => ++$tabindex,
                ] + Linker::tooltipAndAccesskeyAttribs( 'preview' );
-               $buttons['preview'] = Html::submitButton( $this->context->msg( 'showpreview' )->text(),
-                       $attribs );
+               $buttons['preview'] = Html::submitButton(
+                       $this->context->msg( 'showpreview' )->text(),
+                       $attribs
+               );
 
                $attribs = [
                        'id' => 'wpDiff',
                        'name' => 'wpDiff',
                        'tabindex' => ++$tabindex,
                ] + Linker::tooltipAndAccesskeyAttribs( 'diff' );
-               $buttons['diff'] = Html::submitButton( $this->context->msg( 'showdiff' )->text(),
-                       $attribs );
+               $buttons['diff'] = Html::submitButton(
+                       $this->context->msg( 'showdiff' )->text(),
+                       $attribs
+               );
 
                // Avoid PHP 7.1 warning of passing $this by reference
                $editPage = $this;
                Hooks::run( 'EditPageBeforeEditButtons', [ &$editPage, &$buttons, &$tabindex ] );
+
                return $buttons;
        }
 
index 0c8d1c6..bed9957 100644 (file)
@@ -164,10 +164,10 @@ class Linker {
        }
 
        /**
-        * Make appropriate markup for a link to the current article. This is
-        * currently rendered as the bold link text. The calling sequence is the
-        * same as the other make*LinkObj static functions, despite $query not
-        * being used.
+        * Make appropriate markup for a link to the current article. This is since
+        * MediaWiki 1.29.0 rendered as an <a> tag without an href and with a class
+        * showing the link text. The calling sequence is the same as for the other
+        * make*LinkObj static functions, but $query is not used.
         *
         * @since 1.16.3
         * @param Title $nt
@@ -179,7 +179,7 @@ class Linker {
         * @return string
         */
        public static function makeSelfLinkObj( $nt, $html = '', $query = '', $trail = '', $prefix = '' ) {
-               $ret = "<strong class=\"selflink\">{$prefix}{$html}</strong>{$trail}";
+               $ret = "<a class=\"mw-selflink selflink\">{$prefix}{$html}</a>{$trail}";
                if ( !Hooks::run( 'SelfLinkBegin', [ $nt, &$html, &$trail, &$prefix, &$ret ] ) ) {
                        return $ret;
                }
@@ -188,7 +188,7 @@ class Linker {
                        $html = htmlspecialchars( $nt->getPrefixedText() );
                }
                list( $inside, $trail ) = self::splitTrail( $trail );
-               return "<strong class=\"selflink\">{$prefix}{$html}{$inside}</strong>{$trail}";
+               return "<a class=\"mw-selflink selflink\">{$prefix}{$html}{$inside}</a>{$trail}";
        }
 
        /**
@@ -1561,7 +1561,7 @@ class Linker {
                $title = wfMessage( 'toc' )->inLanguage( $lang )->escaped();
 
                return '<div id="toc" class="toc">'
-                       . '<div id="toctitle"><h2>' . $title . "</h2></div>\n"
+                       . '<div id="toctitle" class="toctitle"><h2>' . $title . "</h2></div>\n"
                        . $toc
                        . "</ul>\n</div>\n";
        }
index 521c02c..ef0563e 100644 (file)
@@ -21,6 +21,7 @@
  */
 
 use MediaWiki\Logger\LoggerFactory;
+use Psr\Log\LoggerInterface;
 use MediaWiki\MediaWikiServices;
 use Wikimedia\Rdbms\ChronologyProtector;
 use Wikimedia\Rdbms\LBFactory;
@@ -942,24 +943,45 @@ class MediaWiki {
                        $n = intval( $jobRunRate );
                }
 
-               $runJobsLogger = LoggerFactory::getInstance( 'runJobs' );
+               $logger = LoggerFactory::getInstance( 'runJobs' );
 
-               // Fall back to running the job(s) while the user waits if needed
-               if ( !$this->config->get( 'RunJobsAsync' ) ) {
-                       $runner = new JobRunner( $runJobsLogger );
-                       $runner->run( [ 'maxJobs' => $n ] );
-                       return;
-               }
-
-               // Do not send request if there are probably no jobs
                try {
-                       $group = JobQueueGroup::singleton();
-                       if ( !$group->queuesHaveJobs( JobQueueGroup::TYPE_DEFAULT ) ) {
-                               return;
+                       if ( $this->config->get( 'RunJobsAsync' ) ) {
+                               // Send an HTTP request to the job RPC entry point if possible
+                               $invokedWithSuccess = $this->triggerAsyncJobs( $n, $logger );
+                               if ( !$invokedWithSuccess ) {
+                                       // Fall back to blocking on running the job(s)
+                                       $logger->warning( "Jobs switched to blocking; Special:RunJobs disabled" );
+                                       $this->triggerSyncJobs( $n, $logger );
+                               }
+                       } else {
+                               $this->triggerSyncJobs( $n, $logger );
                        }
                } catch ( JobQueueError $e ) {
+                       // Do not make the site unavailable (T88312)
                        MWExceptionHandler::logException( $e );
-                       return; // do not make the site unavailable
+               }
+       }
+
+       /**
+        * @param integer $n Number of jobs to try to run
+        * @param LoggerInterface $runJobsLogger
+        */
+       private function triggerSyncJobs( $n, LoggerInterface $runJobsLogger ) {
+               $runner = new JobRunner( $runJobsLogger );
+               $runner->run( [ 'maxJobs' => $n ] );
+       }
+
+       /**
+        * @param integer $n Number of jobs to try to run
+        * @param LoggerInterface $runJobsLogger
+        * @return bool Success
+        */
+       private function triggerAsyncJobs( $n, LoggerInterface $runJobsLogger ) {
+               // Do not send request if there are probably no jobs
+               $group = JobQueueGroup::singleton();
+               if ( !$group->queuesHaveJobs( JobQueueGroup::TYPE_DEFAULT ) ) {
+                       return true;
                }
 
                $query = [ 'title' => 'Special:RunJobs',
@@ -1026,12 +1048,6 @@ class MediaWiki {
                        $runJobsLogger->error( "Failed to start cron API (socket error $errno): $errstr" );
                }
 
-               // Fall back to running the job(s) while the user waits if needed
-               if ( !$invokedWithSuccess ) {
-                       $runJobsLogger->warning( "Jobs switched to blocking; Special:RunJobs disabled" );
-
-                       $runner = new JobRunner( $runJobsLogger );
-                       $runner->run( [ 'maxJobs'  => $n ] );
-               }
+               return $invokedWithSuccess;
        }
 }
index 8cf3af1..cc589c9 100644 (file)
@@ -25,6 +25,7 @@
  * @file
  */
 use Wikimedia\Timestamp\TimestampException;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * Handles the backend logic of merging the histories of two
index 9ecfa23..a25ea9c 100644 (file)
@@ -1568,6 +1568,7 @@ class OutputPage extends ContextSource {
                        // been changed somehow, and keep it if so.
                        $anonPO = ParserOptions::newFromAnon();
                        $anonPO->setEditSection( false );
+                       $anonPO->setAllowUnsafeRawHtml( false );
                        if ( !$options->matches( $anonPO ) ) {
                                wfLogWarning( __METHOD__ . ': Setting a changed bogus ParserOptions: ' . wfGetAllCallers( 5 ) );
                                $options->isBogus = false;
@@ -1581,6 +1582,7 @@ class OutputPage extends ContextSource {
                                // either.
                                $po = ParserOptions::newFromAnon();
                                $po->setEditSection( false );
+                               $po->setAllowUnsafeRawHtml( false );
                                $po->isBogus = true;
                                if ( $options !== null ) {
                                        $this->mParserOptions = empty( $options->isBogus ) ? $options : null;
@@ -1590,6 +1592,7 @@ class OutputPage extends ContextSource {
 
                        $this->mParserOptions = ParserOptions::newFromContext( $this->getContext() );
                        $this->mParserOptions->setEditSection( false );
+                       $this->mParserOptions->setAllowUnsafeRawHtml( false );
                }
 
                if ( $options !== null && !empty( $options->isBogus ) ) {
@@ -2367,6 +2370,11 @@ class OutputPage extends ContextSource {
                if ( $this->mArticleBodyOnly ) {
                        echo $this->mBodytext;
                } else {
+                       // Enable safe mode if requested
+                       if ( $this->getRequest()->getBool( 'safemode' ) ) {
+                               $this->disallowUserJs();
+                       }
+
                        $sk = $this->getSkin();
                        // add skin specific modules
                        $modules = $sk->getDefaultModules();
@@ -2724,7 +2732,9 @@ class OutputPage extends ContextSource {
                } else {
                        $titleObj = Title::newFromText( $returnto );
                }
-               if ( !is_object( $titleObj ) ) {
+               // We don't want people to return to external interwiki. That
+               // might potentially be used as part of a phishing scheme
+               if ( !is_object( $titleObj ) || $titleObj->isExternal() ) {
                        $titleObj = Title::newMainPage();
                }
 
index dca2e1b..bae974f 100644 (file)
@@ -19,6 +19,8 @@
  *
  * @file
  */
+
+use Wikimedia\Rdbms\IDatabase;
 use MediaWiki\Linker\LinkTarget;
 use MediaWiki\MediaWikiServices;
 use Wikimedia\Rdbms\ResultWrapper;
@@ -1279,12 +1281,15 @@ class Revision implements IDBAccessObject {
                        if ( isset( $row->old_id ) && $wiki === false ) {
                                // Make use of the wiki-local revision text cache
                                $cache = MediaWikiServices::getInstance()->getMainWANObjectCache();
-                               $text = $cache->getWithSetCallback(
+                               // The cached value should be decompressed, so handle that and return here
+                               return $cache->getWithSetCallback(
                                        $cache->makeKey( 'revisiontext', 'textid', $row->old_id ),
                                        self::getCacheTTL( $cache ),
-                                       function () use ( $url, $wiki ) {
+                                       function () use ( $url, $wiki, $flags ) {
                                                // No negative caching per Revision::loadText()
-                                               return ExternalStore::fetchFromURL( $url, [ 'wiki' => $wiki ] );
+                                               $text = ExternalStore::fetchFromURL( $url, [ 'wiki' => $wiki ] );
+
+                                               return self::decompressRevisionText( $text, $flags );
                                        },
                                        [ 'pcGroup' => self::TEXT_CACHE_GROUP, 'pcTTL' => $cache::TTL_PROC_LONG ]
                                );
@@ -1293,12 +1298,7 @@ class Revision implements IDBAccessObject {
                        }
                }
 
-               // If the text was fetched without an error, convert it
-               if ( $text !== false ) {
-                       $text = self::decompressRevisionText( $text, $flags );
-               }
-
-               return $text;
+               return self::decompressRevisionText( $text, $flags );
        }
 
        /**
@@ -1344,6 +1344,13 @@ class Revision implements IDBAccessObject {
         * @return string|bool Decompressed text, or false on failure
         */
        public static function decompressRevisionText( $text, $flags ) {
+               global $wgLegacyEncoding, $wgContLang;
+
+               if ( $text === false ) {
+                       // Text failed to be fetched; nothing to do
+                       return false;
+               }
+
                if ( in_array( 'gzip', $flags ) ) {
                        # Deal with optional compression of archived pages.
                        # This can be done periodically via maintenance/compressOld.php, and
@@ -1366,7 +1373,6 @@ class Revision implements IDBAccessObject {
                        $text = $obj->getText();
                }
 
-               global $wgLegacyEncoding;
                if ( $text !== false && $wgLegacyEncoding
                        && !in_array( 'utf-8', $flags ) && !in_array( 'utf8', $flags )
                ) {
@@ -1374,7 +1380,6 @@ class Revision implements IDBAccessObject {
                        # Upconvert on demand.
                        # ("utf8" checked for compatibility with some broken
                        #  conversion scripts 2008-12-30)
-                       global $wgContLang;
                        $text = $wgContLang->iconv( $wgLegacyEncoding, 'UTF-8', $text );
                }
 
index d909a65..ccdedb8 100644 (file)
@@ -22,6 +22,7 @@
 
 use MediaWiki\MediaWikiServices;
 use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * List for revision table items for a single page
@@ -36,7 +37,7 @@ abstract class RevisionListBase extends ContextSource implements Iterator {
        /** @var ResultWrapper|bool */
        protected $res;
 
-       /** @var bool|object */
+       /** @var bool|Revision */
        protected $current;
 
        /**
index 105a581..bc6b842 100644 (file)
@@ -20,6 +20,8 @@
  * @file
  */
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * Static accessor class for site_stats and related things
  */
index a5bb9c6..0db4094 100644 (file)
@@ -21,6 +21,8 @@
  *
  * @file
  */
+
+use Wikimedia\Rdbms\IDatabase;
 use MediaWiki\Linker\LinkTarget;
 use MediaWiki\Interwiki\InterwikiLookup;
 use MediaWiki\MediaWikiServices;
@@ -1681,6 +1683,33 @@ class Title implements LinkTarget {
                return $url;
        }
 
+       /**
+        * Get a url appropriate for making redirects based on an untrusted url arg
+        *
+        * This is basically the same as getFullUrl(), but in the case of external
+        * interwikis, we send the user to a landing page, to prevent possible
+        * phishing attacks and the like.
+        *
+        * @note Uses current protocol by default, since technically relative urls
+        *   aren't allowed in redirects per HTTP spec, so this is not suitable for
+        *   places where the url gets cached, as might pollute between
+        *   https and non-https users.
+        * @see self::getLocalURL for the arguments.
+        * @param array|string $query
+        * @param string $proto Protocol type to use in URL
+        * @return String. A url suitable to use in an HTTP location header.
+        */
+       public function getFullUrlForRedirect( $query = '', $proto = PROTO_CURRENT ) {
+               $target = $this;
+               if ( $this->isExternal() ) {
+                       $target = SpecialPage::getTitleFor(
+                               'GoToInterwiki',
+                               $this->getPrefixedDBKey()
+                       );
+               }
+               return $target->getFullUrl( $query, false, $proto );
+       }
+
        /**
         * Get a URL with no fragment or server name (relative URL) from a Title object.
         * If this page is generated with action=render, however,
@@ -2287,6 +2316,17 @@ class Title implements LinkTarget {
                        ) {
                                $errors[] = [ 'delete-toobig', $wgLang->formatNum( $wgDeleteRevisionsLimit ) ];
                        }
+               } elseif ( $action === 'undelete' ) {
+                       if ( count( $this->getUserPermissionsErrorsInternal( 'edit', $user, $rigor, true ) ) ) {
+                               // Undeleting implies editing
+                               $errors[] = [ 'undelete-cantedit' ];
+                       }
+                       if ( !$this->exists()
+                               && count( $this->getUserPermissionsErrorsInternal( 'create', $user, $rigor, true ) )
+                       ) {
+                               // Undeleting where nothing currently exists implies creating
+                               $errors[] = [ 'undelete-cantcreate' ];
+                       }
                }
                return $errors;
        }
@@ -3961,14 +4001,22 @@ class Title implements LinkTarget {
         * @return int|bool Old revision ID, or false if none exists
         */
        public function getPreviousRevisionID( $revId, $flags = 0 ) {
-               $db = ( $flags & self::GAID_FOR_UPDATE ) ? wfGetDB( DB_MASTER ) : wfGetDB( DB_REPLICA );
+               /* This function and getNextRevisionID have bad performance when
+                  used on a page with many revisions on mysql. An explicit extended
+                  primary key may help in some cases, if the PRIMARY KEY is banned:
+                  T159319 */
+               if ( $flags & self::GAID_FOR_UPDATE ) {
+                       $db = wfGetDB( DB_MASTER );
+               } else {
+                       $db = wfGetDB( DB_REPLICA, 'contributions' );
+               }
                $revId = $db->selectField( 'revision', 'rev_id',
                        [
                                'rev_page' => $this->getArticleID( $flags ),
                                'rev_id < ' . intval( $revId )
                        ],
                        __METHOD__,
-                       [ 'ORDER BY' => 'rev_id DESC' ]
+                       [ 'ORDER BY' => 'rev_id DESC', 'IGNORE INDEX' => 'PRIMARY' ]
                );
 
                if ( $revId === false ) {
@@ -3986,14 +4034,18 @@ class Title implements LinkTarget {
         * @return int|bool Next revision ID, or false if none exists
         */
        public function getNextRevisionID( $revId, $flags = 0 ) {
-               $db = ( $flags & self::GAID_FOR_UPDATE ) ? wfGetDB( DB_MASTER ) : wfGetDB( DB_REPLICA );
+               if ( $flags & self::GAID_FOR_UPDATE ) {
+                       $db = wfGetDB( DB_MASTER );
+               } else {
+                       $db = wfGetDB( DB_REPLICA, 'contributions' );
+               }
                $revId = $db->selectField( 'revision', 'rev_id',
                        [
                                'rev_page' => $this->getArticleID( $flags ),
                                'rev_id > ' . intval( $revId )
                        ],
                        __METHOD__,
-                       [ 'ORDER BY' => 'rev_id' ]
+                       [ 'ORDER BY' => 'rev_id', 'IGNORE INDEX' => 'PRIMARY' ]
                );
 
                if ( $revId === false ) {
@@ -4016,7 +4068,10 @@ class Title implements LinkTarget {
                        $row = $db->selectRow( 'revision', Revision::selectFields(),
                                [ 'rev_page' => $pageId ],
                                __METHOD__,
-                               [ 'ORDER BY' => 'rev_timestamp ASC', 'LIMIT' => 1 ]
+                               [
+                                       'ORDER BY' => 'rev_timestamp ASC',
+                                       'IGNORE INDEX' => 'rev_timestamp'
+                               ]
                        );
                        if ( $row ) {
                                return new Revision( $row );
index 825860a..a9ebd76 100644 (file)
@@ -45,6 +45,7 @@ class TrackingCategories {
                'expansion-depth-exceeded-category',
                'restricted-displaytitle-ignored',
                'deprecated-self-close-category',
+               'template-loop-category',
        ];
 
        /**
index bc57049..ba77074 100644 (file)
@@ -1,5 +1,6 @@
 <?php
 
+use Wikimedia\Rdbms\IDatabase;
 use MediaWiki\Linker\LinkTarget;
 use Wikimedia\Assert\Assert;
 use Wikimedia\Rdbms\LoadBalancer;
index 6301576..93d5033 100644 (file)
@@ -1,6 +1,7 @@
 <?php
 
 use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * Extension mechanism for WatchedItemQueryService
index 9af5310..70fdbf1 100644 (file)
@@ -1,5 +1,6 @@
 <?php
 
+use Wikimedia\Rdbms\IDatabase;
 use Liuggio\StatsdClient\Factory\StatsdDataFactoryInterface;
 use MediaWiki\Linker\LinkTarget;
 use MediaWiki\MediaWikiServices;
@@ -11,8 +12,11 @@ use Wikimedia\Rdbms\LoadBalancer;
  * Storage layer class for WatchedItems.
  * Database interaction.
  *
- * @author Addshore
+ * Uses database because this uses User::isAnon
+ *
+ * @group Database
  *
+ * @author Addshore
  * @since 1.27
  */
 class WatchedItemStore implements StatsdAwareInterface {
index d24a27c..4e87967 100644 (file)
@@ -563,36 +563,6 @@ class Xml {
                        . Xml::closeElement( 'select' );
        }
 
-       /**
-        * Converts textual drop-down list to array
-        *
-        * @param string $list Correctly formatted text (newline delimited) to be
-        *   used to generate the options.
-        * @return array
-        */
-       public static function getArrayFromWikiTextList( $list = '' ) {
-               $options = [];
-
-               foreach ( explode( "\n", $list ) as $option ) {
-                       $value = trim( $option );
-                       if ( $value == '' ) {
-                               continue;
-                       } elseif ( substr( $value, 0, 1 ) == '*' && substr( $value, 1, 1 ) != '*' ) {
-                               // A new group is starting ...
-                               $value = trim( substr( $value, 1 ) );
-                               $options[] = $value;
-                       } elseif ( substr( $value, 0, 2 ) == '**' ) {
-                               // groupmember
-                               $value = trim( substr( $value, 2 ) );
-                               $options[] = $value;
-                       } else {
-                               // groupless reason list
-                               $options[] = $value;
-                       }
-               }
-               return $options;
-       }
-
        /**
         * Shortcut for creating fieldsets.
         *
index 942b731..b2002ff 100644 (file)
@@ -42,7 +42,7 @@ class PurgeAction extends FormAction {
        }
 
        public function onSubmit( $data ) {
-               return $this->page->doPurge( WikiPage::PURGE_ALL );
+               return $this->page->doPurge();
        }
 
        public function show() {
index 0ba964f..134b8a4 100644 (file)
@@ -58,9 +58,6 @@ class ViewAction extends FormlessAction {
                                $touched = null;
                        }
 
-                       // If a page was purged on HTTP GET, relect that timestamp to avoid sending 304s
-                       $touched = max( $touched, $this->page->getLastPurgeTimestamp() );
-
                        // Send HTTP 304 if the IMS matches or otherwise set expiry/last-modified headers
                        if ( $touched && $this->getOutput()->checkLastModified( $touched ) ) {
                                wfDebug( __METHOD__ . ": done 304\n" );
index 5d12590..b8bd511 100644 (file)
@@ -132,6 +132,6 @@ class ApiAMCreateAccount extends ApiBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Account_creation';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Account_creation';
        }
 }
index d037c36..8862cc7 100644 (file)
@@ -169,6 +169,7 @@ class ApiAuthManagerHelper {
                $this->module->getMain()->markParamsUsed( array_keys( $data ) );
 
                if ( $sensitive ) {
+                       $this->module->getMain()->markParamsSensitive( array_keys( $sensitive ) );
                        $this->module->requirePostedParameters( array_keys( $sensitive ), 'noprefix' );
                }
 
index c03faf0..b698cef 100644 (file)
@@ -24,6 +24,8 @@
  * @file
  */
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * This abstract class implements many basic API functions, and is the base of
  * all API classes.
@@ -186,6 +188,13 @@ abstract class ApiBase extends ContextSource {
         */
        const PARAM_EXTRA_NAMESPACES = 18;
 
+       /*
+        * (boolean) Is the parameter sensitive? Note 'password'-type fields are
+        * always sensitive regardless of the value of this field.
+        * @since 1.29
+        */
+       const PARAM_SENSITIVE = 19;
+
        /**@}*/
 
        const ALL_DEFAULT_STRING = '*';
@@ -1023,6 +1032,10 @@ abstract class ApiBase extends ContextSource {
                        } else {
                                $type = 'NULL'; // allow everything
                        }
+
+                       if ( $type == 'password' || !empty( $paramSettings[self::PARAM_SENSITIVE] ) ) {
+                               $this->getMain()->markParamsSensitive( $encParamName );
+                       }
                }
 
                if ( $type == 'boolean' ) {
@@ -2028,6 +2041,7 @@ abstract class ApiBase extends ContextSource {
                        $params['token'] = [
                                ApiBase::PARAM_TYPE => 'string',
                                ApiBase::PARAM_REQUIRED => true,
+                               ApiBase::PARAM_SENSITIVE => true,
                                ApiBase::PARAM_HELP_MSG => [
                                        'api-help-param-token',
                                        $this->needsToken(),
index 8577ad2..4d37af3 100644 (file)
@@ -193,6 +193,6 @@ class ApiBlock extends ApiBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Block';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Block';
        }
 }
index c25920e..35c4e56 100644 (file)
@@ -93,6 +93,6 @@ class ApiChangeAuthenticationData extends ApiBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Manage_authentication_data';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Manage_authentication_data';
        }
 }
index 3cc7a8a..480915e 100644 (file)
@@ -73,6 +73,7 @@ class ApiCheckToken extends ApiBase {
                        'token' => [
                                ApiBase::PARAM_TYPE => 'string',
                                ApiBase::PARAM_REQUIRED => true,
+                               ApiBase::PARAM_SENSITIVE => true,
                        ],
                        'maxtokenage' => [
                                ApiBase::PARAM_TYPE => 'integer',
index a5474b5..3b24630 100644 (file)
@@ -50,6 +50,6 @@ class ApiClearHasMsg extends ApiBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:ClearHasMsg';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:ClearHasMsg';
        }
 }
index 3f5bc0c..0d512b3 100644 (file)
@@ -132,6 +132,6 @@ class ApiClientLogin extends ApiBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Login';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Login';
        }
 }
index 50c24ae..99065c4 100644 (file)
@@ -218,6 +218,6 @@ class ApiDelete extends ApiBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Delete';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Delete';
        }
 }
index b45be31..0b8156b 100644 (file)
@@ -611,6 +611,6 @@ class ApiEditPage extends ApiBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Edit';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Edit';
        }
 }
index 8aff6f8..72c7c35 100644 (file)
@@ -114,6 +114,6 @@ class ApiEmailUser extends ApiBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Email';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Email';
        }
 }
index 6f7cf65..e15d7da 100644 (file)
@@ -210,6 +210,6 @@ class ApiExpandTemplates extends ApiBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Parsing_wikitext#expandtemplates';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Parsing_wikitext#expandtemplates';
        }
 }
index 7f349bc..b7c5ccc 100644 (file)
@@ -307,6 +307,6 @@ class ApiFeedWatchlist extends ApiBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Watchlist_feed';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Watchlist_feed';
        }
 }
index 83c348b..eb23bd6 100644 (file)
@@ -330,7 +330,7 @@ abstract class ApiFormatBase extends ApiBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Data_formats';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Data_formats';
        }
 
 }
index e347a9f..df9ca98 100644 (file)
@@ -844,9 +844,9 @@ class ApiHelp extends ApiBase {
 
        public function getHelpUrls() {
                return [
-                       'https://www.mediawiki.org/wiki/API:Main_page',
-                       'https://www.mediawiki.org/wiki/API:FAQ',
-                       'https://www.mediawiki.org/wiki/API:Quick_start_guide',
+                       'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Main_page',
+                       'https://www.mediawiki.org/wiki/Special:MyLanguage/API:FAQ',
+                       'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Quick_start_guide',
                ];
        }
 }
index bf5e4ce..b46f0b1 100644 (file)
@@ -171,7 +171,7 @@ class ApiImport extends ApiBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Import';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Import';
        }
 }
 
index 9a21e76..f5c5dee 100644 (file)
@@ -124,6 +124,6 @@ class ApiLinkAccount extends ApiBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Linkaccount';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Linkaccount';
        }
 }
index d64aeb7..41bec35 100644 (file)
@@ -250,6 +250,7 @@ class ApiLogin extends ApiBase {
                        'token' => [
                                ApiBase::PARAM_TYPE => 'string',
                                ApiBase::PARAM_REQUIRED => false, // for BC
+                               ApiBase::PARAM_SENSITIVE => true,
                                ApiBase::PARAM_HELP_MSG => [ 'api-help-param-token', 'login' ],
                        ],
                ];
@@ -265,7 +266,7 @@ class ApiLogin extends ApiBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Login';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Login';
        }
 
        /**
index d5c28f1..d56c096 100644 (file)
@@ -75,6 +75,6 @@ class ApiLogout extends ApiBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Logout';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Logout';
        }
 }
index 604fdf9..4068a50 100644 (file)
@@ -26,6 +26,7 @@
  */
 
 use MediaWiki\Logger\LoggerFactory;
+use MediaWiki\MediaWikiServices;
 use Wikimedia\Timestamp\TimestampException;
 
 /**
@@ -160,6 +161,7 @@ class ApiMain extends ApiBase {
        private $mCacheMode = 'private';
        private $mCacheControl = [];
        private $mParamsUsed = [];
+       private $mParamsSensitive = [];
 
        /** @var bool|null Cached return value from self::lacksSameOriginSecurity() */
        private $lacksSameOriginSecurity = null;
@@ -544,7 +546,7 @@ class ApiMain extends ApiBase {
                        $runTime = microtime( true ) - $t;
                        $this->logRequest( $runTime );
                        if ( $this->mModule->isWriteMode() && $this->getRequest()->wasPosted() ) {
-                               $this->getStats()->timing(
+                               MediaWikiServices::getInstance()->getStatsdDataFactory()->timing(
                                        'api.' . $this->mModule->getModuleName() . '.executeTiming', 1000 * $runTime
                                );
                        }
@@ -1228,6 +1230,35 @@ class ApiMain extends ApiBase {
                return $module;
        }
 
+       /**
+        * @return array
+        */
+       private function getMaxLag() {
+               $dbLag = MediaWikiServices::getInstance()->getDBLoadBalancer()->getMaxLag();
+               $lagInfo = [
+                       'host' => $dbLag[0],
+                       'lag' => $dbLag[1],
+                       'type' => 'db'
+               ];
+
+               $jobQueueLagFactor = $this->getConfig()->get( 'JobQueueIncludeInMaxLagFactor' );
+               if ( $jobQueueLagFactor ) {
+                       // Turn total number of jobs into seconds by using the configured value
+                       $totalJobs = array_sum( JobQueueGroup::singleton()->getQueueSizes() );
+                       $jobQueueLag = $totalJobs / (float)$jobQueueLagFactor;
+                       if ( $jobQueueLag > $lagInfo['lag'] ) {
+                               $lagInfo = [
+                                       'host' => wfHostname(), // XXX: Is there a better value that could be used?
+                                       'lag' => $jobQueueLag,
+                                       'type' => 'jobqueue',
+                                       'jobs' => $totalJobs,
+                               ];
+                       }
+               }
+
+               return $lagInfo;
+       }
+
        /**
         * Check the max lag if necessary
         * @param ApiBase $module Api module being used
@@ -1237,18 +1268,22 @@ class ApiMain extends ApiBase {
        protected function checkMaxLag( $module, $params ) {
                if ( $module->shouldCheckMaxlag() && isset( $params['maxlag'] ) ) {
                        $maxLag = $params['maxlag'];
-                       list( $host, $lag ) = wfGetLB()->getMaxLag();
-                       if ( $lag > $maxLag ) {
+                       $lagInfo = $this->getMaxLag();
+                       if ( $lagInfo['lag'] > $maxLag ) {
                                $response = $this->getRequest()->response();
 
                                $response->header( 'Retry-After: ' . max( intval( $maxLag ), 5 ) );
-                               $response->header( 'X-Database-Lag: ' . intval( $lag ) );
+                               $response->header( 'X-Database-Lag: ' . intval( $lagInfo['lag'] ) );
 
                                if ( $this->getConfig()->get( 'ShowHostnames' ) ) {
-                                       $this->dieWithError( [ 'apierror-maxlag', $lag, $host ] );
+                                       $this->dieWithError(
+                                               [ 'apierror-maxlag', $lagInfo['lag'], $lagInfo['host'] ],
+                                               'maxlag',
+                                               $lagInfo
+                                       );
                                }
 
-                               $this->dieWithError( [ 'apierror-maxlag-generic', $lag ], 'maxlag' );
+                               $this->dieWithError( [ 'apierror-maxlag-generic', $lagInfo['lag'] ], 'maxlag', $lagInfo );
                        }
                }
 
@@ -1601,13 +1636,17 @@ class ApiMain extends ApiBase {
                        " {$logCtx['ip']} " .
                        "T={$logCtx['timeSpentBackend']}ms";
 
+               $sensitive = array_flip( $this->getSensitiveParams() );
                foreach ( $this->getParamsUsed() as $name ) {
                        $value = $request->getVal( $name );
                        if ( $value === null ) {
                                continue;
                        }
 
-                       if ( strlen( $value ) > 256 ) {
+                       if ( isset( $sensitive[$name] ) ) {
+                               $value = '[redacted]';
+                               $encValue = '[redacted]';
+                       } elseif ( strlen( $value ) > 256 ) {
                                $value = substr( $value, 0, 256 );
                                $encValue = $this->encodeRequestLogValue( $value ) . '[...]';
                        } else {
@@ -1657,6 +1696,24 @@ class ApiMain extends ApiBase {
                $this->mParamsUsed += array_fill_keys( (array)$params, true );
        }
 
+       /**
+        * Get the request parameters that should be considered sensitive
+        * @since 1.29
+        * @return array
+        */
+       protected function getSensitiveParams() {
+               return array_keys( $this->mParamsSensitive );
+       }
+
+       /**
+        * Mark parameters as sensitive
+        * @since 1.29
+        * @param string|string[] $params
+        */
+       public function markParamsSensitive( $params ) {
+               $this->mParamsSensitive += array_fill_keys( (array)$params, true );
+       }
+
        /**
         * Get a request value, and register the fact that it was used, for logging.
         * @param string $name
index 3c08093..42de161 100644 (file)
@@ -125,6 +125,6 @@ class ApiManageTags extends ApiBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Tag_management';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Tag_management';
        }
 }
index 357698e..79e9909 100644 (file)
@@ -137,6 +137,6 @@ class ApiMergeHistory extends ApiBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Mergehistory';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Mergehistory';
        }
 }
index 566f778..1fb034f 100644 (file)
@@ -292,6 +292,6 @@ class ApiMove extends ApiBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Move';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Move';
        }
 }
index e6fe27c..ff65d0e 100644 (file)
@@ -309,7 +309,7 @@ class ApiOpenSearch extends ApiBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Opensearch';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Opensearch';
        }
 
        /**
index 466d186..5b0d86a 100644 (file)
@@ -169,7 +169,7 @@ class ApiOptions extends ApiBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Options';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Options';
        }
 
        protected function getExamplesMessages() {
index 7d16af8..a235532 100644 (file)
@@ -25,6 +25,7 @@
  */
 use MediaWiki\MediaWikiServices;
 use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * This class contains a list of pages that the client has requested.
@@ -70,6 +71,7 @@ class ApiPageSet extends ApiBase {
        private $mInterwikiTitles = [];
        /** @var Title[] */
        private $mPendingRedirectIDs = [];
+       private $mPendingRedirectSpecialPages = []; // [dbkey] => [ Title $from, Title $to ]
        private $mResolvedRedirectTitles = [];
        private $mConvertedTitles = [];
        private $mGoodRevIDs = [];
@@ -812,6 +814,8 @@ class ApiPageSet extends ApiBase {
                // Get validated and normalized title objects
                $linkBatch = $this->processTitlesArray( $titles );
                if ( $linkBatch->isEmpty() ) {
+                       // There might be special-page redirects
+                       $this->resolvePendingRedirects();
                        return;
                }
 
@@ -1032,7 +1036,7 @@ class ApiPageSet extends ApiBase {
 
                        // Repeat until all redirects have been resolved
                        // The infinite loop is prevented by keeping all known pages in $this->mAllPages
-                       while ( $this->mPendingRedirectIDs ) {
+                       while ( $this->mPendingRedirectIDs || $this->mPendingRedirectSpecialPages ) {
                                // Resolve redirects by querying the pagelinks table, and repeat the process
                                // Create a new linkBatch object for the next pass
                                $linkBatch = $this->getRedirectTargets();
@@ -1066,56 +1070,76 @@ class ApiPageSet extends ApiBase {
                $titlesToResolve = [];
                $db = $this->getDB();
 
-               $res = $db->select(
-                       'redirect',
-                       [
-                               'rd_from',
-                               'rd_namespace',
-                               'rd_fragment',
-                               'rd_interwiki',
-                               'rd_title'
-                       ], [ 'rd_from' => array_keys( $this->mPendingRedirectIDs ) ],
-                       __METHOD__
-               );
-               foreach ( $res as $row ) {
-                       $rdfrom = intval( $row->rd_from );
-                       $from = $this->mPendingRedirectIDs[$rdfrom]->getPrefixedText();
-                       $to = Title::makeTitle(
-                               $row->rd_namespace,
-                               $row->rd_title,
-                               $row->rd_fragment,
-                               $row->rd_interwiki
-                       );
-                       $this->mResolvedRedirectTitles[$from] = $this->mPendingRedirectIDs[$rdfrom];
-                       unset( $this->mPendingRedirectIDs[$rdfrom] );
-                       if ( $to->isExternal() ) {
-                               $this->mInterwikiTitles[$to->getPrefixedText()] = $to->getInterwiki();
-                       } elseif ( !isset( $this->mAllPages[$to->getNamespace()][$to->getDBkey()] ) ) {
-                               $titlesToResolve[] = $to;
+               if ( $this->mPendingRedirectIDs ) {
+                       $res = $db->select(
+                               'redirect',
+                               [
+                                       'rd_from',
+                                       'rd_namespace',
+                                       'rd_fragment',
+                                       'rd_interwiki',
+                                       'rd_title'
+                               ], [ 'rd_from' => array_keys( $this->mPendingRedirectIDs ) ],
+                                       __METHOD__
+                               );
+                       foreach ( $res as $row ) {
+                               $rdfrom = intval( $row->rd_from );
+                               $from = $this->mPendingRedirectIDs[$rdfrom]->getPrefixedText();
+                               $to = Title::makeTitle(
+                                       $row->rd_namespace,
+                                       $row->rd_title,
+                                       $row->rd_fragment,
+                                       $row->rd_interwiki
+                               );
+                               $this->mResolvedRedirectTitles[$from] = $this->mPendingRedirectIDs[$rdfrom];
+                               unset( $this->mPendingRedirectIDs[$rdfrom] );
+                               if ( $to->isExternal() ) {
+                                       $this->mInterwikiTitles[$to->getPrefixedText()] = $to->getInterwiki();
+                               } elseif ( !isset( $this->mAllPages[$to->getNamespace()][$to->getDBkey()] ) ) {
+                                       $titlesToResolve[] = $to;
+                               }
+                               $this->mRedirectTitles[$from] = $to;
                        }
-                       $this->mRedirectTitles[$from] = $to;
-               }
 
-               if ( $this->mPendingRedirectIDs ) {
-                       // We found pages that aren't in the redirect table
-                       // Add them
-                       foreach ( $this->mPendingRedirectIDs as $id => $title ) {
-                               $page = WikiPage::factory( $title );
-                               $rt = $page->insertRedirect();
-                               if ( !$rt ) {
-                                       // What the hell. Let's just ignore this
-                                       continue;
+                       if ( $this->mPendingRedirectIDs ) {
+                               // We found pages that aren't in the redirect table
+                               // Add them
+                               foreach ( $this->mPendingRedirectIDs as $id => $title ) {
+                                       $page = WikiPage::factory( $title );
+                                       $rt = $page->insertRedirect();
+                                       if ( !$rt ) {
+                                               // What the hell. Let's just ignore this
+                                               continue;
+                                       }
+                                       if ( $rt->isExternal() ) {
+                                               $this->mInterwikiTitles[$rt->getPrefixedText()] = $rt->getInterwiki();
+                                       } elseif ( !isset( $this->mAllPages[$rt->getNamespace()][$rt->getDBkey()] ) ) {
+                                               $titlesToResolve[] = $rt;
+                                       }
+                                       $from = $title->getPrefixedText();
+                                       $this->mResolvedRedirectTitles[$from] = $title;
+                                       $this->mRedirectTitles[$from] = $rt;
+                                       unset( $this->mPendingRedirectIDs[$id] );
                                }
-                               if ( $rt->isExternal() ) {
-                                       $this->mInterwikiTitles[$rt->getPrefixedText()] = $rt->getInterwiki();
-                               } elseif ( !isset( $this->mAllPages[$rt->getNamespace()][$rt->getDBkey()] ) ) {
-                                       $titlesToResolve[] = $rt;
+                       }
+               }
+
+               if ( $this->mPendingRedirectSpecialPages ) {
+                       foreach ( $this->mPendingRedirectSpecialPages as $key => list( $from, $to ) ) {
+                               $fromKey = $from->getPrefixedText();
+                               $this->mResolvedRedirectTitles[$fromKey] = $from;
+                               $this->mRedirectTitles[$fromKey] = $to;
+                               if ( $to->isExternal() ) {
+                                       $this->mInterwikiTitles[$to->getPrefixedText()] = $to->getInterwiki();
+                               } elseif ( !isset( $this->mAllPages[$to->getNamespace()][$to->getDBkey()] ) ) {
+                                       $titlesToResolve[] = $to;
                                }
-                               $from = $title->getPrefixedText();
-                               $this->mResolvedRedirectTitles[$from] = $title;
-                               $this->mRedirectTitles[$from] = $rt;
-                               unset( $this->mPendingRedirectIDs[$id] );
                        }
+                       $this->mPendingRedirectSpecialPages = [];
+
+                       // Set private caching since we don't know what criteria the
+                       // special pages used to decide on these redirects.
+                       $this->mCacheMode = 'private';
                }
 
                return $this->processTitlesArray( $titlesToResolve );
@@ -1196,8 +1220,26 @@ class ApiPageSet extends ApiBase {
                                        $dbkey = $titleObj->getDBkey();
                                        if ( !isset( $this->mAllSpecials[$ns][$dbkey] ) ) {
                                                $this->mAllSpecials[$ns][$dbkey] = $this->mFakePageId;
-                                               $this->mSpecialTitles[$this->mFakePageId] = $titleObj;
-                                               $this->mFakePageId--;
+                                               $target = null;
+                                               if ( $ns === NS_SPECIAL && $this->mResolveRedirects ) {
+                                                       $special = SpecialPageFactory::getPage( $dbkey );
+                                                       if ( $special instanceof RedirectSpecialArticle ) {
+                                                               // Only RedirectSpecialArticle is intended to redirect to an article, other kinds of
+                                                               // RedirectSpecialPage are probably applying weird URL parameters we don't want to handle.
+                                                               $context = new DerivativeContext( $this );
+                                                               $context->setTitle( $titleObj );
+                                                               $context->setRequest( new FauxRequest );
+                                                               $special->setContext( $context );
+                                                               list( /* $alias */, $subpage ) = SpecialPageFactory::resolveAlias( $dbkey );
+                                                               $target = $special->getRedirect( $subpage );
+                                                       }
+                                               }
+                                               if ( $target ) {
+                                                       $this->mPendingRedirectSpecialPages[$dbkey] = [ $titleObj, $target ];
+                                               } else {
+                                                       $this->mSpecialTitles[$this->mFakePageId] = $titleObj;
+                                                       $this->mFakePageId--;
+                                               }
                                        }
                                } else {
                                        // Regular page
index 67983e7..39b5897 100644 (file)
@@ -543,6 +543,6 @@ class ApiParamInfo extends ApiBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Parameter_information';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Parameter_information';
        }
 }
index 287ffb7..d648968 100644 (file)
@@ -340,6 +340,9 @@ class ApiParse extends ApiBase {
                if ( isset( $prop['sections'] ) ) {
                        $result_array['sections'] = $p_result->getSections();
                }
+               if ( isset( $prop['parsewarnings'] ) ) {
+                       $result_array['parsewarnings'] = $p_result->getWarnings();
+               }
 
                if ( isset( $prop['displaytitle'] ) ) {
                        $result_array['displaytitle'] = $p_result->getDisplayTitle() ?:
@@ -452,6 +455,7 @@ class ApiParse extends ApiBase {
                        'modulestyles' => 'm',
                        'properties' => 'pp',
                        'limitreportdata' => 'lr',
+                       'parsewarnings' => 'pw'
                ];
                $this->setIndexedTagNames( $result_array, $result_mapping );
                $result->addValue( null, $this->getModuleName(), $result_array );
@@ -751,7 +755,8 @@ class ApiParse extends ApiBase {
                        ],
                        'prop' => [
                                ApiBase::PARAM_DFLT => 'text|langlinks|categories|links|templates|' .
-                                       'images|externallinks|sections|revid|displaytitle|iwlinks|properties',
+                                       'images|externallinks|sections|revid|displaytitle|iwlinks|' .
+                                       'properties|parsewarnings',
                                ApiBase::PARAM_ISMULTI => true,
                                ApiBase::PARAM_TYPE => [
                                        'text',
@@ -777,6 +782,7 @@ class ApiParse extends ApiBase {
                                        'limitreportdata',
                                        'limitreporthtml',
                                        'parsetree',
+                                       'parsewarnings'
                                ],
                                ApiBase::PARAM_HELP_MSG_PER_VALUE => [
                                        'parsetree' => [ 'apihelp-parse-paramvalue-prop-parsetree', CONTENT_MODEL_WIKITEXT ],
@@ -829,6 +835,6 @@ class ApiParse extends ApiBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Parsing_wikitext#parse';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Parsing_wikitext#parse';
        }
 }
index c33542f..06e8ae2 100644 (file)
@@ -112,6 +112,6 @@ class ApiPatrol extends ApiBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Patrol';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Patrol';
        }
 }
index c74f890..1be4b10 100644 (file)
@@ -199,6 +199,6 @@ class ApiProtect extends ApiBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Protect';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Protect';
        }
 }
index 3124638..83227a2 100644 (file)
@@ -56,7 +56,7 @@ class ApiPurge extends ApiBase {
                        $page = WikiPage::factory( $title );
                        if ( !$user->pingLimiter( 'purge' ) ) {
                                // Directly purge and skip the UI part of purge()
-                               $page->doPurge( WikiPage::PURGE_ALL );
+                               $page->doPurge();
                                $r['purged'] = true;
                        } else {
                                $this->addWarning( 'apierror-ratelimited' );
@@ -176,6 +176,6 @@ class ApiPurge extends ApiBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Purge';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Purge';
        }
 }
index 8196cfa..5395bf0 100644 (file)
@@ -536,10 +536,10 @@ class ApiQuery extends ApiBase {
 
        public function getHelpUrls() {
                return [
-                       'https://www.mediawiki.org/wiki/API:Query',
-                       'https://www.mediawiki.org/wiki/API:Meta',
-                       'https://www.mediawiki.org/wiki/API:Properties',
-                       'https://www.mediawiki.org/wiki/API:Lists',
+                       'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Query',
+                       'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Meta',
+                       'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Properties',
+                       'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Lists',
                ];
        }
 }
index 614b06c..aa89158 100644 (file)
@@ -200,6 +200,6 @@ class ApiQueryAllCategories extends ApiQueryGeneratorBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Allcategories';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Allcategories';
        }
 }
index 020df6d..5682cc2 100644 (file)
@@ -455,6 +455,6 @@ class ApiQueryAllDeletedRevisions extends ApiQueryRevisionsBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Alldeletedrevisions';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Alldeletedrevisions';
        }
 }
index ef6bb6a..daeedbe 100644 (file)
@@ -26,6 +26,8 @@
  * @file
  */
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * Query module to enumerate all available pages.
  *
@@ -85,6 +87,7 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
                $db = $this->getDB();
 
                $params = $this->extractRequestParams();
+               $userId = !is_null( $params['user'] ) ? User::idFromName( $params['user'] ) : null;
 
                // Table and return fields
                $this->addTables( 'image' );
@@ -189,7 +192,11 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
 
                        // Image filters
                        if ( !is_null( $params['user'] ) ) {
-                               $this->addWhereFld( 'img_user_text', $params['user'] );
+                               if ( $userId ) {
+                                       $this->addWhereFld( 'img_user', $userId );
+                               } else {
+                                       $this->addWhereFld( 'img_user_text', $params['user'] );
+                               }
                        }
                        if ( $params['filterbots'] != 'all' ) {
                                $this->addTables( 'user_groups' );
@@ -269,7 +276,11 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
                if ( $params['sort'] == 'timestamp' ) {
                        $this->addOption( 'ORDER BY', 'img_timestamp' . $sortFlag );
                        if ( !is_null( $params['user'] ) ) {
-                               $this->addOption( 'USE INDEX', [ 'image' => 'img_usertext_timestamp' ] );
+                               if ( $userId ) {
+                                       $this->addOption( 'USE INDEX', [ 'image' => 'img_user_timestamp' ] );
+                               } else {
+                                       $this->addOption( 'USE INDEX', [ 'image' => 'img_usertext_timestamp' ] );
+                               }
                        } else {
                                $this->addOption( 'USE INDEX', [ 'image' => 'img_timestamp' ] );
                        }
@@ -417,6 +428,6 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Allimages';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Allimages';
        }
 }
index 3b24e37..9d6bf46 100644 (file)
@@ -308,6 +308,6 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase {
        public function getHelpUrls() {
                $name = ucfirst( $this->getModuleName() );
 
-               return "https://www.mediawiki.org/wiki/API:{$name}";
+               return "https://www.mediawiki.org/wiki/Special:MyLanguage/API:{$name}";
        }
 }
index 244effc..271d281 100644 (file)
@@ -256,6 +256,6 @@ class ApiQueryAllMessages extends ApiQueryBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Allmessages';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Allmessages';
        }
 }
index 7460bd5..315def0 100644 (file)
@@ -76,10 +76,13 @@ class ApiQueryAllPages extends ApiQueryGeneratorBase {
                        $this->addWhere( "page_title $op= $cont_from" );
                }
 
-               if ( $params['filterredir'] == 'redirects' ) {
-                       $this->addWhereFld( 'page_is_redirect', 1 );
-               } elseif ( $params['filterredir'] == 'nonredirects' ) {
-                       $this->addWhereFld( 'page_is_redirect', 0 );
+               $miserMode = $this->getConfig()->get( 'MiserMode' );
+               if ( !$miserMode ) {
+                       if ( $params['filterredir'] == 'redirects' ) {
+                               $this->addWhereFld( 'page_is_redirect', 1 );
+                       } elseif ( $params['filterredir'] == 'nonredirects' ) {
+                               $this->addWhereFld( 'page_is_redirect', 0 );
+                       }
                }
 
                $this->addWhereFld( 'page_namespace', $params['namespace'] );
@@ -108,6 +111,18 @@ class ApiQueryAllPages extends ApiQueryGeneratorBase {
                        $selectFields = $resultPageSet->getPageTableFields();
                }
 
+               $miserModeFilterRedirValue = null;
+               $miserModeFilterRedir = $miserMode && $params['filterredir'] !== 'all';
+               if ( $miserModeFilterRedir ) {
+                       $selectFields[] = 'page_is_redirect';
+
+                       if ( $params['filterredir'] == 'redirects' ) {
+                               $miserModeFilterRedirValue = 1;
+                       } elseif ( $params['filterredir'] == 'nonredirects' ) {
+                               $miserModeFilterRedirValue = 0;
+                       }
+               }
+
                $this->addFields( $selectFields );
                $forceNameTitleIndex = true;
                if ( isset( $params['minsize'] ) ) {
@@ -219,6 +234,11 @@ class ApiQueryAllPages extends ApiQueryGeneratorBase {
                                break;
                        }
 
+                       if ( $miserModeFilterRedir && (int)$row->page_is_redirect !== $miserModeFilterRedirValue ) {
+                               // Filter implemented in PHP due to being in Miser Mode
+                               continue;
+                       }
+
                        if ( is_null( $resultPageSet ) ) {
                                $title = Title::makeTitle( $row->page_namespace, $row->page_title );
                                $vals = [
@@ -242,7 +262,7 @@ class ApiQueryAllPages extends ApiQueryGeneratorBase {
        }
 
        public function getAllowedParams() {
-               return [
+               $ret = [
                        'from' => null,
                        'continue' => [
                                ApiBase::PARAM_HELP_MSG => 'api-help-param-continue',
@@ -314,6 +334,12 @@ class ApiQueryAllPages extends ApiQueryGeneratorBase {
                                ApiBase::PARAM_DFLT => 'all'
                        ],
                ];
+
+               if ( $this->getConfig()->get( 'MiserMode' ) ) {
+                       $ret['filterredir'][ApiBase::PARAM_HELP_MSG_APPEND] = [ 'api-help-param-limited-in-miser-mode' ];
+               }
+
+               return $ret;
        }
 
        protected function getExamplesMessages() {
@@ -329,6 +355,6 @@ class ApiQueryAllPages extends ApiQueryGeneratorBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Allpages';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Allpages';
        }
 }
index 7b43efc..20746c9 100644 (file)
@@ -290,6 +290,6 @@ class ApiQueryAllRevisions extends ApiQueryRevisionsBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Allrevisions';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Allrevisions';
        }
 }
index 9e7ad67..0f0b2af 100644 (file)
@@ -395,6 +395,6 @@ class ApiQueryAllUsers extends ApiQueryBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Allusers';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Allusers';
        }
 }
index 661ec5a..c775942 100644 (file)
@@ -127,6 +127,6 @@ class ApiQueryAuthManagerInfo extends ApiQueryBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Authmanagerinfo';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Authmanagerinfo';
        }
 }
index b3ac606..56cbaac 100644 (file)
@@ -59,19 +59,19 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
                        'code' => 'bl',
                        'prefix' => 'pl',
                        'linktbl' => 'pagelinks',
-                       'helpurl' => 'https://www.mediawiki.org/wiki/API:Backlinks',
+                       'helpurl' => 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Backlinks',
                ],
                'embeddedin' => [
                        'code' => 'ei',
                        'prefix' => 'tl',
                        'linktbl' => 'templatelinks',
-                       'helpurl' => 'https://www.mediawiki.org/wiki/API:Embeddedin',
+                       'helpurl' => 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Embeddedin',
                ],
                'imageusage' => [
                        'code' => 'iu',
                        'prefix' => 'il',
                        'linktbl' => 'imagelinks',
-                       'helpurl' => 'https://www.mediawiki.org/wiki/API:Imageusage',
+                       'helpurl' => 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Imageusage',
                ]
        ];
 
index 4ed7f52..00cbcd9 100644 (file)
@@ -432,6 +432,6 @@ class ApiQueryBacklinksprop extends ApiQueryGeneratorBase {
 
        public function getHelpUrls() {
                $name = ucfirst( $this->getModuleName() );
-               return "https://www.mediawiki.org/wiki/API:{$name}";
+               return "https://www.mediawiki.org/wiki/Special:MyLanguage/API:{$name}";
        }
 }
index 0040860..076a09e 100644 (file)
@@ -335,6 +335,6 @@ class ApiQueryBlocks extends ApiQueryBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Blocks';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Blocks';
        }
 }
index f2498ca..c4428d5 100644 (file)
@@ -227,6 +227,6 @@ class ApiQueryCategories extends ApiQueryGeneratorBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Categories';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Categories';
        }
 }
index 3416240..2a3bf38 100644 (file)
@@ -115,6 +115,6 @@ class ApiQueryCategoryInfo extends ApiQueryBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Categoryinfo';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Categoryinfo';
        }
 }
index 3a8847c..c570ec9 100644 (file)
@@ -391,6 +391,6 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Categorymembers';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Categorymembers';
        }
 }
index 148e315..183409d 100644 (file)
@@ -256,6 +256,6 @@ class ApiQueryContributors extends ApiQueryBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Contributors';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Contributors';
        }
 }
index 471aed6..90fd695 100644 (file)
@@ -288,6 +288,6 @@ class ApiQueryDeletedRevisions extends ApiQueryRevisionsBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Deletedrevisions';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Deletedrevisions';
        }
 }
index 2959151..b68a868 100644 (file)
@@ -250,7 +250,7 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
                $this->addOption( 'LIMIT', $limit + 1 );
                $this->addOption(
                        'USE INDEX',
-                       [ 'archive' => ( $mode == 'user' ? 'usertext_timestamp' : 'name_title_timestamp' ) ]
+                       [ 'archive' => ( $mode == 'user' ? 'ar_usertext_timestamp' : 'name_title_timestamp' ) ]
                );
                if ( $mode == 'all' ) {
                        if ( $params['unique'] ) {
@@ -505,6 +505,6 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Deletedrevs';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Deletedrevs';
        }
 }
index 02b7883..2ebd6de 100644 (file)
@@ -189,6 +189,6 @@ class ApiQueryDuplicateFiles extends ApiQueryGeneratorBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Duplicatefiles';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Duplicatefiles';
        }
 }
index 9b05537..6c29b60 100644 (file)
@@ -230,6 +230,6 @@ class ApiQueryExtLinksUsage extends ApiQueryGeneratorBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Exturlusage';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Exturlusage';
        }
 }
index 8c9c887..71fd6d1 100644 (file)
@@ -134,6 +134,6 @@ class ApiQueryExternalLinks extends ApiQueryBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Extlinks';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Extlinks';
        }
 }
index c491236..4589991 100644 (file)
@@ -111,6 +111,6 @@ class ApiQueryFileRepoInfo extends ApiQueryBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Filerepoinfo';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Filerepoinfo';
        }
 }
index 116dbb3..7383cba 100644 (file)
@@ -292,6 +292,6 @@ class ApiQueryFilearchive extends ApiQueryBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Filearchive';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Filearchive';
        }
 }
index 6e2fb67..a10ba16 100644 (file)
@@ -215,6 +215,6 @@ class ApiQueryIWBacklinks extends ApiQueryGeneratorBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Iwbacklinks';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Iwbacklinks';
        }
 }
index cfd990b..9313af3 100644 (file)
@@ -194,6 +194,6 @@ class ApiQueryIWLinks extends ApiQueryBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Iwlinks';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Iwlinks';
        }
 }
index e5e45b3..b2664df 100644 (file)
@@ -821,6 +821,6 @@ class ApiQueryImageInfo extends ApiQueryBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Imageinfo';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Imageinfo';
        }
 }
index ae6f5bf..0086c58 100644 (file)
@@ -172,6 +172,6 @@ class ApiQueryImages extends ApiQueryGeneratorBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Images';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Images';
        }
 }
index e789dd4..c2cdfe4 100644 (file)
@@ -946,6 +946,6 @@ class ApiQueryInfo extends ApiQueryBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Info';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Info';
        }
 }
index 8d5b5f3..fd67d7c 100644 (file)
@@ -214,6 +214,6 @@ class ApiQueryLangBacklinks extends ApiQueryGeneratorBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Langbacklinks';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Langbacklinks';
        }
 }
index 55e3c85..df33d02 100644 (file)
@@ -190,6 +190,6 @@ class ApiQueryLangLinks extends ApiQueryBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Langlinks';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Langlinks';
        }
 }
index 4556e29..29c0b74 100644 (file)
@@ -42,13 +42,13 @@ class ApiQueryLinks extends ApiQueryGeneratorBase {
                                $this->table = 'pagelinks';
                                $this->prefix = 'pl';
                                $this->titlesParam = 'titles';
-                               $this->helpUrl = 'https://www.mediawiki.org/wiki/API:Links';
+                               $this->helpUrl = 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Links';
                                break;
                        case self::TEMPLATES:
                                $this->table = 'templatelinks';
                                $this->prefix = 'tl';
                                $this->titlesParam = 'templates';
-                               $this->helpUrl = 'https://www.mediawiki.org/wiki/API:Templates';
+                               $this->helpUrl = 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Templates';
                                break;
                        default:
                                ApiBase::dieDebug( __METHOD__, 'Unknown module name' );
index 8a13fef..df8a11e 100644 (file)
@@ -467,6 +467,6 @@ class ApiQueryLogEvents extends ApiQueryBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Logevents';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Logevents';
        }
 }
index 1324f2f..457f6c6 100644 (file)
@@ -145,6 +145,6 @@ class ApiQueryMyStashedFiles extends ApiQueryBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:mystashedfiles';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:mystashedfiles';
        }
 }
index fc50b50..4966bcd 100644 (file)
@@ -104,6 +104,6 @@ class ApiQueryPagePropNames extends ApiQueryBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Pagepropnames';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Pagepropnames';
        }
 }
index de1df34..e49dfbc 100644 (file)
@@ -120,6 +120,6 @@ class ApiQueryPageProps extends ApiQueryBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Pageprops';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Pageprops';
        }
 }
index f1f4d9a..e90356d 100644 (file)
@@ -173,6 +173,6 @@ class ApiQueryPagesWithProp extends ApiQueryGeneratorBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Pageswithprop';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Pageswithprop';
        }
 }
index 3bf6d3f..5606f3c 100644 (file)
@@ -127,6 +127,6 @@ class ApiQueryPrefixSearch extends ApiQueryGeneratorBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Prefixsearch';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Prefixsearch';
        }
 }
index 62b2e42..5f6510e 100644 (file)
@@ -234,6 +234,6 @@ class ApiQueryProtectedTitles extends ApiQueryGeneratorBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Protectedtitles';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Protectedtitles';
        }
 }
index 908cdee..caa5f05 100644 (file)
@@ -166,6 +166,6 @@ class ApiQueryQueryPage extends ApiQueryGeneratorBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Querypage';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Querypage';
        }
 }
index 00bd467..cc1fc89 100644 (file)
@@ -209,6 +209,6 @@ class ApiQueryRandom extends ApiQueryGeneratorBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Random';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Random';
        }
 }
index 26581a6..0dc01aa 100644 (file)
@@ -699,6 +699,6 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Recentchanges';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Recentchanges';
        }
 }
index c47de9d..7b8394f 100644 (file)
@@ -447,6 +447,6 @@ class ApiQueryRevisions extends ApiQueryRevisionsBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Revisions';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Revisions';
        }
 }
index 05b693d..72b39b6 100644 (file)
@@ -415,6 +415,6 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Search';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Search';
        }
 }
index cc302dc..6b896c9 100644 (file)
@@ -933,6 +933,6 @@ class ApiQuerySiteinfo extends ApiQueryBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Siteinfo';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Siteinfo';
        }
 }
index abb827f..1924ca0 100644 (file)
@@ -123,6 +123,6 @@ class ApiQueryStashImageInfo extends ApiQueryImageInfo {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Stashimageinfo';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Stashimageinfo';
        }
 }
index 43eb7e8..be67dd2 100644 (file)
@@ -178,6 +178,6 @@ class ApiQueryTags extends ApiQueryBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Tags';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Tags';
        }
 }
index 5b700db..85205c8 100644 (file)
@@ -131,6 +131,6 @@ class ApiQueryTokens extends ApiQueryBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Tokens';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Tokens';
        }
 }
index 31a9238..181cddb 100644 (file)
@@ -582,6 +582,6 @@ class ApiQueryContributions extends ApiQueryBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Usercontribs';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Usercontribs';
        }
 }
index 04b0fac..1bb54c1 100644 (file)
@@ -352,6 +352,6 @@ class ApiQueryUserInfo extends ApiQueryBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Userinfo';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Userinfo';
        }
 }
index 3a814c4..4515f7f 100644 (file)
@@ -406,6 +406,6 @@ class ApiQueryUsers extends ApiQueryBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Users';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Users';
        }
 }
index 3f59751..f8f6e7d 100644 (file)
@@ -475,7 +475,8 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
                                ApiBase::PARAM_TYPE => 'user'
                        ],
                        'token' => [
-                               ApiBase::PARAM_TYPE => 'string'
+                               ApiBase::PARAM_TYPE => 'string',
+                               ApiBase::PARAM_SENSITIVE => true,
                        ],
                        'continue' => [
                                ApiBase::PARAM_HELP_MSG => 'api-help-param-continue',
@@ -501,6 +502,6 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Watchlist';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Watchlist';
        }
 }
index a1078a5..b0b1cde 100644 (file)
@@ -170,7 +170,8 @@ class ApiQueryWatchlistRaw extends ApiQueryGeneratorBase {
                                ApiBase::PARAM_TYPE => 'user'
                        ],
                        'token' => [
-                               ApiBase::PARAM_TYPE => 'string'
+                               ApiBase::PARAM_TYPE => 'string',
+                               ApiBase::PARAM_SENSITIVE => true,
                        ],
                        'dir' => [
                                ApiBase::PARAM_DFLT => 'ascending',
@@ -198,6 +199,6 @@ class ApiQueryWatchlistRaw extends ApiQueryGeneratorBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Watchlistraw';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Watchlistraw';
        }
 }
index 359d045..661b50c 100644 (file)
@@ -106,6 +106,6 @@ class ApiRemoveAuthenticationData extends ApiBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Manage_authentication_data';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Manage_authentication_data';
        }
 }
index b5fa8ed..4f3fc0d 100644 (file)
@@ -134,6 +134,6 @@ class ApiResetPassword extends ApiBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Manage_authentication_data';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Manage_authentication_data';
        }
 }
index 4896e7e..4580aa2 100644 (file)
@@ -199,6 +199,6 @@ class ApiRevisionDelete extends ApiBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Revisiondelete';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Revisiondelete';
        }
 }
index 9584f09..76b6cc6 100644 (file)
@@ -202,6 +202,6 @@ class ApiRollback extends ApiBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Rollback';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Rollback';
        }
 }
index 4fac37d..fdc62a8 100644 (file)
@@ -89,7 +89,7 @@ class ApiRsd extends ApiBase {
                                'apiLink' => wfExpandUrl( wfScript( 'api' ), PROTO_CURRENT ),
 
                                // Docs link is optional, but recommended.
-                               'docs' => 'https://www.mediawiki.org/wiki/API',
+                               'docs' => 'https://www.mediawiki.org/wiki/Special:MyLanguage/API',
 
                                // Some APIs may need a blog ID, but it may be left blank.
                                'blogID' => '',
index 5769ff6..1fc8fc2 100644 (file)
@@ -248,6 +248,6 @@ class ApiSetNotificationTimestamp extends ApiBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:SetNotificationTimestamp';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:SetNotificationTimestamp';
        }
 }
index 3ff99f1..2d6d9be 100755 (executable)
@@ -144,6 +144,6 @@ class ApiSetPageLanguage extends ApiBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:SetPageLanguage';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:SetPageLanguage';
        }
 }
index 7470ff3..76c6762 100644 (file)
@@ -187,6 +187,6 @@ class ApiTag extends ApiBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Tag';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Tag';
        }
 }
index bfb0324..887edaa 100644 (file)
@@ -132,6 +132,6 @@ class ApiUnblock extends ApiBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Block';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Block';
        }
 }
index 7fda1ea..3aa7b60 100644 (file)
@@ -33,7 +33,6 @@ class ApiUndelete extends ApiBase {
                $this->useTransactionalTimeLimit();
 
                $params = $this->extractRequestParams();
-               $this->checkUserRightsAny( 'undelete' );
 
                $user = $this->getUser();
                if ( $user->isBlocked() ) {
@@ -45,6 +44,10 @@ class ApiUndelete extends ApiBase {
                        $this->dieWithError( [ 'apierror-invalidtitle', wfEscapeWikiText( $params['title'] ) ] );
                }
 
+               if ( !$titleObj->userCan( 'undelete', $user, 'secure' ) ) {
+                       $this->dieWithError( 'permdenied-undelete' );
+               }
+
                // Check if user can add tags
                if ( !is_null( $params['tags'] ) ) {
                        $ableToTag = ChangeTags::canAddTagsAccompanyingChange( $params['tags'], $user );
@@ -145,6 +148,6 @@ class ApiUndelete extends ApiBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Undelete';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Undelete';
        }
 }
index af3fff6..a283b5a 100644 (file)
@@ -928,6 +928,6 @@ class ApiUpload extends ApiBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Upload';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Upload';
        }
 }
index 262f072..d857e4a 100644 (file)
@@ -214,6 +214,6 @@ class ApiUserrights extends ApiBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:User_group_membership';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:User_group_membership';
        }
 }
index 6968523..943149d 100644 (file)
@@ -76,6 +76,6 @@ class ApiValidatePassword extends ApiBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Validatepassword';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Validatepassword';
        }
 }
index 37d319f..efe21f1 100644 (file)
@@ -183,6 +183,6 @@ class ApiWatch extends ApiBase {
        }
 
        public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Watch';
+               return 'https://www.mediawiki.org/wiki/Special:MyLanguage/API:Watch';
        }
 }
index ca1e85a..a6f1a28 100644 (file)
                        "Dvorapa"
                ]
        },
-       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Dokumentace]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api E-mailová konference]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Oznámení k API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Chyby a požadavky]\n</div>\n<strong>Stav:</strong> Všechny funkce uvedené na této stránce by měly fungovat, ale API se stále aktivně vyvíjí a může se kdykoli změnit. Upozornění na změny získáte přihlášením se k [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ e-mailové konferenci mediawiki-api-announce].\n\n<strong>Chybné požadavky:</strong> Pokud jsou do API zaslány chybné požadavky, bude vrácena HTTP hlavička s klíčem „MediaWiki-API-Error“ a hodnota této hlavičky a chybový kód budou nastaveny na stejnou hodnotu. Více informací najdete [[mw:API:Errors_and_warnings|v dokumentaci]].\n\n<strong>Testování:</strong> Pro jednoduché testování požadavků na API zkuste [[Special:ApiSandbox]].",
+       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:Special:MyLanguage/API:Main_page|Dokumentace]]\n* [[mw:Special:MyLanguage/API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api E-mailová konference]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Oznámení k API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Chyby a požadavky]\n</div>\n<strong>Stav:</strong> Všechny funkce uvedené na této stránce by měly fungovat, ale API se stále aktivně vyvíjí a může se kdykoli změnit. Upozornění na změny získáte přihlášením se k [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ e-mailové konferenci mediawiki-api-announce].\n\n<strong>Chybné požadavky:</strong> Pokud jsou do API zaslány chybné požadavky, bude vrácena HTTP hlavička s klíčem „MediaWiki-API-Error“ a hodnota této hlavičky a chybový kód budou nastaveny na stejnou hodnotu. Více informací najdete [[mw:Special:MyLanguage/API:Errors_and_warnings|v dokumentaci]].\n\n<strong>Testování:</strong> Pro jednoduché testování požadavků na API zkuste [[Special:ApiSandbox]].",
        "apihelp-main-param-action": "Která akce se má provést.",
        "apihelp-main-param-format": "Formát výstupu.",
-       "apihelp-main-param-maxlag": "Maximální zpoždění lze použít, když je MediaWiki nainstalováno na cluster s replikovanou databází. Abyste se vyhnuli zhoršování už tak špatného replikačního zpoždění, můžete tímto parametrem nechat klienta čekat, dokud replikační zpoždění neklesne pod uvedenou hodnotu. V případě příliš vysokého zpoždění se vrátí chybový kód „<samp>maxlag</samp>“ s hlášením typu „<samp>Waiting for $host: $lag seconds lagged</samp>“.<br />Více informací najdete v [[mw:Manual:Maxlag_parameter|příručce]].",
+       "apihelp-main-param-maxlag": "Maximální zpoždění lze použít, když je MediaWiki nainstalováno na cluster s replikovanou databází. Abyste se vyhnuli zhoršování už tak špatného replikačního zpoždění, můžete tímto parametrem nechat klienta čekat, dokud replikační zpoždění neklesne pod uvedenou hodnotu. V případě příliš vysokého zpoždění se vrátí chybový kód „<samp>maxlag</samp>“ s hlášením typu „<samp>Waiting for $host: $lag seconds lagged</samp>“.<br />Více informací najdete v [[mw:Special:MyLanguage/Manual:Maxlag_parameter|příručce]].",
        "apihelp-main-param-smaxage": "Nastaví HTTP hlavičku pro řízení kešování <code>s-maxage</code> na uvedený počet sekund. Chyby se nekešují nikdy.",
        "apihelp-main-param-maxage": "Nastaví HTTP hlavičku pro řízení kešování <code>max-age</code> na uvedený počet sekund. Chyby se nekešují nikdy.",
        "apihelp-main-param-assert": "Pokud je nastaveno na „<kbd>user</kbd>“, ověří, že je uživatel přihlášen, pokud je nastaveno na „<kbd>bot</kbd>“, ověří, že má oprávnění „bot“.",
@@ -32,7 +32,7 @@
        "apihelp-block-param-nocreate": "Nedovolit registraci nových uživatelů.",
        "apihelp-block-param-noemail": "Zakázat uživateli posílat e-maily prostřednictvím wiki. (Vyžaduje oprávnění „<code>blockemail</code>“.)",
        "apihelp-block-param-hidename": "Skrýt uživatelské jméno v knize zablokování. (Vyžaduje oprávnění <code>hideuser</code>.)",
-       "apihelp-block-param-allowusertalk": "Povolit uživateli editovat svou vlastní diskusní stránku (závisí na <var>[[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var>).",
+       "apihelp-block-param-allowusertalk": "Povolit uživateli editovat svou vlastní diskusní stránku (závisí na <var>[[mw:Special:MyLanguage/Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var>).",
        "apihelp-block-param-reblock": "Pokud již uživatel blokován je, přepsat současný blok.",
        "apihelp-block-param-watchuser": "Sledovat stránku uživatele nebo IP adresy a jejich diskuzní stránky.",
        "apihelp-block-example-ip-simple": "Na tři dny zablokovat IP adresu <kbd>192.0.2.5</kbd> s odůvodněním <kbd>First strike</kbd>.",
        "apihelp-opensearch-param-search": "Hledaný řetězec.",
        "apihelp-opensearch-param-limit": "Maximální počet vrácených výsledků",
        "apihelp-opensearch-param-namespace": "Jmenné prostory pro vyhledávání.",
-       "apihelp-opensearch-param-suggest": "Pokud je <var>[[mw:Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]</var> vypnuto, nedělat nic.",
+       "apihelp-opensearch-param-suggest": "Pokud je <var>[[mw:Special:MyLanguage/Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]</var> vypnuto, nedělat nic.",
        "apihelp-opensearch-param-format": "Formát výstupu.",
        "apihelp-opensearch-example-te": "Najít stránky začínající na „<kbd>Te</kbd>“.",
        "apihelp-options-param-reset": "Vrátit nastavení na výchozí hodnoty.",
        "apihelp-xml-param-includexmlnamespace": "Pokud je uvedeno, přidá jmenný prostor XML.",
        "apihelp-xmlfm-description": "Vypisuje data ve formátu XML (v čitelné HTML podobě).",
        "api-format-title": "Odpověď z MediaWiki API",
-       "api-format-prettyprint-header": "Toto je HTML reprezentace formátu $1. HTML se hodí pro ladění, ale pro aplikační použití je nevhodné.\n\nPro změnu výstupního formátu uveďte parametr <var>format</var>. Abyste viděli ne-HTML reprezentaci formátu $1, nastavte <kbd>format=$2</kbd>.\n\nVíce informací najdete v [[mw:API|úplné dokumentaci]] nebo v [[Special:ApiHelp/main|nápovědě k API]].",
-       "api-format-prettyprint-header-only-html": "Toto je HTML reprezentace určená pro ladění, která není vhodná pro použití v aplikacích.\n\nVíce informací najdete v [[mw:API|úplné dokumentaci]] nebo [[Special:ApiHelp/main|dokumentaci API]].",
+       "api-format-prettyprint-header": "Toto je HTML reprezentace formátu $1. HTML se hodí pro ladění, ale pro aplikační použití je nevhodné.\n\nPro změnu výstupního formátu uveďte parametr <var>format</var>. Abyste viděli ne-HTML reprezentaci formátu $1, nastavte <kbd>format=$2</kbd>.\n\nVíce informací najdete v [[mw:Special:MyLanguage/API|úplné dokumentaci]] nebo v [[Special:ApiHelp/main|nápovědě k API]].",
+       "api-format-prettyprint-header-only-html": "Toto je HTML reprezentace určená pro ladění, která není vhodná pro použití v aplikacích.\n\nVíce informací najdete v [[mw:Special:MyLanguage/API|úplné dokumentaci]] nebo [[Special:ApiHelp/main|dokumentaci API]].",
        "api-help-title": "Nápověda k MediaWiki API",
        "api-help-lead": "Toto je automaticky generovaná dokumentační stránka k MediaWiki API.\n\nDokumentace a příklady: https://www.mediawiki.org/wiki/API",
        "api-help-main-header": "Hlavní modul",
index f8e6acd..074d69e 100644 (file)
                        "FriedhelmW",
                        "Predatorix",
                        "Luke081515",
-                       "Eddie"
+                       "Eddie",
+                       "Zenith"
                ]
        },
-       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Dokumentation]]\n* [[mw:API:FAQ|Häufig gestellte Fragen]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Mailingliste]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API-Ankündigungen]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Fehlerberichte und Anfragen]\n</div>\n<strong>Status:</strong> Alle auf dieser Seite gezeigten Funktionen sollten funktionieren, allerdings ist die API in aktiver Entwicklung und kann sich zu jeder Zeit ändern. Abonniere die [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ MediaWiki-API-Ankündigungs-Mailingliste], um über Aktualisierungen informiert zu werden.\n\n<strong>Fehlerhafte Anfragen:</strong> Wenn fehlerhafte Anfragen an die API gesendet werden, wird ein HTTP-Header mit dem Schlüssel „MediaWiki-API-Error“ gesendet. Der Wert des Headers und der Fehlercode werden auf den gleichen Wert gesetzt. Für weitere Informationen siehe [[mw:API:Errors_and_warnings|API: Fehler und Warnungen]].\n\n<strong>Testen:</strong> Zum einfachen Testen von API-Anfragen, siehe [[Special:ApiSandbox]].",
+       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:Special:MyLanguage/API:Main_page|Dokumentation]]\n* [[mw:Special:MyLanguage/API:FAQ|Häufig gestellte Fragen]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Mailingliste]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API-Ankündigungen]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Fehlerberichte und Anfragen]\n</div>\n<strong>Status:</strong> Alle auf dieser Seite gezeigten Funktionen sollten funktionieren, allerdings ist die API in aktiver Entwicklung und kann sich zu jeder Zeit ändern. Abonniere die [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ MediaWiki-API-Ankündigungs-Mailingliste], um über Aktualisierungen informiert zu werden.\n\n<strong>Fehlerhafte Anfragen:</strong> Wenn fehlerhafte Anfragen an die API gesendet werden, wird ein HTTP-Header mit dem Schlüssel „MediaWiki-API-Error“ gesendet. Der Wert des Headers und der Fehlercode werden auf den gleichen Wert gesetzt. Für weitere Informationen siehe [[mw:Special:MyLanguage/API:Errors_and_warnings|API: Fehler und Warnungen]].\n\n<strong>Testen:</strong> Zum einfachen Testen von API-Anfragen, siehe [[Special:ApiSandbox]].",
        "apihelp-main-param-action": "Auszuführende Aktion.",
        "apihelp-main-param-format": "Format der Ausgabe.",
-       "apihelp-main-param-maxlag": "maxlag kann verwendet werden, wenn MediaWiki auf einem datenbankreplizierten Cluster installiert ist. Um weitere Replikationsrückstände zu verhindern, lässt dieser Parameter den Client warten, bis der Replikationsrückstand kleiner als der angegebene Wert (in Sekunden) ist. Bei einem größerem Rückstand wird der Fehlercode <samp>maxlag</samp> zurückgegeben mit einer Nachricht wie <samp>Waiting for $host: $lag seconds lagged</samp>.<br />Siehe [[mw:Manual:Maxlag_parameter|Handbuch: Maxlag parameter]] für weitere Informationen.",
+       "apihelp-main-param-maxlag": "maxlag kann verwendet werden, wenn MediaWiki auf einem datenbankreplizierten Cluster installiert ist. Um weitere Replikationsrückstände zu verhindern, lässt dieser Parameter den Client warten, bis der Replikationsrückstand kleiner als der angegebene Wert (in Sekunden) ist. Bei einem größerem Rückstand wird der Fehlercode <samp>maxlag</samp> zurückgegeben mit einer Nachricht wie <samp>Waiting for $host: $lag seconds lagged</samp>.<br />Siehe [[mw:Special:MyLanguage/Manual:Maxlag_parameter|Handbuch: Maxlag parameter]] für weitere Informationen.",
        "apihelp-main-param-smaxage": "Den <code>s-maxage</code>-HTTP-Cache-Control-Header auf diese Anzahl Sekunden festlegen. Fehler werden niemals gepuffert.",
        "apihelp-main-param-maxage": "Den <code>max-age</code>-HTTP-Cache-Control-Header auf diese Anzahl Sekunden festlegen. Fehler werden niemals gecacht.",
        "apihelp-main-param-assert": "Sicherstellen, dass der Benutzer eingeloggt ist, wenn auf <kbd>user</kbd> gesetzt, oder Bot ist, wenn auf <kbd>bot</kbd> gesetzt.",
@@ -46,7 +47,7 @@
        "apihelp-block-param-autoblock": "Die zuletzt verwendete IP-Adresse automatisch sperren und alle darauffolgenden IP-Adressen, die versuchen sich anzumelden.",
        "apihelp-block-param-noemail": "Benutzer davon abhalten, E-Mails auf dem Wiki zu versenden (erfordert das <code>blockemail</code>-Recht).",
        "apihelp-block-param-hidename": "Den Benutzernamen im Sperr-Logbuch verstecken (erfordert das <code>hideuser</code>-Recht).",
-       "apihelp-block-param-allowusertalk": "Dem Benutzer erlauben, seine eigene Diskussionsseite zu bearbeiten (abhängig von <var>[[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var>).",
+       "apihelp-block-param-allowusertalk": "Dem Benutzer erlauben, seine eigene Diskussionsseite zu bearbeiten (abhängig von <var>[[mw:Special:MyLanguage/Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var>).",
        "apihelp-block-param-reblock": "Falls der Benutzer bereits gesperrt ist, die vorhandene Sperre überschreiben.",
        "apihelp-block-param-watchuser": "Benutzer- und Diskussionsseiten des Benutzers oder der IP-Adresse beobachten.",
        "apihelp-block-param-tags": "Auf den Eintrag im Sperr-Logbuch anzuwendende Änderungsmarkierungen.",
        "apihelp-import-param-rootpage": "Als Unterseite dieser Seite importieren. Kann nicht zusammen mit <var>$1namespace</var> verwendet werden.",
        "apihelp-import-param-tags": "Auf den Eintrag im Import-Logbuch und die Nullversion bei den importierten Seiten anzuwendende Änderungsmarkierungen.",
        "apihelp-import-example-import": "Importiere [[meta:Help:ParserFunctions]] mit der kompletten Versionsgeschichte in den Namensraum 100.",
+       "apihelp-linkaccount-description": "Verbindet ein Benutzerkonto von einem Drittanbieter mit dem aktuellen Benutzer.",
        "apihelp-login-description": "Anmelden und Authentifizierungs-Cookies beziehen.\n\nDiese Aktion sollte nur in Kombination mit [[Special:BotPasswords]] verwendet werden. Die Verwendung für die Anmeldung beim Hauptkonto ist veraltet und kann ohne Warnung fehlschlagen. Um sich sicher beim Hauptkonto anzumelden, verwende <kbd>[[Special:ApiHelp/clientlogin|action=clientlogin]]</kbd>.",
        "apihelp-login-param-name": "Benutzername.",
        "apihelp-login-param-password": "Passwort.",
        "apihelp-opensearch-param-search": "Such-Zeichenfolge.",
        "apihelp-opensearch-param-limit": "Maximale Anzahl zurückzugebender Ergebnisse.",
        "apihelp-opensearch-param-namespace": "Zu durchsuchende Namensräume.",
-       "apihelp-opensearch-param-suggest": "Nichts unternehmen, falls <var>[[mw:Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]</var> falsch ist.",
+       "apihelp-opensearch-param-suggest": "Nichts unternehmen, falls <var>[[mw:Special:MyLanguage/Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]</var> falsch ist.",
        "apihelp-opensearch-param-redirects": "Wie mit Weiterleitungen umgegangen werden soll:\n;return:Gibt die Weiterleitung selbst zurück.\n;resolve:Gibt die Zielseite zurück. Kann weniger als $1limit Ergebnisse zurückgeben.\nAus Kompatibilitätsgründen ist für $1format=json die Vorgabe \"return\" und \"resolve\" für alle anderen Formate.",
        "apihelp-opensearch-param-format": "Das Format der Ausgabe.",
        "apihelp-opensearch-param-warningsaserror": "Wenn Warnungen mit <kbd>format=json</kbd> auftreten, gib einen API-Fehler zurück, anstatt ihn zu ignorieren.",
        "apihelp-parse-paramvalue-prop-sections": "Gibt die Abschnitte im geparsten Wikitext zurück.",
        "apihelp-parse-paramvalue-prop-revid": "Ergänzt die Versionskennung der geparsten Seite.",
        "apihelp-parse-paramvalue-prop-displaytitle": "Ergänzt den Titel des geparsten Wikitextes.",
+       "apihelp-parse-paramvalue-prop-headhtml": "Gibt geparsten <code>&lt;head&gt;</code> der Seite zurück.",
        "apihelp-parse-paramvalue-prop-jsconfigvars": "Gibt die JavaScript-Konfigurationsvariablen speziell für die Seite aus. Zur Anwendung verwende <code>mw.config.set()</code>.",
        "apihelp-parse-paramvalue-prop-encodedjsconfigvars": "Gibt die JavaScript-Konfigurationsvariablen speziell für die Seite als JSON-Zeichenfolge aus.",
        "apihelp-parse-paramvalue-prop-indicators": "Gibt das HTML der Seitenstatusindikatoren zurück, die auf der Seite verwendet werden.",
        "apihelp-parse-paramvalue-prop-iwlinks": "Gibt Interwiki-Links des geparsten Wikitextes zurück.",
        "apihelp-parse-paramvalue-prop-wikitext": "Gibt den originalen Wikitext zurück, der geparst wurde.",
        "apihelp-parse-paramvalue-prop-properties": "Gibt verschiedene Eigenschaften zurück, die im geparsten Wikitext definiert sind.",
+       "apihelp-parse-paramvalue-prop-parsewarnings": "Gibt die Warnungen aus, die beim Parsen des Inhalts aufgetreten sind.",
        "apihelp-parse-param-section": "Parst nur den Inhalt dieser Abschnittsnummer.\n\nFalls <kbd>new</kbd>, parst <var>$1text</var> und <var>$1sectiontitle</var>, als ob ein neuer Abschnitt der Seite hinzugefügt wird.\n\n<kbd>new</kbd> ist nur erlaubt mit der Angabe <var>text</var>.",
        "apihelp-parse-param-sectiontitle": "Überschrift des neuen Abschnittes, wenn <var>section</var> = <kbd>new</kbd> ist.\n\nAnders als beim Bearbeiten der Seite wird der Parameter nicht durch die <var>summary</var> ersetzt, wenn er weggelassen oder leer ist.",
        "apihelp-parse-param-disablepp": "Benutze <var>$1disablelimitreport</var> stattdessen.",
        "apihelp-query+langlinks-paramvalue-prop-url": "Ergänzt die vollständige URL.",
        "apihelp-query+langlinks-paramvalue-prop-autonym": "Ergänzt den Namen der Muttersprache.",
        "apihelp-query+langlinks-param-dir": "Die Auflistungsrichtung.",
+       "apihelp-query+links-description": "Gibt alle Links von den angegebenen Seiten zurück.",
+       "apihelp-query+links-param-namespace": "Zeigt nur Links in diesen Namensräumen.",
        "apihelp-query+links-param-limit": "Wie viele Links zurückgegeben werden sollen.",
        "apihelp-query+links-param-dir": "Die Auflistungsrichtung.",
        "apihelp-query+links-example-simple": "Links von der <kbd>Hauptseite</kbd> abrufen",
        "apihelp-query+linkshere-param-prop": "Zurückzugebende Eigenschaften:",
        "apihelp-query+linkshere-paramvalue-prop-pageid": "Die Seitenkennung jeder Seite.",
        "apihelp-query+linkshere-paramvalue-prop-title": "Titel jeder Seite.",
+       "apihelp-query+linkshere-param-limit": "Wie viel zurückgegeben werden soll.",
+       "apihelp-query+linkshere-example-simple": "Holt eine Liste von Seiten, die auf [[Main Page]] verlinken.",
        "apihelp-query+logevents-description": "Ereignisse von den Logbüchern abrufen.",
        "apihelp-query+logevents-param-prop": "Zurückzugebende Eigenschaften:",
        "apihelp-query+logevents-paramvalue-prop-ids": "Ergänzt die Kennung des Logbuchereignisses.",
        "apihelp-query+logevents-example-simple": "Listet die letzten Logbuch-Ereignisse auf.",
        "apihelp-query+pageswithprop-paramvalue-prop-ids": "Fügt die Seitenkennung hinzu.",
        "apihelp-query+pageswithprop-param-limit": "Die maximale Anzahl zurückzugebender Seiten.",
+       "apihelp-query+pageswithprop-param-dir": "In welche Richtung sortiert werden soll.",
        "apihelp-query+prefixsearch-param-search": "Such-Zeichenfolge.",
+       "apihelp-query+prefixsearch-param-namespace": "Welche Namensräume durchsucht werden sollen.",
+       "apihelp-query+prefixsearch-param-limit": "Maximale Anzahl zurückzugebender Ergebnisse.",
        "apihelp-query+prefixsearch-param-offset": "Anzahl der zu überspringenden Ergebnisse.",
        "apihelp-query+prefixsearch-param-profile": "Zu verwendendes Suchprofil.",
+       "apihelp-query+protectedtitles-param-limit": "Wie viele Seiten insgesamt zurückgegeben werden sollen.",
        "apihelp-query+protectedtitles-param-prop": "Zurückzugebende Eigenschaften:",
        "apihelp-query+querypage-param-limit": "Anzahl der zurückzugebenden Ergebnisse.",
        "apihelp-query+recentchanges-description": "Listet die letzten Änderungen auf.",
        "apihelp-query+recentchanges-param-user": "Listet nur Änderungen von diesem Benutzer auf.",
        "apihelp-query+recentchanges-param-excludeuser": "Listet keine Änderungen von diesem Benutzer auf.",
        "apihelp-query+recentchanges-param-tag": "Listet nur Änderungen auf, die mit dieser Markierung markiert sind.",
+       "apihelp-query+recentchanges-param-prop": "Bezieht zusätzliche Informationen mit ein:",
        "apihelp-query+recentchanges-paramvalue-prop-comment": "Fügt den Kommentar für die Bearbeitung hinzu.",
        "apihelp-query+recentchanges-paramvalue-prop-flags": "Ergänzt Markierungen für die Bearbeitung.",
        "apihelp-query+recentchanges-paramvalue-prop-timestamp": "Ergänzt den Zeitstempel für die Bearbeitung.",
        "apihelp-query+search-param-limit": "Wie viele Seiten insgesamt zurückgegeben werden sollen.",
        "apihelp-query+search-example-simple": "Nach <kbd>meaning</kbd> suchen.",
        "apihelp-query+search-example-text": "Texte nach <kbd>meaning</kbd> durchsuchen.",
-       "apihelp-query+siteinfo-paramvalue-prop-languagevariants": "Gibt eine Liste für die Sprachcodes zurück, bei denen der [[mw:LanguageConverter|Sprachkonverter]] aktiviert ist und die unterstützten Varianten für jede Sprache.",
+       "apihelp-query+siteinfo-paramvalue-prop-languagevariants": "Gibt eine Liste für die Sprachcodes zurück, bei denen der [[mw:Special:MyLanguage/LanguageConverter|Sprachkonverter]] aktiviert ist und die unterstützten Varianten für jede Sprache.",
        "apihelp-query+siteinfo-example-simple": "Websiteinformationen abrufen",
        "apihelp-query+stashimageinfo-param-sessionkey": "Alias für $1filekey, für die Rückwärtskompatibilität.",
        "apihelp-query+stashimageinfo-example-simple": "Gibt Informationen für eine gespeicherte Datei zurück.",
        "apihelp-rsd-example-simple": "Das RSD-Schema exportieren",
        "apihelp-setnotificationtimestamp-param-entirewatchlist": "An allen beobachteten Seiten arbeiten.",
        "apihelp-setpagelanguage-description": "Ändert die Sprache einer Seite.",
-       "apihelp-setpagelanguage-description-disabled": "Das Ändern der Sprache von Seiten ist auf diesem Wiki nicht erlaubt.\n\nAktiviere <var>[[mw:Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]]</var>, um diese Aktion zu verwenden.",
+       "apihelp-setpagelanguage-description-disabled": "Das Ändern der Sprache von Seiten ist auf diesem Wiki nicht erlaubt.\n\nAktiviere <var>[[mw:Special:MyLanguage/Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]]</var>, um diese Aktion zu verwenden.",
        "apihelp-setpagelanguage-param-title": "Titel der Seite, deren Sprache du ändern möchtest. Kann nicht zusammen mit <var>$1pageid</var> verwendet werden.",
        "apihelp-setpagelanguage-param-pageid": "Kennung der Seite, deren Sprache du ändern möchtest. Kann nicht zusammen mit <var>$1title</var> verwendet werden.",
        "apihelp-setpagelanguage-param-lang": "Code der Sprache, auf den die Seite geändert werden soll. Verwende <kbd>default</kbd>, um die Seite auf die Standardinhaltssprache des Wikis zurückzusetzen.",
        "apihelp-xml-param-includexmlnamespace": "Falls angegeben, ergänzt einen XML-Namensraum.",
        "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 Darstellung des $1-Formats in HTML. HTML ist gut zur Fehlerbehebung geeignet, aber unpassend für die Nutzung durch Anwendungen.\n\nGib den Parameter <var>format</var> an, um das Ausgabeformat zu ändern. Lege <kbd>format=$2</kbd> fest, um die von HTML abweichende Darstellung des $1-Formats zu erhalten.\n\nSiehe auch die [[mw:API|vollständige Dokumentation der API]] oder die [[Special:ApiHelp/main|API-Hilfe]] für weitere Informationen.",
+       "api-format-prettyprint-header": "Dies ist die Darstellung des $1-Formats in HTML. HTML ist gut zur Fehlerbehebung geeignet, aber unpassend für die Nutzung durch Anwendungen.\n\nGib den Parameter <var>format</var> an, um das Ausgabeformat zu ändern. Lege <kbd>format=$2</kbd> fest, um die von HTML abweichende Darstellung des $1-Formats zu erhalten.\n\nSiehe auch die [[mw:Special:MyLanguage/API|vollständige Dokumentation der API]] 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-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]]",
        "api-help-param-token-webui": "Aus Kompatibilitätsgründen wird der in der Weboberfläche verwendete Token ebenfalls akzeptiert.",
-       "api-help-param-disabled-in-miser-mode": "Deaktiviert aufgrund des [[mw:Manual:$wgMiserMode|Miser-Modus]].",
+       "api-help-param-disabled-in-miser-mode": "Deaktiviert aufgrund des [[mw:Special:MyLanguage/Manual:$wgMiserMode|Miser-Modus]].",
        "api-help-param-continue": "Falls weitere Ergebnisse verfügbar sind, dies zum Fortfahren verwenden.",
        "api-help-param-no-description": "<span class=\"apihelp-empty\">(keine Beschreibung)</span>",
        "api-help-examples": "{{PLURAL:$1|Beispiel|Beispiele}}:",
        "api-help-right-apihighlimits": "Höhere Beschränkungen in API-Anfragen verwenden (langsame Anfragen: $1; schnelle Anfragen: $2). Die Beschränkungen für langsame Anfragen werden auch auf Mehrwertparameter angewandt.",
        "api-help-open-in-apisandbox": "<small>[in Spielwiese öffnen]</small>",
        "api-help-authmanagerhelper-messageformat": "Zu verwendendes Format zur Rückgabe von Nachrichten.",
+       "apierror-badgenerator-unknown": "<kbd>generator=$1</kbd> unbekannt.",
+       "apierror-badip": "Der IP-Parameter ist nicht gültig.",
+       "apierror-badmd5": "Die angegebene MD5-Prüfsumme war falsch.",
+       "apierror-badmodule-badsubmodule": "Das Modul <kbd>$1</kbd> hat kein Untermodul namens „$2“.",
+       "apierror-badmodule-nosubmodules": "Das Modul <kbd>$1</kbd> hat keine Untermodule.",
+       "apierror-badparameter": "Ungültiger Wert für den Parameter <var>$1</var>.",
+       "apierror-badquery": "Ungültige Abfrage.",
        "apierror-cannot-async-upload-file": "Die Parameter <var>async</var> und <var>file</var> können nicht kombiniert werden. Falls du eine asynchrone Verarbeitung deiner hochgeladenen Datei wünschst, lade sie zuerst mithilfe des Parameters <var>stash</var> auf den Speicher hoch. Veröffentliche anschließend die gespeicherte Datei asynchron mithilfe <var>filekey</var> und <var>async</var>.",
+       "apierror-invalidsection": "Der Parameter <var>section</var> muss eine gültige Abschnittskennung oder <kbd>new</kbd> sein.",
        "apierror-invaliduserid": "Die Benutzerkennung <var>$1</var> ist nicht gültig.",
        "apierror-nosuchuserid": "Es gibt keinen Benutzer mit der Kennung $1.",
        "apierror-pagelang-disabled": "Das Ändern der Sprache von Seiten ist auf diesem Wiki nicht erlaubt.",
index ab8a8a5..7a04caf 100644 (file)
@@ -6,10 +6,10 @@
                ]
        },
 
-       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Documentation]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Mailing list]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API Announcements]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Bugs & requests]\n</div>\n<strong>Status:</strong> All features shown on this page should be working, but the API is still in active development, and may change at any time. Subscribe to [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ the mediawiki-api-announce mailing list] for notice of updates.\n\n<strong>Erroneous requests:</strong> When erroneous requests are sent to the API, an HTTP header will be sent with the key \"MediaWiki-API-Error\" and then both the value of the header and the error code sent back will be set to the same value. For more information see [[mw:API:Errors_and_warnings|API: Errors and warnings]].\n\n<strong>Testing:</strong> For ease of testing API requests, see [[Special:ApiSandbox]].",
+       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:Special:MyLanguage/API:Main_page|Documentation]]\n* [[mw:Special:MyLanguage/API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Mailing list]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API Announcements]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Bugs & requests]\n</div>\n<strong>Status:</strong> All features shown on this page should be working, but the API is still in active development, and may change at any time. Subscribe to [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ the mediawiki-api-announce mailing list] for notice of updates.\n\n<strong>Erroneous requests:</strong> When erroneous requests are sent to the API, an HTTP header will be sent with the key \"MediaWiki-API-Error\" and then both the value of the header and the error code sent back will be set to the same value. For more information see [[mw:Special:MyLanguage/API:Errors_and_warnings|API: Errors and warnings]].\n\n<strong>Testing:</strong> For ease of testing API requests, see [[Special:ApiSandbox]].",
        "apihelp-main-param-action": "Which action to perform.",
        "apihelp-main-param-format": "The format of the output.",
-       "apihelp-main-param-maxlag": "Maximum lag can be used when MediaWiki is installed on a database replicated cluster. To save actions causing any more site replication lag, this parameter can make the client wait until the replication lag is less than the specified value. In case of excessive lag, error code <samp>maxlag</samp> is returned with a message like <samp>Waiting for $host: $lag seconds lagged</samp>.<br />See [[mw:Manual:Maxlag_parameter|Manual: Maxlag parameter]] for more information.",
+       "apihelp-main-param-maxlag": "Maximum lag can be used when MediaWiki is installed on a database replicated cluster. To save actions causing any more site replication lag, this parameter can make the client wait until the replication lag is less than the specified value. In case of excessive lag, error code <samp>maxlag</samp> is returned with a message like <samp>Waiting for $host: $lag seconds lagged</samp>.<br />See [[mw:Special:MyLanguage/Manual:Maxlag_parameter|Manual: Maxlag parameter]] for more information.",
        "apihelp-main-param-smaxage": "Set the <code>s-maxage</code> HTTP cache control header to this many seconds. Errors are never cached.",
        "apihelp-main-param-maxage": "Set the <code>max-age</code> HTTP cache control header to this many seconds. Errors are never cached.",
        "apihelp-main-param-assert": "Verify the user is logged in if set to <kbd>user</kbd>, or has the bot user right if <kbd>bot</kbd>.",
@@ -34,7 +34,7 @@
        "apihelp-block-param-autoblock": "Automatically block the last used IP address, and any subsequent IP addresses they try to login from.",
        "apihelp-block-param-noemail": "Prevent user from sending email through the wiki. (Requires the <code>blockemail</code> right).",
        "apihelp-block-param-hidename": "Hide the username from the block log. (Requires the <code>hideuser</code> right).",
-       "apihelp-block-param-allowusertalk": "Allow the user to edit their own talk page (depends on <var>[[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var>).",
+       "apihelp-block-param-allowusertalk": "Allow the user to edit their own talk page (depends on <var>[[mw:Special:MyLanguage/Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var>).",
        "apihelp-block-param-reblock": "If the user is already blocked, overwrite the existing block.",
        "apihelp-block-param-watchuser": "Watch the user's or IP address's user and talk pages.",
        "apihelp-block-param-tags": "Change tags to apply to the entry in the block log.",
        "apihelp-opensearch-param-search": "Search string.",
        "apihelp-opensearch-param-limit": "Maximum number of results to return.",
        "apihelp-opensearch-param-namespace": "Namespaces to search.",
-       "apihelp-opensearch-param-suggest": "Do nothing if <var>[[mw:Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]</var> is false.",
+       "apihelp-opensearch-param-suggest": "Do nothing if <var>[[mw:Special:MyLanguage/Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]</var> is false.",
        "apihelp-opensearch-param-redirects": "How to handle redirects:\n;return:Return the redirect itself.\n;resolve:Return the target page. May return fewer than $1limit results.\nFor historical reasons, the default is \"return\" for $1format=json and \"resolve\" for other formats.",
        "apihelp-opensearch-param-format": "The format of the output.",
        "apihelp-opensearch-param-warningsaserror": "If warnings are raised with <kbd>format=json</kbd>, return an API error instead of ignoring them.",
        "apihelp-parse-paramvalue-prop-limitreportdata": "Gives the limit report in a structured way. Gives no data, when <var>$1disablelimitreport</var> is set.",
        "apihelp-parse-paramvalue-prop-limitreporthtml": "Gives the HTML version of the limit report. Gives no data, when <var>$1disablelimitreport</var> is set.",
        "apihelp-parse-paramvalue-prop-parsetree": "The XML parse tree of revision content (requires content model <code>$1</code>)",
+       "apihelp-parse-paramvalue-prop-parsewarnings": "Gives the warnings that occurred while parsing content.",
        "apihelp-parse-param-pst": "Do a pre-save transform on the input before parsing it. Only valid when used with text.",
        "apihelp-parse-param-onlypst": "Do a pre-save transform (PST) on the input, but don't parse it. Returns the same wikitext, after a PST has been applied. Only valid when used with <var>$1text</var>.",
        "apihelp-parse-param-effectivelanglinks": "Includes language links supplied by extensions (for use with <kbd>$1prop=langlinks</kbd>).",
        "apihelp-query+alldeletedrevisions-param-user": "Only list revisions by this user.",
        "apihelp-query+alldeletedrevisions-param-excludeuser": "Don't list revisions by this user.",
        "apihelp-query+alldeletedrevisions-param-namespace": "Only list pages in this namespace.",
-       "apihelp-query+alldeletedrevisions-param-miser-user-namespace": "<strong>Note:</strong> Due to [[mw:Manual:$wgMiserMode|miser mode]], using <var>$1user</var> and <var>$1namespace</var> together may result in fewer than <var>$1limit</var> results returned before continuing; in extreme cases, zero results may be returned.",
+       "apihelp-query+alldeletedrevisions-param-miser-user-namespace": "<strong>Note:</strong> Due to [[mw:Special:MyLanguage/Manual:$wgMiserMode|miser mode]], using <var>$1user</var> and <var>$1namespace</var> together may result in fewer than <var>$1limit</var> results returned before continuing; in extreme cases, zero results may be returned.",
        "apihelp-query+alldeletedrevisions-param-generatetitles": "When being used as a generator, generate titles rather than revision IDs.",
        "apihelp-query+alldeletedrevisions-example-user": "List the last 50 deleted contributions by user <kbd>Example</kbd>.",
        "apihelp-query+alldeletedrevisions-example-ns-main": "List the first 50 deleted revisions in the main namespace.",
        "apihelp-query+filearchive-example-simple": "Show a list of all deleted files.",
 
        "apihelp-query+filerepoinfo-description": "Return meta information about image repositories configured on the wiki.",
-       "apihelp-query+filerepoinfo-param-prop": "Which repository properties to get (there may be more available on some wikis):\n;apiurl:URL to the repository API - helpful for getting image info from the host.\n;name:The key of the repository - used in e.g. <var>[[mw:Manual:$wgForeignFileRepos|$wgForeignFileRepos]]</var> and [[Special:ApiHelp/query+imageinfo|imageinfo]] return values.\n;displayname:The human-readable name of the repository wiki.\n;rooturl:Root URL for image paths.\n;local:Whether that repository is the local one or not.",
+       "apihelp-query+filerepoinfo-param-prop": "Which repository properties to get (there may be more available on some wikis):\n;apiurl:URL to the repository API - helpful for getting image info from the host.\n;name:The key of the repository - used in e.g. <var>[[mw:Special:MyLanguage/Manual:$wgForeignFileRepos|$wgForeignFileRepos]]</var> and [[Special:ApiHelp/query+imageinfo|imageinfo]] return values.\n;displayname:The human-readable name of the repository wiki.\n;rooturl:Root URL for image paths.\n;local:Whether that repository is the local one or not.",
        "apihelp-query+filerepoinfo-example-simple": "Get information about file repositories.",
 
        "apihelp-query+fileusage-description": "Find all pages that use the given files.",
        "apihelp-query+siteinfo-paramvalue-prop-rightsinfo": "Returns wiki rights (license) information if available.",
        "apihelp-query+siteinfo-paramvalue-prop-restrictions": "Returns information on available restriction (protection) types.",
        "apihelp-query+siteinfo-paramvalue-prop-languages": "Returns a list of languages MediaWiki supports (optionally localised by using <var>$1inlanguagecode</var>).",
-       "apihelp-query+siteinfo-paramvalue-prop-languagevariants": "Returns a list of language codes for which [[mw:LanguageConverter|LanguageConverter]] is enabled, and the variants supported for each.",
+       "apihelp-query+siteinfo-paramvalue-prop-languagevariants": "Returns a list of language codes for which [[mw:Special:MyLanguage/LanguageConverter|LanguageConverter]] is enabled, and the variants supported for each.",
        "apihelp-query+siteinfo-paramvalue-prop-skins": "Returns a list of all enabled skins (optionally localised by using <var>$1inlanguagecode</var>, otherwise in the content language).",
        "apihelp-query+siteinfo-paramvalue-prop-extensiontags": "Returns a list of parser extension tags.",
        "apihelp-query+siteinfo-paramvalue-prop-functionhooks": "Returns a list of parser function hooks.",
-       "apihelp-query+siteinfo-paramvalue-prop-showhooks": "Returns a list of all subscribed hooks (contents of <var>[[mw:Manual:$wgHooks|$wgHooks]]</var>).",
+       "apihelp-query+siteinfo-paramvalue-prop-showhooks": "Returns a list of all subscribed hooks (contents of <var>[[mw:Special:MyLanguage/Manual:$wgHooks|$wgHooks]]</var>).",
        "apihelp-query+siteinfo-paramvalue-prop-variables": "Returns a list of variable IDs.",
        "apihelp-query+siteinfo-paramvalue-prop-protocols": "Returns a list of protocols that are allowed in external links.",
        "apihelp-query+siteinfo-paramvalue-prop-defaultoptions": "Returns the default values for user preferences.",
        "apihelp-query+usercontribs-paramvalue-prop-flags": "Adds flags of the edit.",
        "apihelp-query+usercontribs-paramvalue-prop-patrolled": "Tags patrolled edits.",
        "apihelp-query+usercontribs-paramvalue-prop-tags": "Lists tags for the edit.",
-       "apihelp-query+usercontribs-param-show": "Show only items that meet these criteria, e.g. non minor edits only: <kbd>$2show=!minor</kbd>.\n\nIf <kbd>$2show=patrolled</kbd> or <kbd>$2show=!patrolled</kbd> is set, revisions older than <var>[[mw:Manual:$wgRCMaxAge|$wgRCMaxAge]]</var> ($1 {{PLURAL:$1|second|seconds}}) won't be shown.",
+       "apihelp-query+usercontribs-param-show": "Show only items that meet these criteria, e.g. non minor edits only: <kbd>$2show=!minor</kbd>.\n\nIf <kbd>$2show=patrolled</kbd> or <kbd>$2show=!patrolled</kbd> is set, revisions older than <var>[[mw:Special:MyLanguage/Manual:$wgRCMaxAge|$wgRCMaxAge]]</var> ($1 {{PLURAL:$1|second|seconds}}) won't be shown.",
        "apihelp-query+usercontribs-param-tag": "Only list revisions tagged with this tag.",
        "apihelp-query+usercontribs-param-toponly": "Only list changes which are the latest revision.",
        "apihelp-query+usercontribs-example-user": "Show contributions of user <kbd>Example</kbd>.",
        "apihelp-removeauthenticationdata-example-simple": "Attempt to remove the current user's data for <kbd>FooAuthenticationRequest</kbd>.",
 
        "apihelp-resetpassword-description": "Send a password reset email to a user.",
-       "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-description-noroutes": "No password reset routes are available.\n\nEnable routes in <var>[[mw:Special:MyLanguage/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-example-user": "Send a password reset email to user <kbd>Example</kbd>.",
        "apihelp-setnotificationtimestamp-example-allpages": "Reset the notification status for pages in the <kbd>{{ns:user}}</kbd> namespace.",
 
        "apihelp-setpagelanguage-description": "Change the language of a page.",
-       "apihelp-setpagelanguage-description-disabled": "Changing the language of a page is not allowed on this wiki.\n\nEnable <var>[[mw:Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]]</var> to use this action.",
+       "apihelp-setpagelanguage-description-disabled": "Changing the language of a page is not allowed on this wiki.\n\nEnable <var>[[mw:Special:MyLanguage/Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]]</var> to use this action.",
        "apihelp-setpagelanguage-param-title": "Title of the page whose language you wish to change. Cannot be used together with <var>$1pageid</var>.",
        "apihelp-setpagelanguage-param-pageid": "Page ID of the page whose language you wish to change. Cannot be used together with <var>$1title</var>.",
        "apihelp-setpagelanguage-param-lang": "Language code of the language to change the page to. Use <kbd>default</kbd> to reset the page to the wiki's default content language.",
        "apihelp-xmlfm-description": "Output data in XML format (pretty-print in HTML).",
 
        "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-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:Special:MyLanguage/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:Special:MyLanguage/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-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]]",
        "api-help-param-token-webui": "For compatibility, the token used in the web UI is also accepted.",
-       "api-help-param-disabled-in-miser-mode": "Disabled due to [[mw:Manual:$wgMiserMode|miser mode]].",
-       "api-help-param-limited-in-miser-mode": "<strong>Note:</strong> Due to [[mw:Manual:$wgMiserMode|miser mode]], using this may result in fewer than <var>$1limit</var> results returned before continuing; in extreme cases, zero results may be returned.",
+       "api-help-param-disabled-in-miser-mode": "Disabled due to [[mw:Special:MyLanguage/Manual:$wgMiserMode|miser mode]].",
+       "api-help-param-limited-in-miser-mode": "<strong>Note:</strong> Due to [[mw:Special:MyLanguage/Manual:$wgMiserMode|miser mode]], using this may result in fewer than <var>$1limit</var> results returned before continuing; in extreme cases, zero results may be returned.",
        "api-help-param-direction": "In which direction to enumerate:\n;newer:List oldest first. Note: $1start has to be before $1end.\n;older:List newest first (default). Note: $1start has to be later than $1end.",
        "api-help-param-continue": "When more results are available, use this to continue.",
        "api-help-param-no-description": "<span class=\"apihelp-empty\">(no description)</span>",
index d698b30..fb4c37f 100644 (file)
                        "The RedBurn"
                ]
        },
-       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Documentation]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Liste de diffusion]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Annonces de l’API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Bogues et demandes]\n</div>\n<strong>État :</strong> Toutes les fonctionnalités affichées sur cette page devraient fonctionner, mais l’API est encore en cours de développement et peut changer à tout moment. Inscrivez-vous à [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ la liste de diffusion mediawiki-api-announce] pour être informé des mises à jour.\n\n<strong>Requêtes erronées :</strong> Si des requêtes erronées sont envoyées à l’API, un en-tête HTTP sera renvoyé avec la clé « MediaWiki-API-Error ». La valeur de cet en-tête et le code d’erreur renvoyé prendront la même valeur. Pour plus d’information, voyez [[mw:API:Errors_and_warnings|API: Errors and warnings]].\n\n<strong>Test :</strong> Pour faciliter le test des requêtes de l’API, voyez [[Special:ApiSandbox]].",
+       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:Special:MyLanguage/API:Main_page|Documentation]]\n* [[mw:Special:MyLanguage/API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Liste de diffusion]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Annonces de l’API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Bogues et demandes]\n</div>\n<strong>État :</strong> Toutes les fonctionnalités affichées sur cette page devraient fonctionner, mais l’API est encore en cours de développement et peut changer à tout moment. Inscrivez-vous à [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ la liste de diffusion mediawiki-api-announce] pour être informé des mises à jour.\n\n<strong>Requêtes erronées :</strong> Si des requêtes erronées sont envoyées à l’API, un entête HTTP sera renvoyé avec la clé « MediaWiki-API-Error ». La valeur de cet entête et le code d’erreur renvoyé prendront la même valeur. Pour plus d’information, voyez [[mw:Special:MyLanguage/API:Errors_and_warnings|API: Errors and warnings]].\n\n<strong>Test :</strong> Pour faciliter le test des requêtes de l’API, voyez [[Special:ApiSandbox]].",
        "apihelp-main-param-action": "Quelle action effectuer.",
        "apihelp-main-param-format": "Le format de sortie.",
-       "apihelp-main-param-maxlag": "La latence maximale peut être utilisée quand MédiaWiki est installé sur un cluster de base de données répliqué. Pour éviter des actions provoquant un supplément de latence de réplication de site, ce paramètre peut faire attendre le client jusqu’à ce que la latence de réplication soit inférieure à une valeur spécifiée. En cas de latence excessive, le code d’erreur <samp>maxlag</samp> est renvoyé avec un message tel que <samp>Attente de $host : $lag secondes de délai</samp>.<br />Voyez [[mw:Manual:Maxlag_parameter|Manuel: Maxlag parameter]] pour plus d’information.",
+       "apihelp-main-param-maxlag": "La latence maximale peut être utilisée quand MédiaWiki est installé sur un cluster de base de données répliqué. Pour éviter des actions provoquant un supplément de latence de réplication de site, ce paramètre peut faire attendre le client jusqu’à ce que la latence de réplication soit inférieure à une valeur spécifiée. En cas de latence excessive, le code d’erreur <samp>maxlag</samp> est renvoyé avec un message tel que <samp>Attente de $host : $lag secondes de délai</samp>.<br />Voyez [[mw:Special:MyLanguage/Manual:Maxlag_parameter|Manuel: Maxlag parameter]] pour plus d’information.",
        "apihelp-main-param-smaxage": "Fixer l’entête HTTP de contrôle de cache <code>s-maxage</code> à ce nombre de secondes. Les erreurs ne sont jamais mises en cache.",
        "apihelp-main-param-maxage": "Fixer l’entête HTTP de contrôle de cache <code>max-age</code> à ce nombre de secondes. Les erreurs ne sont jamais mises en cache.",
        "apihelp-main-param-assert": "Vérifier si l’utilisateur est connecté si positionné à <kbd>user</kbd>, ou s'il a le droit d'un utilisateur robot si positionné à <kbd>bot</kbd>.",
@@ -57,7 +57,7 @@
        "apihelp-block-param-autoblock": "Bloquer automatiquement la dernière adresse IP utilisée, et toute les adresses IP subséquentes depuis lesquelles ils ont essayé de se connecter.",
        "apihelp-block-param-noemail": "Empêcher l’utilisateur d’envoyer des courriels via le wiki (nécessite le droit <code>blockemail</code>).",
        "apihelp-block-param-hidename": "Masque le nom de l’utilisateur dans le journal des blocages (nécessite le droit <code>hideuser</code>).",
-       "apihelp-block-param-allowusertalk": "Autoriser les utilisateurs à modifier leur propre page de discussion (dépend de <var>[[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var>).",
+       "apihelp-block-param-allowusertalk": "Autoriser les utilisateurs à modifier leur propre page de discussion (dépend de <var>[[mw:Special:MyLanguage/Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var>).",
        "apihelp-block-param-reblock": "Si l’utilisateur est déjà bloqué, écraser le blocage existant.",
        "apihelp-block-param-watchuser": "Surveiller les pages utilisateur et de discussion de l’utilisateur ou de l’adresse IP.",
        "apihelp-block-param-tags": "Modifier les balises à appliquer à l’entrée du journal des blocages.",
        "apihelp-opensearch-param-search": "Chaîne de caractères cherchée.",
        "apihelp-opensearch-param-limit": "Nombre maximal de résultats à renvoyer.",
        "apihelp-opensearch-param-namespace": "Espaces de nom à rechercher.",
-       "apihelp-opensearch-param-suggest": "Ne rien faire si <var>[[mw:Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]</var> vaut faux.",
+       "apihelp-opensearch-param-suggest": "Ne rien faire si <var>[[mw:Special:MyLanguage/Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]</var> vaut faux.",
        "apihelp-opensearch-param-redirects": "Comment gérer les redirections :\n;return:Renvoie la redirection elle-même.\n;resolve:Renvoie la page cible. Peut renvoyer moins de $1limit résultats.\nPour des raisons historiques, la valeur par défaut est « return » pour $1format=json et « resolve » pour les autres formats.",
        "apihelp-opensearch-param-format": "Le format de sortie.",
        "apihelp-opensearch-param-warningsaserror": "Si des avertissements apparaissent avec <kbd>format=json</kbd>, renvoyer une erreur d’API au lieu de les ignorer.",
        "apihelp-parse-paramvalue-prop-limitreportdata": "Fournit le rapport de limite d’une manière structurée. Ne fournit aucune donnée, si <var>$1disablelimitreport</var> est positionné.",
        "apihelp-parse-paramvalue-prop-limitreporthtml": "Fournit la version HTML du rapport de limite. Ne fournit aucune donnée, si <var>$1disablelimitreport</var> est positionné.",
        "apihelp-parse-paramvalue-prop-parsetree": "L’arbre d’analyse XML du contenu de la révision (nécessite le modèle de contenu <code>$1</code>)",
+       "apihelp-parse-paramvalue-prop-parsewarnings": "Fournit les messages d'avertissement qui sont apparus lors de l'analyse de contenu.",
        "apihelp-parse-param-pst": "Faire une transformation avant enregistrement de l’entrée avant de l’analyser. Valide uniquement quand utilisé avec du texte.",
        "apihelp-parse-param-onlypst": "Faire une transformation avant enregistrement (PST) de l’entrée, mais ne pas l’analyser. Renvoie le même wikitexte, après que la PST a été appliquée. Valide uniquement quand utilisé avec <var>$1text</var>.",
        "apihelp-parse-param-effectivelanglinks": "Inclut les liens de langue fournis par les extensions (à utiliser avec <kbd>$1prop=langlinks</kbd>).",
        "apihelp-query+alldeletedrevisions-param-user": "Lister uniquement les révisions par cet utilisateur.",
        "apihelp-query+alldeletedrevisions-param-excludeuser": "Ne pas lister les révisions par cet utilisateur.",
        "apihelp-query+alldeletedrevisions-param-namespace": "Lister uniquement les pages dans cet espace de noms.",
-       "apihelp-query+alldeletedrevisions-param-miser-user-namespace": "<strong>REMARQUE :</strong> du fait du [[mw:Manual:$wgMiserMode|mode minimal]], utiliser <var>$1user</var> et <var>$1namespace</var> ensemble peut aboutir à moins de résultats renvoyés que <var>$1limit</var> avant de continuer ; dans les cas extrêmes, zéro résultats peuvent être renvoyés.",
+       "apihelp-query+alldeletedrevisions-param-miser-user-namespace": "<strong>REMARQUE :</strong> du fait du [[mw:Special:MyLanguage/Manual:$wgMiserMode|mode minimal]], utiliser <var>$1user</var> et <var>$1namespace</var> ensemble peut aboutir à avoir moins de résultats renvoyés que <var>$1limit</var> avant de continuer ; dans les cas extrêmes, zéro résultats peuvent être renvoyés.",
        "apihelp-query+alldeletedrevisions-param-generatetitles": "Utilisé comme générateur, générer des titres plutôt que des IDs de révision.",
        "apihelp-query+alldeletedrevisions-example-user": "Lister les 50 dernières contributions supprimées par l'utilisateur <kbd>Example</kbd>.",
        "apihelp-query+alldeletedrevisions-example-ns-main": "Lister les 50 premières révisions supprimées dans l’espace de noms principal.",
        "apihelp-query+filearchive-paramvalue-prop-archivename": "Ajoute le nom de fichier de la version d’archive pour les versions autres que la dernière.",
        "apihelp-query+filearchive-example-simple": "Afficher une liste de tous les fichiers supprimés",
        "apihelp-query+filerepoinfo-description": "Renvoyer les méta-informations sur les référentiels d’images configurés dans le wiki.",
-       "apihelp-query+filerepoinfo-param-prop": "Quelles propriétés du référentiel récupérer (il peut y en avoir plus de disponibles sur certains wikis) :\n;apiurl:URL de l’API du référentiel - utile pour obtenir les infos de l’image depuis l’hôte.\n;name:La clé du référentiel - utilisé par ex. dans les valeurs de retour de <var>[[mw:Manual:$wgForeignFileRepos|$wgForeignFileRepos]]</var> et [[Special:ApiHelp/query+imageinfo|imageinfo]].\n;displayname:Le nom lisible du wiki référentiel.\n;rooturl:URL racine des chemins d’image.\n;local:Si ce référentiel est le référentiel local ou non.",
+       "apihelp-query+filerepoinfo-param-prop": "Quelles propriétés du référentiel récupérer (il peut y en avoir plus de disponibles sur certains wikis) :\n;apiurl:URL de l’API du référentiel - utile pour obtenir les infos de l’image depuis l’hôte.\n;name:La clé du référentiel - utilisé par ex. dans les valeurs de retour de <var>[[mw:Special:MyLanguage/Manual:$wgForeignFileRepos|$wgForeignFileRepos]]</var> et [[Special:ApiHelp/query+imageinfo|imageinfo]].\n;displayname:Le nom lisible du wiki référentiel.\n;rooturl:URL racine des chemins d’image.\n;local:Si ce référentiel est le référentiel local ou non.",
        "apihelp-query+filerepoinfo-example-simple": "Obtenir des informations sur les référentiels de fichier.",
        "apihelp-query+fileusage-description": "Trouver toutes les pages qui utilisent les fichiers donnés.",
        "apihelp-query+fileusage-param-prop": "Quelles propriétés obtenir :",
        "apihelp-query+pageswithprop-example-generator": "Obtenir des informations supplémentaires sur les 10 premières pages utilisant <code>_&#95;NOTOC_&#95;</code>.",
        "apihelp-query+prefixsearch-description": "Effectuer une recherche de préfixe sur les titres de page.\n\nMalgré les similarités dans le nom, ce module n’est pas destiné à être l’équivalent de [[Special:PrefixIndex]] ; pour cela, voyez <kbd>[[Special:ApiHelp/query+allpages|action=query&list=allpages]]</kbd> avec le paramètre <kbd>apprefix</kbd>. Le but de ce module est similaire à <kbd>[[Special:ApiHelp/opensearch|action=opensearch]]</kbd> : prendre l’entrée utilisateur et fournir les meilleurs titres s’en approchant. Selon le serveur du moteur de recherche, cela peut inclure corriger des fautes de frappe, éviter des redirections, ou d’autres heuristiques.",
        "apihelp-query+prefixsearch-param-search": "Chaîne de recherche.",
-       "apihelp-query+prefixsearch-param-namespace": "Espaces de nom à rechercher.",
+       "apihelp-query+prefixsearch-param-namespace": "Espaces de noms à rechercher.",
        "apihelp-query+prefixsearch-param-limit": "Nombre maximal de résultats à renvoyer.",
        "apihelp-query+prefixsearch-param-offset": "Nombre de résultats à sauter.",
        "apihelp-query+prefixsearch-example-simple": "Rechercher les titres de page commençant par <kbd>meaning</kbd>.",
        "apihelp-query+protectedtitles-paramvalue-prop-expiry": "Ajoute l’horodatage de levée de la protection.",
        "apihelp-query+protectedtitles-paramvalue-prop-level": "Ajoute le niveau de protection.",
        "apihelp-query+protectedtitles-example-simple": "Lister les titres protégés",
-       "apihelp-query+protectedtitles-example-generator": "Trouver les liens vers les titres protégés dans l’espace de noms principal",
-       "apihelp-query+querypage-description": "Obtenir une liste fournie par une page spéciale basée sur QueryPage",
-       "apihelp-query+querypage-param-page": "Le nom de la page spéciale. Remarque, ce nom est sensible à la casse.",
+       "apihelp-query+protectedtitles-example-generator": "Trouver les liens vers les titres protégés dans l’espace de noms principal.",
+       "apihelp-query+querypage-description": "Obtenir une liste fournie par une page spéciale basée sur QueryPage.",
+       "apihelp-query+querypage-param-page": "Le nom de la page spéciale. Notez que ce nom est sensible à la casse.",
        "apihelp-query+querypage-param-limit": "Nombre de résultats à renvoyer.",
        "apihelp-query+querypage-example-ancientpages": "Renvoyer les résultats de [[Special:Ancientpages]].",
        "apihelp-query+random-description": "Obtenir un ensemble de pages au hasard.\n\nLes pages sont listées dans un ordre prédéterminé, seul le point de départ est aléatoire. Par exemple, cela signifie que si la première page dans la liste est <samp>Accueil</samp>, la seconde sera <em>toujours</em> <samp>Liste des singes de fiction</samp>, la troisième <samp>Liste de personnes figurant sur les timbres de Vanuatu</samp>, etc.",
        "apihelp-query+random-param-limit": "Limiter le nombre de pages aléatoires renvoyées.",
        "apihelp-query+random-param-redirect": "Utilisez <kbd>$1filterredir=redirects</kbd> au lieu de ce paramètre.",
        "apihelp-query+random-param-filterredir": "Comment filtrer les redirections.",
-       "apihelp-query+random-example-simple": "Obtenir deux pages aléatoires de l’espace principal",
-       "apihelp-query+random-example-generator": "Renvoyer les informations de la page sur deux pages au hasard de l’espace de noms principal",
+       "apihelp-query+random-example-simple": "Obtenir deux pages aléatoires de l’espace de noms principal.",
+       "apihelp-query+random-example-generator": "Renvoyer les informations de la page sur deux pages au hasard de l’espace de noms principal.",
        "apihelp-query+recentchanges-description": "Énumérer les modifications récentes.",
        "apihelp-query+recentchanges-param-start": "L’horodatage auquel démarrer l’énumération.",
        "apihelp-query+recentchanges-param-end": "L’horodatage auquel arrêter l’énumération.",
-       "apihelp-query+recentchanges-param-namespace": "Filtrer les modifications uniquement sur ces espaces de nom.",
-       "apihelp-query+recentchanges-param-user": "Lister uniquement les modifications par cet utilisateur.",
-       "apihelp-query+recentchanges-param-excludeuser": "Ne pas lister les modifications par cet utilisateur.",
+       "apihelp-query+recentchanges-param-namespace": "Filtrer les modifications uniquement sur ces espaces de noms.",
+       "apihelp-query+recentchanges-param-user": "Lister uniquement les modifications faites par cet utilisateur.",
+       "apihelp-query+recentchanges-param-excludeuser": "Ne pas lister les modifications faites par cet utilisateur.",
        "apihelp-query+recentchanges-param-tag": "Lister uniquement les modifications marquées avec cette balise.",
        "apihelp-query+recentchanges-param-prop": "Inclure des informations supplémentaires :",
-       "apihelp-query+recentchanges-paramvalue-prop-user": "Ajoute l’utilisateur responsable de la modification et marque si c’est une adresse IP.",
+       "apihelp-query+recentchanges-paramvalue-prop-user": "Ajoute l’utilisateur responsable de la modification et marque s'il s'agit d'une adresse IP.",
        "apihelp-query+recentchanges-paramvalue-prop-userid": "Ajoute l’ID de l’utilisateur responsable de la modification.",
        "apihelp-query+recentchanges-paramvalue-prop-comment": "Ajoute le commentaire de la modification.",
        "apihelp-query+recentchanges-paramvalue-prop-parsedcomment": "Ajoute le commentaire analysé pour la modification.",
        "apihelp-query+recentchanges-paramvalue-prop-flags": "Ajoute les balises de la modification.",
        "apihelp-query+recentchanges-paramvalue-prop-timestamp": "Ajoute l’horodatage de la modification.",
        "apihelp-query+recentchanges-paramvalue-prop-title": "Ajoute le titre de la page modifiée.",
-       "apihelp-query+recentchanges-paramvalue-prop-ids": "Ajoute l’ID de la page, l’ID des modifications récentes et l’ID de l’ancienne et la nouvelle révisions.",
-       "apihelp-query+recentchanges-paramvalue-prop-sizes": "Ajoute l’ancienne et la nouvelle tailles de la page en octets.",
+       "apihelp-query+recentchanges-paramvalue-prop-ids": "Ajoute l’ID de la page, l’ID des modifications récentes et l’ID de l’ancienne et de la nouvelle révision.",
+       "apihelp-query+recentchanges-paramvalue-prop-sizes": "Ajoute l’ancienne et la nouvelle taille de la page en octets.",
        "apihelp-query+recentchanges-paramvalue-prop-redirect": "Marque la modification si la page est une redirection.",
        "apihelp-query+recentchanges-paramvalue-prop-patrolled": "Marque les modifications patrouillables comme patrouillées ou non.",
        "apihelp-query+recentchanges-paramvalue-prop-loginfo": "Ajoute les informations du journal (Id du journal, type de trace, etc.) aux entrées du journal.",
        "apihelp-query+redirects-paramvalue-prop-pageid": "ID de page de chaque redirection.",
        "apihelp-query+redirects-paramvalue-prop-title": "Titre de chaque redirection.",
        "apihelp-query+redirects-paramvalue-prop-fragment": "Fragment de chaque redirection, s’il y en a un.",
-       "apihelp-query+redirects-param-namespace": "Inclure uniquement les pages dans ces espaces de nom.",
+       "apihelp-query+redirects-param-namespace": "Inclure uniquement les pages dans ces espaces de noms.",
        "apihelp-query+redirects-param-limit": "Combien de redirections renvoyer.",
        "apihelp-query+redirects-param-show": "Afficher uniquement les éléments correspondant à ces critères :\n;fragment:Afficher uniquement les redirections avec un fragment.\n;!fragment:Afficher uniquement les redirections sans fragment.",
        "apihelp-query+redirects-example-simple": "Obtenir une liste des redirections vers [[Main Page]]",
        "apihelp-query+revisions-param-excludeuser": "Exclure les révisions faites par l’utilisateur.",
        "apihelp-query+revisions-param-tag": "Lister uniquement les révisions marquées avec cette balise.",
        "apihelp-query+revisions-param-token": "Quels jetons obtenir pour chaque révision.",
-       "apihelp-query+revisions-example-content": "Obtenir des données avec le contenu pour la dernière révision des titres <kbd>API</kbd> et <kbd>Page principale</kbd>.",
+       "apihelp-query+revisions-example-content": "Obtenir des données avec le contenu pour la dernière révision des titres <kbd>API</kbd> et <kbd>Main Page</kbd>.",
        "apihelp-query+revisions-example-last5": "Obtenir les 5 dernières révisions de la <kbd>Main Page</kbd>.",
        "apihelp-query+revisions-example-first5": "Obtenir les 5 premières révisions de la <kbd>Page principale</kbd>.",
        "apihelp-query+revisions-example-first5-after": "Obtenir les 5 premières révisions de la <kbd>Page principale</kbd> faites après le 01/05/2006.",
        "apihelp-query+revisions+base-param-generatexml": "Générer l’arbre d’analyse XML pour le contenu de la révision (nécessite $1prop=content ; remplacé par <kbd>$1prop=parsetree</kbd>).",
        "apihelp-query+revisions+base-param-parse": "Analyser le contenu de la révision (nécessite $1prop=content). Pour des raisons de performance, si cette option est utilisée, $1limit est forcé à 1.",
        "apihelp-query+revisions+base-param-section": "Récupérer uniquement le contenu de ce numéro de section.",
-       "apihelp-query+revisions+base-param-diffto": "ID de révision à comparer à chaque révision. Utiliser <kbd>prev</kbd>, <kbd>next</kbd> et <kbd>cur</kbd> pour la version précédente, suivante et actuelle respectivement.",
+       "apihelp-query+revisions+base-param-diffto": "ID de révision à prendre pour comparer chaque révision. Utiliser <kbd>prev</kbd>, <kbd>next</kbd> et <kbd>cur</kbd> pour la version précédente, suivante et actuelle respectivement.",
        "apihelp-query+revisions+base-param-difftotext": "Texte auquel comparer chaque révision. Compare uniquement un nombre limité de révisions. Écrase <var>$1diffto</var>. Si <var>$1section</var> est positionné, seule cette section sera comparée avec ce texte.",
        "apihelp-query+revisions+base-param-difftotextpst": "Effectuer une transformation avant enregistrement sur le texte avant de le comparer. Valide uniquement quand c’est utilisé avec <var>$1difftotext</var>.",
        "apihelp-query+revisions+base-param-contentformat": "Format de sérialisation utilisé pour <var>$1difftotext</var> et attendu pour la sortie du contenu.",
        "apihelp-query+search-paramvalue-prop-sectiontitle": "Ajoute le titre de la section correspondante.",
        "apihelp-query+search-paramvalue-prop-categorysnippet": "Ajoute un extrait analysé de la catégorie correspondante.",
        "apihelp-query+search-paramvalue-prop-isfilematch": "Ajoute un booléen indiquant si la recherche correspond au contenu du fichier.",
-       "apihelp-query+search-paramvalue-prop-score": "<span class=\"apihelp-deprecated\">Désuet et ignoré.</span>",
+       "apihelp-query+search-paramvalue-prop-score": "<span class=\"apihelp-deprecated\">Obsolète et ignoré.</span>",
        "apihelp-query+search-paramvalue-prop-hasrelated": "<span class=\"apihelp-deprecated\">Obsolète et ignoré.</span>",
        "apihelp-query+search-param-limit": "Combien de pages renvoyer au total.",
        "apihelp-query+search-param-interwiki": "Inclure les résultats interwiki dans la recherche, s’ils sont disponibles.",
        "apihelp-query+search-param-backend": "Quel serveur de recherche utiliser, si ce n’est pas celui par défaut.",
        "apihelp-query+search-param-enablerewrites": "Activer la réécriture interne de la requête. Les serveurs de recherche peuvent changer la requête en une autre dont ils estiment qu'elle donne de meilleurs résultats, par exemple en corrigeant l'orthographe.",
        "apihelp-query+search-example-simple": "Rechercher <kbd>meaning</kbd>.",
-       "apihelp-query+search-example-text": "Rechercher des textes pour <kbd>signification</kbd>.",
+       "apihelp-query+search-example-text": "Rechercher des textes pour <kbd>meaning</kbd>.",
        "apihelp-query+search-example-generator": "Obtenir les informations sur les pages renvoyées par une recherche de <kbd>meaning</kbd>.",
        "apihelp-query+siteinfo-description": "Renvoyer les informations générales sur le site.",
        "apihelp-query+siteinfo-param-prop": "Quelles informations obtenir :",
        "apihelp-query+siteinfo-paramvalue-prop-general": "Information globale du système.",
-       "apihelp-query+siteinfo-paramvalue-prop-namespaces": "Liste des espaces de nom déclarés et leur nom canonique.",
-       "apihelp-query+siteinfo-paramvalue-prop-namespacealiases": "Liste des alias des espaces de nom déclarés.",
+       "apihelp-query+siteinfo-paramvalue-prop-namespaces": "Liste des espaces de noms déclarés avec leur nom canonique.",
+       "apihelp-query+siteinfo-paramvalue-prop-namespacealiases": "Liste des alias des espaces de noms déclarés.",
        "apihelp-query+siteinfo-paramvalue-prop-specialpagealiases": "Liste des alias des pages spéciales.",
        "apihelp-query+siteinfo-paramvalue-prop-magicwords": "Liste des mots magiques et leurs alias.",
        "apihelp-query+siteinfo-paramvalue-prop-statistics": "Renvoie les statistiques du site.",
        "apihelp-query+siteinfo-paramvalue-prop-interwikimap": "Renvoie la correspondance interwiki (éventuellement filtrée, éventuellement localisée en utilisant <var>$1inlanguagecode</var>).",
-       "apihelp-query+siteinfo-paramvalue-prop-dbrepllag": "Renvoie le serveur de base de donnée avec la plus grande latence de réplication.",
+       "apihelp-query+siteinfo-paramvalue-prop-dbrepllag": "Renvoie le serveur de base de données ayant la plus grande latence de réplication.",
        "apihelp-query+siteinfo-paramvalue-prop-usergroups": "Renvoie les groupes utilisateur et les droits associés.",
        "apihelp-query+siteinfo-paramvalue-prop-libraries": "Renvoie les bibliothèques installées sur le wiki.",
        "apihelp-query+siteinfo-paramvalue-prop-extensions": "Renvoie les extensions installées sur le wiki.",
        "apihelp-query+siteinfo-paramvalue-prop-rightsinfo": "Renvoie l’information sur les droits du wiki (sa licence), si elle est disponible.",
        "apihelp-query+siteinfo-paramvalue-prop-restrictions": "Renvoie l’information sur les types de restriction disponibles (protection).",
        "apihelp-query+siteinfo-paramvalue-prop-languages": "Renvoie une liste des langues que MédiaWiki prend en charge (éventuellement localisée en utilisant <var>$1inlanguagecode</var>).",
-       "apihelp-query+siteinfo-paramvalue-prop-languagevariants": "Renvoie une liste de codes de langue pour lesquels [[mw:LanguageConverter|LanguageConverter]] est activé, et les variantes supportées pour chacun.",
+       "apihelp-query+siteinfo-paramvalue-prop-languagevariants": "Renvoie une liste de codes de langue pour lesquels [[mw:Special:MyLanguage/LanguageConverter|LanguageConverter]] est activé, et les variantes supportées pour chacun.",
        "apihelp-query+siteinfo-paramvalue-prop-skins": "Renvoie une liste de tous les habillages activés (éventuellement localisé en utilisant <var>$1inlanguagecode</var>, sinon dans la langue du contenu).",
        "apihelp-query+siteinfo-paramvalue-prop-extensiontags": "Renvoie une liste des balises d’extension de l’analyseur.",
        "apihelp-query+siteinfo-paramvalue-prop-functionhooks": "Renvoie une liste des accroches de fonction de l’analyseur.",
-       "apihelp-query+siteinfo-paramvalue-prop-showhooks": "Renvoie une liste de toutes les accroches souscrites (contenu de <var>[[mw:Manual:$wgHooks|$wgHooks]]</var>).",
-       "apihelp-query+siteinfo-paramvalue-prop-variables": "Renvoie une liste des IDs de variable.",
-       "apihelp-query+siteinfo-paramvalue-prop-protocols": "Renvoie une liste des protocoles qui sont autorisés dans les liens externes.",
+       "apihelp-query+siteinfo-paramvalue-prop-showhooks": "Renvoie une liste de toutes les accroches souscrites (contenu de <var>[[mw:Special:MyLanguage/Manual:$wgHooks|$wgHooks]]</var>).",
+       "apihelp-query+siteinfo-paramvalue-prop-variables": "Renvoie une liste d'IDs de variable.",
+       "apihelp-query+siteinfo-paramvalue-prop-protocols": "Renvoie une liste de protocoles autorisés dans les liens externes.",
        "apihelp-query+siteinfo-paramvalue-prop-defaultoptions": "Renvoie les valeurs par défaut pour les préférences utilisateur.",
        "apihelp-query+siteinfo-paramvalue-prop-uploaddialog": "Renvoie la configuration du dialogue de téléversement.",
        "apihelp-query+siteinfo-param-filteriw": "Renvoyer uniquement les entrées locales ou uniquement les non locales de la correspondance interwiki.",
        "apihelp-query+siteinfo-param-showalldb": "Lister tous les serveurs de base de données, pas seulement celui avec la plus grande latence.",
        "apihelp-query+siteinfo-param-numberingroup": "Liste le nombre d’utilisateurs dans les groupes.",
        "apihelp-query+siteinfo-param-inlanguagecode": "Code de langue pour les noms de langue localisés (du mieux possible) et les noms d’habillage.",
-       "apihelp-query+siteinfo-example-simple": "Extraire les informations du site",
-       "apihelp-query+siteinfo-example-interwiki": "Extraire une liste des préfixes interwiki locaux",
-       "apihelp-query+siteinfo-example-replag": "Vérifier la latence de réplication actuelle",
+       "apihelp-query+siteinfo-example-simple": "Extraire les informations du site.",
+       "apihelp-query+siteinfo-example-interwiki": "Extraire une liste des préfixes interwiki locaux.",
+       "apihelp-query+siteinfo-example-replag": "Vérifier la latence de réplication actuelle.",
        "apihelp-query+stashimageinfo-description": "Renvoie les informations de fichier des fichiers mis en réserve.",
        "apihelp-query+stashimageinfo-param-filekey": "Clé qui identifie un téléchargement précédent qui a été temporairement mis en réserve.",
-       "apihelp-query+stashimageinfo-param-sessionkey": "Alias pour $1filekey, pour la compatibilité descendante.",
+       "apihelp-query+stashimageinfo-param-sessionkey": "Alias pour $1filekey, pour la compatibilité ascendante.",
        "apihelp-query+stashimageinfo-example-simple": "Renvoie les informations sur un fichier mis en réserve.",
-       "apihelp-query+stashimageinfo-example-params": "Renvoie les vignettes pour deux fichiers mis en réserve",
+       "apihelp-query+stashimageinfo-example-params": "Renvoie les vignettes pour deux fichiers mis de côté.",
        "apihelp-query+tags-description": "Lister les balises de modification.",
        "apihelp-query+tags-param-limit": "Le nombre maximal de balises à lister.",
        "apihelp-query+tags-param-prop": "Quelles propriétés récupérer :",
        "apihelp-query+tags-paramvalue-prop-description": "Ajoute la description de la balise.",
        "apihelp-query+tags-paramvalue-prop-hitcount": "Ajoute le nombre de révisions et d’entrées du journal qui ont cette balise.",
        "apihelp-query+tags-paramvalue-prop-defined": "Indique si la balise est définie.",
-       "apihelp-query+tags-paramvalue-prop-source": "Obtient les sources de la balise, ce qui comprend <samp>extension</samp> pour les balises définies par une extension et <samp>manual</samp> pour les balises pouvant être appliquées manuellement par les utilisateurs.",
+       "apihelp-query+tags-paramvalue-prop-source": "Retourne les sources de la balise, ce qui comprend <samp>extension</samp> pour les balises définies par une extension et <samp>manual</samp> pour les balises pouvant être appliquées manuellement par les utilisateurs.",
        "apihelp-query+tags-paramvalue-prop-active": "Si la balise est encore appliquée.",
        "apihelp-query+tags-example-simple": "Lister les balises disponibles",
        "apihelp-query+templates-description": "Renvoie toutes les pages incluses dans les pages fournies.",
        "apihelp-query+transcludedin-param-show": "Afficher uniquement les éléments qui correspondent à ces critères:\n;redirect:Afficher uniquement les redirections.\n;!redirect:Afficher uniquement les non-redirections.",
        "apihelp-query+transcludedin-example-simple": "Obtenir une liste des pages incluant <kbd>Main Page</kbd>.",
        "apihelp-query+transcludedin-example-generator": "Obtenir des informations sur les pages incluant <kbd>Main Page</kbd>.",
-       "apihelp-query+usercontribs-description": "Obtenir toutes les modifications par un utilisateur.",
+       "apihelp-query+usercontribs-description": "Obtenir toutes les modifications d'un utilisateur.",
        "apihelp-query+usercontribs-param-limit": "Le nombre maximal de contributions à renvoyer.",
        "apihelp-query+usercontribs-param-start": "L’horodatage auquel démarrer le retour.",
        "apihelp-query+usercontribs-param-end": "L’horodatage auquel arrêter le retour.",
        "apihelp-query+usercontribs-paramvalue-prop-flags": "Ajoute les marques de la modification.",
        "apihelp-query+usercontribs-paramvalue-prop-patrolled": "Marque les modifications patrouillées.",
        "apihelp-query+usercontribs-paramvalue-prop-tags": "Liste les balises de la modification.",
-       "apihelp-query+usercontribs-param-show": "Afficher uniquement les éléments correspondant à ces critères, par ex. les modifications non mineures uniquement : <kbd>$2show=!minor</kbd>.\n\nSi <kbd>$2show=patrolled</kbd> ou <kbd>$2show=!patrolled</kbd> est positionné, les révisions plus anciennes que <var>[[mw:Manual:$wgRCMaxAge|$wgRCMaxAge]]</var> ($1 {{PLURAL:$1|seconde|secondes}}) ne seront pas affichées.",
+       "apihelp-query+usercontribs-param-show": "Afficher uniquement les éléments correspondant à ces critères, par ex. les modifications non mineures uniquement : <kbd>$2show=!minor</kbd>.\n\nSi <kbd>$2show=patrolled</kbd> ou <kbd>$2show=!patrolled</kbd> est positionné, les révisions plus anciennes que <var>[[mw:Special:MyLanguage/Manual:$wgRCMaxAge|$wgRCMaxAge]]</var> ($1 {{PLURAL:$1|seconde|secondes}}) ne seront pas affichées.",
        "apihelp-query+usercontribs-param-tag": "Lister uniquement les révisions marquées avec cette balise.",
-       "apihelp-query+usercontribs-param-toponly": "Lister uniquement les modifications qui sont la dernière révision.",
+       "apihelp-query+usercontribs-param-toponly": "Lister uniquement les modifications de la dernière révision.",
        "apihelp-query+usercontribs-example-user": "Afficher les contributions de l'utilisateur <kbd>Exemple</kbd>.",
        "apihelp-query+usercontribs-example-ipprefix": "Afficher les contributions de toutes les adresses IP avec le préfixe <kbd>192.0.2.</kbd>.",
-       "apihelp-query+userinfo-description": "Obtenir de l’information sur l’utilisateur courant.",
+       "apihelp-query+userinfo-description": "Obtenir des informations sur l’utilisateur courant.",
        "apihelp-query+userinfo-param-prop": "Quelles informations inclure :",
        "apihelp-query+userinfo-paramvalue-prop-blockinfo": "Marque si l’utilisateur actuel est bloqué, par qui, et pour quelle raison.",
        "apihelp-query+userinfo-paramvalue-prop-hasmsg": "Ajoute une balise <samp>messages</samp> si l’utilisateur actuel a des messages en cours.",
        "apihelp-query+userinfo-paramvalue-prop-implicitgroups": "Liste tous les groupes dont l’utilisateur actuel est automatiquement membre.",
        "apihelp-query+userinfo-paramvalue-prop-rights": "Liste tous les droits qu’a l’utilisateur actuel.",
        "apihelp-query+userinfo-paramvalue-prop-changeablegroups": "Liste les groupes pour lesquels l’utilisateur actuel peut ajouter ou supprimer.",
-       "apihelp-query+userinfo-paramvalue-prop-options": "Liste toutes les préférences qu’a défini l’utilisateur actuel.",
+       "apihelp-query+userinfo-paramvalue-prop-options": "Liste toutes les préférences qu’a définies l’utilisateur actuel.",
        "apihelp-query+userinfo-paramvalue-prop-preferencestoken": "<span class=\"apihelp-deprecated\">Obsolete.</span> Obtenir un jeton pour modifier les préférences de l’utilisateur actuel.",
        "apihelp-query+userinfo-paramvalue-prop-editcount": "Ajoute le compteur de modifications de l’utilisateur actuel.",
        "apihelp-query+userinfo-paramvalue-prop-ratelimits": "Liste toutes les limites de débit s’appliquant à l’utilisateur actuel.",
        "apihelp-query+userinfo-paramvalue-prop-unreadcount": "Ajoute le compteur de pages non lues de la liste de suivi de l’utilisateur (au maximum $1 ; renvoie <samp>$2</samp> s’il y en a plus).",
        "apihelp-query+userinfo-paramvalue-prop-centralids": "Ajoute les IDs centraux et l’état d’attachement de l’utilisateur.",
        "apihelp-query+userinfo-param-attachedwiki": "Avec <kbd>$1prop=centralids</kbd>, indiquer si l’utilisateur est attaché au wiki identifié par cet ID.",
-       "apihelp-query+userinfo-example-simple": "Obtenir de l’information sur l’utilisateur actuel",
+       "apihelp-query+userinfo-example-simple": "Obtenir des informations sur l’utilisateur actuel.",
        "apihelp-query+userinfo-example-data": "Obtenir des informations supplémentaires sur l’utilisateur actuel",
-       "apihelp-query+users-description": "Obtenir des information sur une liste d’utilisateurs",
+       "apihelp-query+users-description": "Obtenir des informations sur une liste d’utilisateurs",
        "apihelp-query+users-param-prop": "Quelles informations inclure :",
        "apihelp-query+users-paramvalue-prop-blockinfo": "Marque si l’utilisateur est bloqué, par qui, et pour quelle raison.",
-       "apihelp-query+users-paramvalue-prop-groups": "Liste tous les groupes auquel appartient chaque utilisateur.",
+       "apihelp-query+users-paramvalue-prop-groups": "Liste tous les groupes auxquels appartient chaque utilisateur.",
        "apihelp-query+users-paramvalue-prop-groupmemberships": "Liste les groupes auxquels chaque utilisateur a été explicitement affecté, avec la date d’expiration de l’appartenance à chaque groupe.",
        "apihelp-query+users-paramvalue-prop-implicitgroups": "Liste tous les groupes dont un utilisateur est automatiquement membre.",
        "apihelp-query+users-paramvalue-prop-rights": "Liste tous les droits qu’a un utilisateur.",
        "apihelp-query+watchlist-paramvalue-type-categorize": "Modifications d’appartenance aux catégories.",
        "apihelp-query+watchlist-param-owner": "Utilisé avec $1token pour accéder à la liste de suivi d’un autre utilisateur.",
        "apihelp-query+watchlist-param-token": "Un jeton de sécurité (disponible dans les [[Special:Preferences#mw-prefsection-watchlist|préférences]] de l’utilsiateur) pour autoriser l’accès à la liste de suivi d&un autre utilisateur.",
-       "apihelp-query+watchlist-example-simple": "Lister la révision de tête des pages récemment modifiées dans la liste de suivi de l’utilisateur actuel",
-       "apihelp-query+watchlist-example-props": "Chercher des informations supplémentaires sur la révision de tête des pages récemment modifiées de la liste de suivi de l’utilisateur actuel",
+       "apihelp-query+watchlist-example-simple": "Lister la révision de tête des pages récemment modifiées dans la liste de suivi de l’utilisateur actuel.",
+       "apihelp-query+watchlist-example-props": "Chercher des informations supplémentaires sur la révision de tête des pages récemment modifiées de la liste de suivi de l’utilisateur actuel.",
        "apihelp-query+watchlist-example-allrev": "Chercher les informations sur toutes les modifications récentes des pages de la liste de suivi de l’utilisateur actuel",
        "apihelp-query+watchlist-example-generator": "Chercher l’information de la page sur les pages récemment modifiées de la liste de suivi de l’utilisateur actuel",
-       "apihelp-query+watchlist-example-generator-rev": "Chercher l’information de la révision pour les modifications récentes des pages de la liste de suivi de l’utilisateur actuel",
+       "apihelp-query+watchlist-example-generator-rev": "Chercher l’information de la révision pour les modifications récentes des pages de la liste de suivi de l’utilisateur actuel.",
        "apihelp-query+watchlist-example-wlowner": "Lister la révision de tête des pages récemment modifiées de la liste de suivi de l'utilisateur <kbd>Exemple</kbd>.",
        "apihelp-query+watchlistraw-description": "Obtenir toutes les pages de la liste de suivi de l’utilisateur actuel.",
        "apihelp-query+watchlistraw-param-namespace": "Lister uniquement les pages dans les espaces de nom fournis.",
        "apihelp-query+watchlistraw-param-dir": "Le sens dans lequel lister.",
        "apihelp-query+watchlistraw-param-fromtitle": "Démarrer l'énumération avec ce Titre (inclure le préfixe d'espace de noms) :",
        "apihelp-query+watchlistraw-param-totitle": "Terminer l'énumération avec ce Titre (inclure le préfixe d'espace de noms) :",
-       "apihelp-query+watchlistraw-example-simple": "Lister les pages dans la liste de suivi de l’utilisateur actuel",
-       "apihelp-query+watchlistraw-example-generator": "Chercher l’information sur les pages de la liste de suivi de l’utilisateur actuel",
+       "apihelp-query+watchlistraw-example-simple": "Lister les pages dans la liste de suivi de l’utilisateur actuel.",
+       "apihelp-query+watchlistraw-example-generator": "Chercher l’information sur les pages de la liste de suivi de l’utilisateur actuel.",
        "apihelp-removeauthenticationdata-description": "Supprimer les données d’authentification pour l’utilisateur actuel.",
        "apihelp-removeauthenticationdata-example-simple": "Tentative de suppression des données de l’utilisateur pour <kbd>FooAuthenticationRequest</kbd>.",
        "apihelp-resetpassword-description": "Envoyer un courriel de réinitialisation du mot de passe à un utilisateur.",
-       "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-description-noroutes": "Aucun chemin pour réinitialiser le mot de passe n’est disponible.\n\nActiver les chemins dans <var>[[mw:Special:MyLanguage/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-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.",
+       "apihelp-revisiondelete-description": "Supprimer et rétablir des révisions.",
        "apihelp-revisiondelete-param-type": "Type de suppression de révision en cours de traitement.",
        "apihelp-revisiondelete-param-target": "Titre de page pour la suppression de révision, s’il est nécessaire pour le type.",
        "apihelp-revisiondelete-param-ids": "Identifiants pour les révisions à supprimer.",
        "apihelp-setnotificationtimestamp-example-pagetimestamp": "Fixer l’horodatage de notification pour <kbd>Page principale</kbd> afin que toutes les modifications depuis le 1 janvier 2012 soient non vues",
        "apihelp-setnotificationtimestamp-example-allpages": "Réinitialiser l’état de notification sur les pages dans l’espace de noms <kbd>{{ns:user}}</kbd>.",
        "apihelp-setpagelanguage-description": "Modifier la langue d’une page.",
-       "apihelp-setpagelanguage-description-disabled": "Il n’est pas possible de modifier la langue d’une page sur ce wiki.\n\nActiver <var>[[mw:Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]]</var> pour utiliser cette action.",
+       "apihelp-setpagelanguage-description-disabled": "Il n’est pas possible de modifier la langue d’une page sur ce wiki.\n\nActiver <var>[[mw:Special:MyLanguage/Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]]</var> pour utiliser cette action.",
        "apihelp-setpagelanguage-param-title": "Titre de la page dont vous souhaitez modifier la langue. Ne peut pas être utilisé avec <var>$1pageid</var>.",
        "apihelp-setpagelanguage-param-pageid": "Identifiant (ID) de la page dont vous souhaitez modifier la langue. Ne peut être utilisé avec <var>$1title</var>.",
        "apihelp-setpagelanguage-param-lang": "Code de langue vers lequel la page doit être changée. Utiliser <kbd>defaut</kbd> pour réinitialiser la page sur la langue par défaut du contenu du wiki.",
        "apihelp-xml-param-includexmlnamespace": "Si spécifié, ajoute un espace de noms XML.",
        "apihelp-xmlfm-description": "Extraire les données au format XML (affiché proprement en HTML).",
        "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-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:Special:MyLanguage/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ébogage, et n’est pas approprié pour une utilisation applicative.\n\nVoir la [[mw:Special:MyLanguage/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-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]]",
        "api-help-param-token-webui": "Pour rester compatible, le jeton utilisé dans l’IHM web est aussi accepté.",
-       "api-help-param-disabled-in-miser-mode": "Désactivé à cause du [[mw:Manual:$wgMiserMode|mode minimal]].",
-       "api-help-param-limited-in-miser-mode": "<strong>NOTE :</strong> Du fait du [[mw:Manual:$wgMiserMode|mode minimal]], utiliser cela peut aboutir à moins de résultats que <var>$1limit</var> renvoyés avant de continuer ; dans les cas extrêmes, zéro résultats peuvent être renvoyés.",
+       "api-help-param-disabled-in-miser-mode": "Désactivé à cause du [[mw:Special:MyLanguage/Manual:$wgMiserMode|mode minimal]].",
+       "api-help-param-limited-in-miser-mode": "<strong>NOTE :</strong> Du fait du [[mw:Special:MyLanguage/Manual:$wgMiserMode|mode minimal]], utiliser cela peut aboutir à moins de résultats que <var>$1limit</var> renvoyés avant de continuer ; dans les cas extrêmes, zéro résultats peuvent être renvoyés.",
        "api-help-param-direction": "Dans quelle direction énumérer :\n;newer:Lister les plus anciens en premier. Note : $1start doit être avant $1end.\n;older:Lister les nouveaux en premier (par défaut). Note : $1start doit être postérieur à $1end.",
        "api-help-param-continue": "Quand plus de résultats sont disponibles, utiliser cela pour continuer.",
        "api-help-param-no-description": "<span class=\"apihelp-empty\">(aucune description)</span>",
index 183f3cb..bfaef7a 100644 (file)
                        "Hamilton Abreu"
                ]
        },
-       "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 Lista de discusión]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Anuncios da API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Erros e solicitudes]\n</div>\n<strong>Estado:</strong> Tódalas funcionalidades mostradas nesta páxina deberían estar funcionanado, pero a API aínda está desenrolo, e pode ser modificada en calquera momento. Apúntese na [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ lista de discusión mediawiki-api-announce] para estar informado acerca das actualizacións.\n\n<strong>Solicitudes incorrectas:</strong> Cando se envían solicitudes incorrectas á API, envíase unha cabeceira HTTP coa chave \"MediaWiki-API-Error\" e, a seguir, tanto o valor da cabeceira como o código de erro retornado serán definidos co mesmo valor. Para máis información, consulte [[mw:API:Errors_and_warnings|API: Erros e avisos]].\n\n<strong>Test:</strong> Para facilitar as probas das peticións da API, consulte [[Special:ApiSandbox]].",
+       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:Special:MyLanguage/API:Main_page|Documentación]]\n* [[mw:Special:MyLanguage/API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Lista de discusión]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Anuncios da API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Erros e solicitudes]\n</div>\n<strong>Estado:</strong> Tódalas funcionalidades mostradas nesta páxina deberían estar funcionanado, pero a API aínda está desenrolo, e pode ser modificada en calquera momento. Apúntese na [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ lista de discusión mediawiki-api-announce] para estar informado acerca das actualizacións.\n\n<strong>Solicitudes incorrectas:</strong> Cando se envían solicitudes incorrectas á API, envíase unha cabeceira HTTP coa chave \"MediaWiki-API-Error\" e, a seguir, tanto o valor da cabeceira como o código de erro retornado serán definidos co mesmo valor. Para máis información, consulte [[mw:Special:MyLanguage/API:Errors_and_warnings|API: Erros e avisos]].\n\n<strong>Test:</strong> Para facilitar as probas das peticións da API, consulte [[Special:ApiSandbox]].",
        "apihelp-main-param-action": "Que acción se realizará.",
        "apihelp-main-param-format": "O formato de saída.",
-       "apihelp-main-param-maxlag": "O retardo máximo pode usarse cando MediaWiki está instalada nun cluster de base de datos replicadas. Para gardar accións que causen calquera retardo máis de replicación do sitio, este parámetro pode facer que o cliente espere ata que o retardo de replicación sexa menor que o valor especificado. No caso de retardo excesivo, é devolto o código de erro <samp>maxlag</samp> cunha mensaxe como <samp>esperando por $host: $lag segundos de retardo</samp>.<br />Para máis información, ver [[mw:Manual:Maxlag_parameter|Manual: Maxlag parameter]].",
+       "apihelp-main-param-maxlag": "O retardo máximo pode usarse cando MediaWiki está instalada nun cluster de base de datos replicadas. Para gardar accións que causen calquera retardo máis de replicación do sitio, este parámetro pode facer que o cliente espere ata que o retardo de replicación sexa menor que o valor especificado. No caso de retardo excesivo, é devolto o código de erro <samp>maxlag</samp> cunha mensaxe como <samp>esperando por $host: $lag segundos de retardo</samp>.<br />Para máis información, ver [[mw:Special:MyLanguage/Manual:Maxlag_parameter|Manual: Maxlag parameter]].",
        "apihelp-main-param-smaxage": "Fixar a cabeceira HTTP de control de caché <code>s-maxage</code> a esos segundos. Os erros nunca se gardan na caché.",
        "apihelp-main-param-maxage": "Fixar a cabeceira HTTP de control de caché <code>max-age</code> a esos segundos. Os erros nunca se gardan na caché.",
        "apihelp-main-param-assert": "Verificar se o usuario está conectado como <kbd>usuario</kbd> ou ten a marca de <kbd>bot</kbd>.",
@@ -41,7 +41,7 @@
        "apihelp-block-param-autoblock": "Bloquear automaticamente o último enderezo IP utilizado, e calquera outro enderezo desde o que intente conectarse.",
        "apihelp-block-param-noemail": "Impide que o usuario envíe correos electrónicos a través da wiki. (Require o permiso <code>blockemail</code>).",
        "apihelp-block-param-hidename": "Ocultar o nome de usuario do rexistro de bloqueos. (Precisa do permiso <code>hideuser</code>).",
-       "apihelp-block-param-allowusertalk": "Permitir que o usuario edite a súa propia páxina de conversa (depende de <var>[[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var>).",
+       "apihelp-block-param-allowusertalk": "Permitir que o usuario edite a súa propia páxina de conversa (depende de <var>[[mw:Special:MyLanguage/Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var>).",
        "apihelp-block-param-reblock": "Se o usuario xa está bloqueado, sobreescribir o bloqueo existente.",
        "apihelp-block-param-watchuser": "Vixiar a páxina de usuario ou direccións IP e a de conversa deste usuario",
        "apihelp-block-param-tags": "Cambiar as etiquetas a aplicar á entrada no rexistro de bloqueos.",
        "apihelp-opensearch-param-search": "Buscar texto.",
        "apihelp-opensearch-param-limit": "Número máximo de resultados a visualizar.",
        "apihelp-opensearch-param-namespace": "Espazo de nomes no que buscar.",
-       "apihelp-opensearch-param-suggest": "Non facer nada se <var>[[mw:Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]</var> é falso.",
+       "apihelp-opensearch-param-suggest": "Non facer nada se <var>[[mw:Special:MyLanguage/Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]</var> é falso.",
        "apihelp-opensearch-param-redirects": "Como xestionar as redireccións:\n;return:Devolve a mesma redirección.\n;resolve:Devolve a páxina á que apunta. Pode devolver menos de $1limit resultados.\nPor razóns históricas, o valor por defecto para $1format=json é \"return\" e \"resolve\" para outros formatos.",
        "apihelp-opensearch-param-format": "O formato de saída.",
        "apihelp-opensearch-param-warningsaserror": "Se os avisos son recibidos con <kbd>format=json</kbd>, devolver un erro de API no canto de ignoralos.",
        "apihelp-query+alldeletedrevisions-param-user": "Só listar revisións deste usuario.",
        "apihelp-query+alldeletedrevisions-param-excludeuser": "Non listar revisións deste usuario.",
        "apihelp-query+alldeletedrevisions-param-namespace": "Só listar páxinas neste espazo de nomes.",
-       "apihelp-query+alldeletedrevisions-param-miser-user-namespace": "<strong>Nota:</strong> Debido ó [[mw:Manual:$wgMiserMode|modo minimal]], ó usar á vez <var>$1user</var> e <var>$1namespace</var> pode devolver menos resultados de <var>$1limit</var> antes de continuar, en casos extremos, pode que non devolva resultados.",
+       "apihelp-query+alldeletedrevisions-param-miser-user-namespace": "<strong>Nota:</strong> Debido ó [[mw:Special:MyLanguage/Manual:$wgMiserMode|modo minimal]], ó usar á vez <var>$1user</var> e <var>$1namespace</var> pode devolver menos resultados de <var>$1limit</var> antes de continuar, en casos extremos, pode que non devolva resultados.",
        "apihelp-query+alldeletedrevisions-param-generatetitles": "Usado como xenerador, xenera títulos no canto de IDs de revisión.",
        "apihelp-query+alldeletedrevisions-example-user": "Listar as últimas 50 contribucións borradas do usuario <kbd>Example</kbd>.",
        "apihelp-query+alldeletedrevisions-example-ns-main": "Listar as 50 primeiras revisións borradas no espazo de nomes principal.",
        "apihelp-query+filearchive-paramvalue-prop-archivename": "Engade o nome do ficheiro da versión do ficheiro para as versións que non son a última.",
        "apihelp-query+filearchive-example-simple": "Mostrar unha lista de tódolos fichieiros eliminados.",
        "apihelp-query+filerepoinfo-description": "Devolver a meta información sobre os repositorios de imaxes configurados na wiki.",
-       "apihelp-query+filerepoinfo-param-prop": "Que propiedades do repositorio mostrar (pode haber máis dispoñible nalgunhas wikis):\n;apiurl:URL ó API do repositorio - útil para obter información das imaxes no host.\n;name:A clave do repositorio - usada p. ex. nas variables de retorno de <var>[[mw:Manual:$wgForeignFileRepos|$wgForeignFileRepos]]</var> e [[Special:ApiHelp/query+imageinfo|imageinfo]]\n;displayname:O nome lexible do wiki repositorio.\n;rooturl:URL raíz dos camiños de imaxe.\n;local:Se o repositorio é o repositorio local ou non.",
+       "apihelp-query+filerepoinfo-param-prop": "Que propiedades do repositorio mostrar (pode haber máis dispoñible nalgunhas wikis):\n;apiurl:URL ó API do repositorio - útil para obter información das imaxes no host.\n;name:A clave do repositorio - usada p. ex. nas variables de retorno de <var>[[mw:Special:MyLanguage/Manual:$wgForeignFileRepos|$wgForeignFileRepos]]</var> e [[Special:ApiHelp/query+imageinfo|imageinfo]]\n;displayname:O nome lexible do wiki repositorio.\n;rooturl:URL raíz dos camiños de imaxe.\n;local:Se o repositorio é o repositorio local ou non.",
        "apihelp-query+filerepoinfo-example-simple": "Obter infomación sobre os repositorios de ficheiros",
        "apihelp-query+fileusage-description": "Atopar tódalas páxinas que usan os ficheiros dados.",
        "apihelp-query+fileusage-param-prop": "Que propiedades obter:",
        "apihelp-query+siteinfo-paramvalue-prop-rightsinfo": "Devolve a información dos dereitos (licenza) da wiki se está dispoñible.",
        "apihelp-query+siteinfo-paramvalue-prop-restrictions": "Devolve información dos tipos de restricións (protección) dispoñibles.",
        "apihelp-query+siteinfo-paramvalue-prop-languages": "Devolve unha lista dos idiomas que soporta Mediawiki (opcionalmente pode localizarse usando <var>$1inlanguagecode</var>).",
+       "apihelp-query+siteinfo-paramvalue-prop-languagevariants": "Devolve unha lista de códigos de lingua para os que [[mw:Special:MyLanguage/LanguageConverter|LanguageConverter]] está activo, e as variantes soportadas para cada un.",
        "apihelp-query+siteinfo-paramvalue-prop-skins": "Devolve unha lista de todas as aparencias dispoñibles (opcionalmente pode localizarse usando <var>$1inlanguagecode</var>, noutro caso no idioma do contido).",
        "apihelp-query+siteinfo-paramvalue-prop-extensiontags": "Devolve unha lista de etiquetas de extensión de analizador.",
        "apihelp-query+siteinfo-paramvalue-prop-functionhooks": "Devolve unha lista de ganchos de función de analizador.",
-       "apihelp-query+siteinfo-paramvalue-prop-showhooks": "Devolve unha lista de todos os ganchos subscritos (contido de <var>[[mw:Manual:$wgHooks|$wgHooks]]</var>).",
+       "apihelp-query+siteinfo-paramvalue-prop-showhooks": "Devolve unha lista de todos os ganchos subscritos (contido de <var>[[mw:Special:MyLanguage/Manual:$wgHooks|$wgHooks]]</var>).",
        "apihelp-query+siteinfo-paramvalue-prop-variables": "Devolve unha lista de identificadores de variable.",
        "apihelp-query+siteinfo-paramvalue-prop-protocols": "Devolve unha lista de protocolos que están permitidos nas ligazóns externas.",
        "apihelp-query+siteinfo-paramvalue-prop-defaultoptions": "Devolve os valores por defecto das preferencias de usuario.",
        "apihelp-query+usercontribs-paramvalue-prop-flags": "Engade os indicadores da modificación.",
        "apihelp-query+usercontribs-paramvalue-prop-patrolled": "Marca as modificacións vixiadas.",
        "apihelp-query+usercontribs-paramvalue-prop-tags": "Lista as etiquetas da modificación.",
-       "apihelp-query+usercontribs-param-show": "Só mostrar elementos que cumpran estos criterios, p.ex. só edicións menores: <kbd>$2show=!minor</kbd>.\n\nSe está fixado <kbd>$2show=patrolled</kbd> ou <kbd>$2show=!patrolled</kbd>, as modificacións máis antigas que <var>[[mw:Manual:$wgRCMaxAge|$wgRCMaxAge]]</var> ($1 {{PLURAL:$1|segundo|segundos}}) non se mostrarán.",
+       "apihelp-query+usercontribs-param-show": "Só mostrar elementos que cumpran estos criterios, p.ex. só edicións menores: <kbd>$2show=!minor</kbd>.\n\nSe está fixado <kbd>$2show=patrolled</kbd> ou <kbd>$2show=!patrolled</kbd>, as modificacións máis antigas que <var>[[mw:Special:MyLanguage/Manual:$wgRCMaxAge|$wgRCMaxAge]]</var> ($1 {{PLURAL:$1|segundo|segundos}}) non se mostrarán.",
        "apihelp-query+usercontribs-param-tag": "Só listar revisións marcadas con esta etiqueta.",
        "apihelp-query+usercontribs-param-toponly": "Listar só cambios que son a última revisión.",
        "apihelp-query+usercontribs-example-user": "Mostrar as contribucións do usuario <kbd>Exemplo</kbd>.",
        "apihelp-removeauthenticationdata-description": "Elimina os datos de autenticación do usuario actual.",
        "apihelp-removeauthenticationdata-example-simple": "Intenta eliminar os datos de usuario actual para <kbd>FooAuthenticationRequest</kbd>.",
        "apihelp-resetpassword-description": "Envía un correo de inicialización de contrasinal a un usuario.",
-       "apihelp-resetpassword-description-noroutes": "Non están dispoñibles as rutas de reinicio de contrasinal \n\nActive as rutas en <var>[[mw:Manual:$wgPasswordResetRoutes|$wgPasswordResetRoutes]]</var> para usar este módulo.",
+       "apihelp-resetpassword-description-noroutes": "Non están dispoñibles as rutas de reinicio de contrasinal \n\nActive as rutas en <var>[[mw:Special:MyLanguage/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-example-user": "Enviar un correo de reinicialización de contrasinal ó usuario <kbd>Exemplo</kbd>.",
        "apihelp-setnotificationtimestamp-example-pagetimestamp": "Fixar o selo de tempo de notificación para a <kbd>Main page</kbd> de forma que todas as edicións dende o 1 se xaneiro de 2012 queden sen revisar.",
        "apihelp-setnotificationtimestamp-example-allpages": "Restaurar o estado de notificación para as páxinas no espazo de nomes de <kbd>{{ns:user}}</kbd>.",
        "apihelp-setpagelanguage-description": "Cambiar a lingua dunha páxina.",
-       "apihelp-setpagelanguage-description-disabled": "Neste wiki non se permite modificar a lingua das páxinas.\n\nActive <var>[[mw:Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]]</var> para utilizar esta acción.",
+       "apihelp-setpagelanguage-description-disabled": "Neste wiki non se permite modificar a lingua das páxinas.\n\nActive <var>[[mw:Special:MyLanguage/Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]]</var> para utilizar esta acción.",
        "apihelp-setpagelanguage-param-title": "Título da páxina cuxa lingua quere cambiar. Non se pode usar xunto con <var>$1pageid</var>.",
        "apihelp-setpagelanguage-param-pageid": "Identificador da páxina cuxa lingua quere cambiar. Non se pode usar xunto con <var>$1title</var>.",
        "apihelp-setpagelanguage-param-lang": "Código da lingua á que se quere cambiar a páxina. Use <kbd>default</kbd> para restablecer a páxina á lingua por defecto do contido da wiki.",
        "apihelp-userrights-param-user": "Nome de usuario.",
        "apihelp-userrights-param-userid": "ID de usuario.",
        "apihelp-userrights-param-add": "Engadir o usuario a estes grupos, ou se xa é membro, actualizar a caducidade da súa afiliación.",
+       "apihelp-userrights-param-expiry": "Marcas de tempo de caducidade. Poden ser relativas (por exemplo, <kbd>5 meses</kbd> ou <kbd>2 semanas</kbd>) ou absolutas (por exemplo, <kbd>2014-09-18T12:34:56Z</kbd>). Se só se fixa unha marca de tempo, utilizarase para tódolos grupos que se pasen ó parámetro <var>$1add</var>. Use <kbd>infinite</kbd>, <kbd>indefinite</kbd>, <kbd>infinity</kbd>, ou <kbd>never</kbd> para que a pertenza ó grupo non teña data de caducidade.",
        "apihelp-userrights-param-remove": "Eliminar o usuario destes grupos.",
        "apihelp-userrights-param-reason": "Motivo para o cambio.",
        "apihelp-userrights-param-tags": "Cambia as etiquetas a aplicar á entrada do rexistro de dereitos de usuario.",
        "apihelp-xml-param-includexmlnamespace": "Se está indicado, engade un espazo de nomes XML.",
        "apihelp-xmlfm-description": "Datos de saída en formato XML(impresión en HTML).",
        "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-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:Special:MyLanguage/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:Special:MyLanguage/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-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]]",
        "api-help-param-token-webui": "Por compatibilidade, o identificador usado na web UI tamén é aceptado.",
-       "api-help-param-disabled-in-miser-mode": "Desactivado debido ó [[mw:Manual:$wgMiserMode|modo minimal]].",
-       "api-help-param-limited-in-miser-mode": "<strong>Nota:</strong> Debido ó [[mw:Manual:$wgMiserMode|modo minimal]], usar isto pode devolver menos de <var>$1limit</var> resultados antes de seguir, en casos extremos, pode que non se devolvan resultados.",
+       "api-help-param-disabled-in-miser-mode": "Desactivado debido ó [[mw:Special:MyLanguage/Manual:$wgMiserMode|modo minimal]].",
+       "api-help-param-limited-in-miser-mode": "<strong>Nota:</strong> Debido ó [[mw:Special:MyLanguage/Manual:$wgMiserMode|modo minimal]], usar isto pode devolver menos de <var>$1limit</var> resultados antes de seguir, en casos extremos, pode que non se devolvan resultados.",
        "api-help-param-direction": "En que dirección enumerar:\n;newer:Lista os máis antigos primeiro. Nota: $1start ten que estar antes que $1end.\n;older:Lista os máis novos primeiro (por defecto). Nota: $1start ten que estar despois que $1end.",
        "api-help-param-continue": "Cando estean dispoñibles máis resultados, use isto para continuar.",
        "api-help-param-no-description": "<span class=\"apihelp-empty\">(sen descrición)</span>",
        "apierror-badurl": "Valor \"$2\" non válido para o parámetro de URL <var>$1</var>.",
        "apierror-baduser": "Valor \"$2\" non válido para o parámetro de usuario <var>$1</var>.",
        "apierror-badvalue-notmultivalue": "O separador multivalor U+001F só pode utilizarse en parámetros multivalorados.",
+       "apierror-bad-watchlist-token": "Identificador de lista de vixilancia proporcionado incorrecto. Por favor, obteña un identificador correcto en [[Special:Preferences]].",
        "apierror-blockedfrommail": "Foi bloqueado para o envío de correos electrónicos.",
        "apierror-blocked": "Foi bloqueado fronte á edición.",
        "apierror-botsnotsupported": "Esta interface non está dispoñible para bots.",
        "apierror-readapidenied": "Necesita permiso de lectura para utilizar ese módulo.",
        "apierror-readonly": "A wiki está actualmente en modo de só lectura.",
        "apierror-reauthenticate": "Non se autentificou recentemente nesta sesión. Por favor, volva a autentificarse.",
+       "apierror-revdel-mutuallyexclusive": "Non se pode usar o mesmo campo en <var>hide</var> e <var>show</var>.",
+       "apierror-revdel-needtarget": "É necesario un título obxectivo para este tipo RevDel.",
+       "apierror-revdel-paramneeded": "Requírese polo menos un valor para <var>hide</var> e/ou <var>show</var>.",
+       "apierror-revisions-norevids": "O parámetro <var>revids</var> non se pode utilizar xunto coas opción de lista (<var>$1limit</var>, <var>$1startid</var>, <var>$1endid</var>, <kbd>$1dir=newer</kbd>, <var>$1user</var>, <var>$1excludeuser</var>, <var>$1start</var> e <var>$1end</var>).",
+       "apierror-revisions-singlepage": "Utilizouse <var>titles</var>, <var>pageids</var> ou un xerador para proporcionar múltiples páxinas, pero os parámetros <var>$1limit</var>, <var>$1startid</var>, <var>$1endid</var>, <kbd>$1dir=newer</kbd>, <var>$1user</var>, <var>$1excludeuser</var>, <var>$1start</var> e <var>$1end</var> só poden utilizarse nunha soa páxina.",
        "apierror-revwrongpage": "r$1 non é unha revisión de $2.",
        "apierror-searchdisabled": "A busca <var>$1</var> está desactivada.",
        "apierror-sectionreplacefailed": "Non se puido combinar a sección actualizada.",
        "apierror-sizediffdisabled": "A diferenza de tamaño está deshabilitada no modo Miser.",
        "apierror-spamdetected": "A súa edición foi rexeitada por conter un fragmento de publicidade: <code>$1</code>.",
        "apierror-specialpage-cantexecute": "Non ten permiso para ver os resultados desta páxina especial.",
+       "apierror-stashedfilenotfound": "Non se puido atopar o ficheiro na reserva: $1.",
+       "apierror-stashfailed-complete": "A suba por partes completouse, revise o estado para obter máis detalles.",
+       "apierror-stashfailed-nosession": "Non hai sesión de suba por partes con esa clave.",
+       "apierror-stashfilestorage": "Non se puido almacenar a suba na reservaː $1",
        "apierror-stashinvalidfile": "Ficheiro de reserva incorrecto.",
        "apierror-stashpathinvalid": "Clave de ficheiro con formato incorrecto ou non válidaː $1.",
        "apierror-stashwrongowner": "Erro de propietarioː $1",
        "apierror-stashzerolength": "Ficheiro de lonxitude cero, non pode ser almacenado na reservaː $1.",
        "apierror-systemblocked": "Foi bloqueado automaticamente polo software MediaWiki.",
+       "apierror-templateexpansion-notwikitext": "A expansión de modelos só é compatible co contido en wikitexto. $1 usa o modelo de contido $2.",
+       "apierror-unknownaction": "A acción especificada, <kbd>$1</kbd>, non está recoñecida.",
        "apierror-unknownerror-editpage": "Erro descoñecido EditPageː $1.",
        "apierror-unknownerror-nocode": "Erro descoñecido.",
        "apierror-unknownerror": "Erro descoñecido: \"$1\".",
        "apierror-unknownformat": "Formato descoñecido \"$1\".",
        "apierror-unrecognizedparams": "{{PLURAL:$2|Parámetro non recoñecido|Parámetros non recoñecidos}}: $1.",
        "apierror-unrecognizedvalue": "Valor non recoñecido para o parámetro <var>$1</var>: $2.",
+       "apierror-unsupportedrepo": "O repositorio local de ficheiros non permite consultar tódalas imaxes.",
+       "apierror-upload-filekeyneeded": "Debe proporcionar un <var>filekey</var> cando <var>offset</var> é distinto de cero.",
+       "apierror-upload-filekeynotallowed": "Non pode proporcionar <var>filekey</var> cando <var>offset</var> é 0.",
+       "apierror-upload-inprogress": "A suba dende a reserva está en progreso.",
+       "apierror-upload-missingresult": "Non hai resultado nos datos de estado.",
        "apierror-urlparamnormal": "Non se puideron normalizar os parámetros de imaxe de $1.",
        "apierror-writeapidenied": "Non ten permiso para editar este wiki a través da API.",
        "apiwarn-alldeletedrevisions-performance": "Para ter un mellor rendemento á hora de xerar títulos, estableza <kbd>$1dir=newer</kbd>.",
        "apiwarn-badurlparam": "Non se puido analizar <var>$1urlparam</var> para $2. Só se usará a anchura e a altura.",
+       "apiwarn-badutf8": "O valor pasado para <var>$1</var> contén datos non válidos ou non normalizados. Os datos de texto deberían estar en formato Unicode válido, normalizado en NFC e sen caracteres de control C0 distintos de HT (\\t), LF (\\n) e CR (\\r).",
+       "apiwarn-deprecation-deletedrevs": "<kbd>list=deletedrevs</kbd> quedou obsoleto. No seu lugar, utilice <kbd>prop=deletedrevisions</kbd> ou <kbd>list=alldeletedrevisions</kbd>.",
        "apiwarn-deprecation-httpsexpected": "Utilizouse HTTP cando esperábase HTTPS.",
        "apiwarn-deprecation-parameter": "O parámetro <var>$1</var> está obsoleto.",
+       "apiwarn-deprecation-purge-get": "O uso de <kbd>action=purge</kbd> mediante GET está obsoleto. Use POST no seu lugar.",
+       "apiwarn-deprecation-withreplacement": "<kbd>$1</kbd> está obsoleto. No seu lugar, utilice <kbd>$2</kbd>.",
        "apiwarn-invalidcategory": "\"$1\" non é unha categoría.",
        "apiwarn-invalidtitle": "\"$1\" non é un título válido.",
+       "apiwarn-invalidxmlstylesheetext": "As follas de estilo deben ter a extensión <code>.xsl</code>.",
+       "apiwarn-invalidxmlstylesheet": "A folla de estilos especificada non é válida ou non existe.",
+       "apiwarn-invalidxmlstylesheetns": "A folla de estilos debería estar no espazo de nomes {{ns:MediaWiki}}.",
+       "apiwarn-moduleswithoutvars": "A propiedade <kbd>modules</kbd> está definida, pero non o está <kbd>jsconfigvars</kbd> nin <kbd>encodedjsconfigvars</kbd>. As variables de configuración son necesarias para o correcto uso do módulo.",
        "apiwarn-notfile": "\"$1\" non é un ficheiro.",
        "apiwarn-parse-nocontentmodel": "Non se proporcionou <var>title</var> nin <var>contentmodel</var>, asúmese $1.",
        "apiwarn-tokennotallowed": "A acción \"$1\" non está permitida para o usuario actual.",
        "apiwarn-toomanyvalues": "Demasiados valores para o parámetro <var>$1</var>. O límite é $2.",
        "apiwarn-truncatedresult": "Truncouse este resultado porque doutra maneira sobrepasaría o límite de $1 bytes.",
+       "apiwarn-unrecognizedvalues": "{{PLURAL:$3|Valor non recoñecido|Valores non recoñecidos}} para o parámetro <var>$1</var>: $2.",
+       "apiwarn-validationfailed-badchars": "caracteres non válidos na clave (só se admiten os caracteres <code>a-z</code>, <code>A-Z</code>, <code>0-9</code>, <code>_</code> e <code>-</code>).",
        "apiwarn-validationfailed-badpref": "non é unha preferencia válida.",
        "apiwarn-validationfailed-cannotset": "non pode ser establecido por este módulo.",
+       "apiwarn-validationfailed-keytoolong": "clave demasiado longa (non pode ter máis de $1 bytes).",
        "apiwarn-validationfailed": "Erro de validación de <kbd>$1</kbd>: $2",
        "apiwarn-wgDebugAPI": "<strong>Aviso de seguridade</strong>: <var>$wgDebugAPI</var> está habilitado.",
        "api-feed-error-title": "Erro ($1)",
index f10334a..a948c85 100644 (file)
                        "שמזן"
                ]
        },
-       "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> לבדיקה קלה יותר של בקשות ר' [[Special:ApiSandbox]].",
+       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:Special:MyLanguage/API:Main_page|תיעוד]]\n* [[mw:Special:MyLanguage/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:Special:MyLanguage/API:Errors_and_warnings|API: שגיאות ואזהרות]].\n\n<strong>בדיקה:</strong> לבדיקה קלה יותר של בקשות ר' [[Special:ApiSandbox]].",
        "apihelp-main-param-action": "איזו פעולה לבצע.",
        "apihelp-main-param-format": "תסדיר הפלט.",
-       "apihelp-main-param-maxlag": "שיהוי מרבי יכול לשמש כשמדיה־ויקי מותקנת בצביר עם מסד נתונים משוכפל. כדי לחסוך בפעולות שגורמות יותר שיהוי בשכפול אתר, הפרמטר הזה יכול לגרום ללקוח להמתין עד ששיהוי השכפול יורד מתחת לערך שצוין. במקרה של שיהוי מוגזם, קוד השגיאה <samp>maxlag</samp> מוחזר עם הודעה כמו <samp>Waiting for $host: $lag seconds lagged</samp>.<br />ר' [[mw:Manual:Maxlag_parameter|מדריך למשתמש: פרמטר maxlag]] למידע נוסף.",
+       "apihelp-main-param-maxlag": "שיהוי מרבי יכול לשמש כשמדיה־ויקי מותקנת בצביר עם מסד נתונים משוכפל. כדי לחסוך בפעולות שגורמות יותר שיהוי בשכפול אתר, הפרמטר הזה יכול לגרום ללקוח להמתין עד ששיהוי השכפול יורד מתחת לערך שצוין. במקרה של שיהוי מוגזם, קוד השגיאה <samp>maxlag</samp> מוחזר עם הודעה כמו <samp>Waiting for $host: $lag seconds lagged</samp>.<br />ר' [[mw:Special:MyLanguage/Manual:Maxlag_parameter|מדריך למשתמש: פרמטר maxlag]] למידע נוסף.",
        "apihelp-main-param-smaxage": "הגדרת כותרת בקרת מטמון HTTP‏ <code>s-maxage</code> למספר כזה של שניות.",
        "apihelp-main-param-maxage": "הגדרת כותרת בקרת מטמון HTTP‏ <code>max-age</code> למספר כזה של שניות.",
        "apihelp-main-param-assert": "לוודא שהמשתמש נכנס אם זה מוגדר ל־<kbd>user</kbd>, או שיש לו הרשאת בוט אם זה <kbd>bot</kbd>.",
@@ -44,7 +44,7 @@
        "apihelp-block-param-autoblock": "חסימה אוטומטית גם של כתובת ה־IP האחרונה שהשתמש בה ושל כל כתובת IP שינסה להשתמש בה בעתיד.",
        "apihelp-block-param-noemail": "למנוע ממשתמש לשלוח דואר אלקטרוני דרך הוויקי. (דורש את ההרשאה <code>blockemail</code>).",
        "apihelp-block-param-hidename": "הסרת השם מיומן החסימות. (דורש את ההרשאה <code>hideuser</code>.)",
-       "apihelp-block-param-allowusertalk": "לאפשר למשתמש לערוך את דף השיחה שלו או שלה (תלוי ב־<var>[[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var>).",
+       "apihelp-block-param-allowusertalk": "לאפשר למשתמש לערוך את דף השיחה שלו או שלה (תלוי ב־<var>[[mw:Special:MyLanguage/Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var>).",
        "apihelp-block-param-reblock": "אם המשתמש כבר חסום, לדרוס את החסימה הנוכחית.",
        "apihelp-block-param-watchuser": "לעקוב אחרי דף המשתמש ודף השיחה של המשתמש או של כתובת ה־IP.",
        "apihelp-block-param-tags": "תגי שינוי שיחולו על העיול ביומן החסימה.",
        "apihelp-opensearch-param-search": "מחרוזת לחיפוש.",
        "apihelp-opensearch-param-limit": "המספר המרבי של התוצאות שתוחזרנה.",
        "apihelp-opensearch-param-namespace": "שמות מתחם לחיפוש.",
-       "apihelp-opensearch-param-suggest": "לא לעשות דבר אם <var>[[mw:Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]</var> הוא false.",
+       "apihelp-opensearch-param-suggest": "לא לעשות דבר אם <var>[[mw:Special:MyLanguage/Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]</var> הוא false.",
        "apihelp-opensearch-param-redirects": "איך לטפל בהפניות:\n;return:להחזיר את ההפניה עצמה.\n;resolve:להחזיר את דף היעד. יכול להחזיר פחות מ־$1limit תוצאות.\nמסיבות היסטוריות, בררת המחדל היא \"return\" עבור $1format=json ו־\"resolve\" עבור תסדירים אחרים.",
        "apihelp-opensearch-param-format": "תסדיר הפלט.",
        "apihelp-opensearch-param-warningsaserror": "אם אזהרות מוּעלות עם <kbd>format=json</kbd>, להחזיר שגיאת API במקום להתעלם מהן.",
        "apihelp-parse-paramvalue-prop-limitreportdata": "נותן דו\"ח הגבלות בדרך מובנית. לא נותן שום נתונים כאשר מוגדר <var>$1disablelimitreport</var>.",
        "apihelp-parse-paramvalue-prop-limitreporthtml": "נותן את גרסת ה־HTML של דו\"ח ההגבלות. לא נותן שום נתונים כאשר מוגדר <var>$1disablelimitreport</var>.",
        "apihelp-parse-paramvalue-prop-parsetree": "עץ פענוח XML של תוכן הגרסה (דורש מודל תוכן <code>$1</code>)",
+       "apihelp-parse-paramvalue-prop-parsewarnings": "נותן אזהרות שאירעו בזמן פענוח התוכן.",
        "apihelp-parse-param-pst": "לעשות התמרה לפני שמירה על הקלט לפני פענוחו. תקין רק בשימוש עם טקסט.",
        "apihelp-parse-param-onlypst": "לעשות התמרה לפני שמירה (pre-save transform‏, PST) על הקלט, אבל לא לפענח אותו. מחזיר את אותו קוד הוויקי אחרי החלת PST. תקף רק בשימוש עם <var>$1text</var>.",
        "apihelp-parse-param-effectivelanglinks": "כולל קישור שפה שמספקות הרחבות (לשימוש עם <kbd>$1prop=langlinks</kbd>).",
        "apihelp-query+alldeletedrevisions-param-user": "לרשום רק גרסאות מאת המשתמש הזה.",
        "apihelp-query+alldeletedrevisions-param-excludeuser": "לא לרשום גרסאות מאת המשתמש הזה.",
        "apihelp-query+alldeletedrevisions-param-namespace": "לרשום רק דפים במרחב השם הזה.",
-       "apihelp-query+alldeletedrevisions-param-miser-user-namespace": "<strong>לתשומת לבך:</strong> בשל [[mw:Manual:$wgMiserMode|מצב חיסכון]], שימוש ב־<var>$1user</var> וב־<var>$1namespace</var> ביחד עלול להניב החזרה של פחות מ־<var>$1limit</var> תוצאות לפני המשך; במצבים קיצוניים יכולות להיות מוחזרות אפס תוצאות.",
+       "apihelp-query+alldeletedrevisions-param-miser-user-namespace": "<strong>לתשומת לבך:</strong> בשל [[mw:Special:MyLanguage/Manual:$wgMiserMode|מצב חיסכון]], שימוש ב־<var>$1user</var> וב־<var>$1namespace</var> ביחד עלול להניב החזרה של פחות מ־<var>$1limit</var> תוצאות לפני המשך; במצבים קיצוניים יכולות להיות מוחזרות אפס תוצאות.",
        "apihelp-query+alldeletedrevisions-param-generatetitles": "בעת שימוש בתור מחולל, לחולל כותרת במקום מזהי גרסה.",
        "apihelp-query+alldeletedrevisions-example-user": "לרשום את 50 התרומות המחוקות האחרונות של משתמש <kbd>Example</kbd>.",
        "apihelp-query+alldeletedrevisions-example-ns-main": "רשימת 50 הגרסאות המחוקות הראשונות במרחב הראשי.",
        "apihelp-query+filearchive-paramvalue-prop-archivename": "הוספת שם הקובץ של גרסה מאורכבת עבור גרסאות שאינן האחרונה.",
        "apihelp-query+filearchive-example-simple": "הצגת רשימת כל הקבצים המחוקים.",
        "apihelp-query+filerepoinfo-description": "החזרת מידע מטא על מאגרי תמונות שמוגדרים בוויקי.",
-       "apihelp-query+filerepoinfo-param-prop": "אילו מאפייני מאגר לקבל (יכולים להיות יותר מזה באתרי ויקי אחדים):\n;apiurl:URL ל־API של המאגר – מועיל לקבלת מידע על התמונה מהמארח.\n;name:המפתח של המאגר – משמש למשל בערכים המוחזרים מ־<var>[[mw:Manual:$wgForeignFileRepos|$wgForeignFileRepos]]</var> ומ־[[Special:ApiHelp/query+imageinfo|imageinfo]].\n;displayname:שם קריא של אתר הוויקי של המאגר.\n;rooturl:URL שורש לנתיבי תמונות.\n;local:האם המאגר הוא מקומי או לא.",
+       "apihelp-query+filerepoinfo-param-prop": "אילו מאפייני מאגר לקבל (יכולים להיות יותר מזה באתרי ויקי אחדים):\n;apiurl:URL ל־API של המאגר – מועיל לקבלת מידע על התמונה מהמארח.\n;name:המפתח של המאגר – משמש למשל בערכים המוחזרים מ־<var>[[mw:Special:MyLanguage/Manual:$wgForeignFileRepos|$wgForeignFileRepos]]</var> ומ־[[Special:ApiHelp/query+imageinfo|imageinfo]].\n;displayname:שם קריא של אתר הוויקי של המאגר.\n;rooturl:URL שורש לנתיבי תמונות.\n;local:האם המאגר הוא מקומי או לא.",
        "apihelp-query+filerepoinfo-example-simple": "קבלת מידע על מאגרי קבצים.",
        "apihelp-query+fileusage-description": "מציאת כל הדפים שמשתמשים בקבצים הנתונים.",
        "apihelp-query+fileusage-param-prop": "אילו מאפיינים לקבל:",
        "apihelp-query+siteinfo-paramvalue-prop-rightsinfo": "החזרת הזכויות (הרישיון) של הוויקי, אם זמין.",
        "apihelp-query+siteinfo-paramvalue-prop-restrictions": "החזרת מידע על ההגבלות (ההגנות) הזמינות.",
        "apihelp-query+siteinfo-paramvalue-prop-languages": "החזרת השפות שמדיה־ויקי תומכת בהן (זה יכול להיות מותאם מקומים עם <var>$1inlanguagecode</var>).",
-       "apihelp-query+siteinfo-paramvalue-prop-languagevariants": "מחזיר רשימת קודי שפה שמופעל עבורם ממיר שפה ([[mw:LanguageConverter|LanguageConverter]]), וההגוונים הנתמכים עבור כל אחת מהן.",
+       "apihelp-query+siteinfo-paramvalue-prop-languagevariants": "מחזיר רשימת קודי שפה שמופעל עבורם ממיר שפה ([[mw:Special:MyLanguage/LanguageConverter|LanguageConverter]]), וההגוונים הנתמכים עבור כל אחת מהן.",
        "apihelp-query+siteinfo-paramvalue-prop-skins": "החזרת רשימת כל העיצובים הזמינים (זה יכול להיות מותאם מקומית באמצעות <var>$1inlanguagecode</var>, אחרת זה יהיה בשפת התוכן).",
        "apihelp-query+siteinfo-paramvalue-prop-extensiontags": "החזרת רשימת תגי הרחבת מפענח.",
        "apihelp-query+siteinfo-paramvalue-prop-functionhooks": "החזרת hook־ים של הרחבות מפענח.",
-       "apihelp-query+siteinfo-paramvalue-prop-showhooks": "החזרת כל ה־hook־ים המנויים (תוכן של <var>[[mw:Manual:$wgHooks|$wgHooks]]</var>).",
+       "apihelp-query+siteinfo-paramvalue-prop-showhooks": "החזרת כל ה־hook־ים המנויים (תוכן של <var>[[mw:Special:MyLanguage/Manual:$wgHooks|$wgHooks]]</var>).",
        "apihelp-query+siteinfo-paramvalue-prop-variables": "החזרת מזהי משתנים.",
        "apihelp-query+siteinfo-paramvalue-prop-protocols": "החזרת רשימת הפרוטוקולים המותרים בקישורים חיצוניים.",
        "apihelp-query+siteinfo-paramvalue-prop-defaultoptions": "החזרת הערכים ההתחלתיים של העדפות משתמש.",
        "apihelp-query+usercontribs-paramvalue-prop-flags": "הוספת הדגלים של העריכה.",
        "apihelp-query+usercontribs-paramvalue-prop-patrolled": "מתייג עריכות בדוקות.",
        "apihelp-query+usercontribs-paramvalue-prop-tags": "רשימת תגים עבור עריכות.",
-       "apihelp-query+usercontribs-param-show": "הצגה רק של פריטים שמתאימים לאמות המידה האלה, למשל רק עריכות לא־משניות.\n\nאם מוגדר <kbd>$2show=patrolled</kbd> או <kbd>$2show=!patrolled</kbd>, גרסאות ישנות מ־<var dir=\"ltr\">[[mw:Manual:$wgRCMaxAge|$wgRCMaxAge]]</var>‏ ({{PLURAL:$1|שנייה אחת|$1 שניות}}) לא תוצגנה.",
+       "apihelp-query+usercontribs-param-show": "הצגה רק של פריטים שמתאימים לאמות המידה האלה, למשל רק עריכות לא־משניות.\n\nאם מוגדר <kbd>$2show=patrolled</kbd> או <kbd>$2show=!patrolled</kbd>, גרסאות ישנות מ־<var dir=\"ltr\">[[mw:Special:MyLanguage/Manual:$wgRCMaxAge|$wgRCMaxAge]]</var>‏ ({{PLURAL:$1|שנייה אחת|$1 שניות}}) לא תוצגנה.",
        "apihelp-query+usercontribs-param-tag": "לרשום רק גרסאות עם התג הזה.",
        "apihelp-query+usercontribs-param-toponly": "לרשום רק שינויים שהם הגרסה האחרונה.",
        "apihelp-query+usercontribs-example-user": "הצגת התרומות של המשתמש <kbd>Example</kbd>.",
        "apihelp-removeauthenticationdata-description": "הסרת נתוני אימות עבור המשתמש הנוכחי.",
        "apihelp-removeauthenticationdata-example-simple": "לנסות להסיר את נתוני המשתמש הנוכחי בשביל <kbd>FooAuthenticationRequest</kbd>.",
        "apihelp-resetpassword-description": "שליחת דוא\"ל איפוס סיסמה למשתמש.",
-       "apihelp-resetpassword-description-noroutes": "אין מסלולים לאיפוס ססמה.\n\nכדי להשתמש במודול הזה, יש להפעיל מסלולים ב־<var>[[mw:Manual:$wgPasswordResetRoutes|$wgPasswordResetRoutes]]</var>.",
+       "apihelp-resetpassword-description-noroutes": "אין מסלולים לאיפוס ססמה.\n\nכדי להשתמש במודול הזה, יש להפעיל מסלולים ב־<var>[[mw:Special:MyLanguage/Manual:$wgPasswordResetRoutes|$wgPasswordResetRoutes]]</var>.",
        "apihelp-resetpassword-param-user": "המשתמש שמאופס.",
        "apihelp-resetpassword-param-email": "כתובת הדוא\"ל של המשתמש שהסיסמה שלו מאופסת.",
        "apihelp-resetpassword-example-user": "שליחת מכתב איפוס ססמה למשתמש <kbd>Example</kbd>.",
        "apihelp-setnotificationtimestamp-example-pagetimestamp": "הגדרת חותם־הזמן להודעה ל־<kbd>Main page</kbd> כך שכל העריכות מאז 1 בינואר 2012 מוגדרות בתור כאלה שלא נצפו.",
        "apihelp-setnotificationtimestamp-example-allpages": "אתחול מצב ההודעה עבור דפים במרחב השם <kbd>{{ns:user}}</kbd>.",
        "apihelp-setpagelanguage-description": "שנה את השפה של דף",
-       "apihelp-setpagelanguage-description-disabled": "שינוי השפה של דף לא מורשה בוויקי זה.\n\nהפעל את <var>[[mw:Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]]</var> על מנת להשתמש בפעולה זו",
+       "apihelp-setpagelanguage-description-disabled": "שינוי השפה של דף לא מורשה בוויקי זה.\n\nהפעל את <var>[[mw:Special:MyLanguage/Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]]</var> על מנת להשתמש בפעולה זו",
        "apihelp-setpagelanguage-param-title": "כותרת הדף שאת שפתו ברצונך לשנות. לא אפשרי להשתמש באפשרות עם <var>$1pageid</var>.",
        "apihelp-setpagelanguage-param-pageid": "מזהה הדף שאת שפתו ברצונך לשנות. לא אפשרי להשתמש באפשרות עם <var>$1title</var>.",
        "apihelp-setpagelanguage-param-lang": "קוד השפה של השפה שאליה צריך לשנות את הדף. יש להשתמש ב־<kbd>default</kbd> כדי לאתחל את הדף לשפת בררת המחדל של הוויקי.",
        "apihelp-xml-param-includexmlnamespace": "אם זה צוין, מוסיף מרחב שם של XML.",
        "apihelp-xmlfm-description": "לפלוט נתונים בתסדיר XML (עם הדפסה יפה ב־HTML).",
        "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-header": "זהו ייצוג ב־HTML של תסדיר $1. תסדיר HTML טוב לתיקון שגיאות, אבל אינו מתאים ליישומים.\n\nיש לציין את הפרמטר <var>format</var> כדי לשנות את תסדיר הפלט. כדי לראות ייצוג של תסדיר $1 לא ב־HTML יש לרשום <kbd>format=$2</kbd>.\n\nר' את [[mw:Special:MyLanguage/API|התיעוד המלא]], או את [[Special:ApiHelp/main|העזרה של API]] למידע נוסף.",
+       "api-format-prettyprint-header-only-html": "זה ייצוג HTML שמיועד לניפוי שגיאות ואינו מתאים לשימוש ביישומים.\n\nר' את [[mw:Special:MyLanguage/API|התיעוד המלא]] או את [[Special:ApiHelp/main|העזרה של API]] למידע נוסף.",
        "api-format-prettyprint-status": "התשובה הזאת הייתה מוחזרת עם סטטוס ה־HTTP מס' $1 עם הטקסט $2.",
        "api-pageset-param-titles": "רשימת כותרות.",
        "api-pageset-param-pageids": "רשימת מזהי דף לעבוד עליהם.",
        "api-help-param-default-empty": "ברירת מחדל: <span class=\"apihelp-empty\">(ריק)</span>",
        "api-help-param-token": "אסימון \"$1\" שאוחזר מ־[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]",
        "api-help-param-token-webui": "לשם תאימות, גם האסימון שמשמש בממשק דפדפן מתקבל.",
-       "api-help-param-disabled-in-miser-mode": "כבוי בשל [[mw:Manual:$wgMiserMode|מצב חיסכון]].",
-       "api-help-param-limited-in-miser-mode": "<strong>לתשומת לבך:</strong> בשל [[mw:Manual:$wgMiserMode|מצב חיסכון]], שימוש בזה יכול להוביל לפחות מ־<var>$1limit</var> תוצאות לפני המשך; במצבים קיצוניים ייתכן שיחזרו אפס תוצאות.",
+       "api-help-param-disabled-in-miser-mode": "כבוי בשל [[mw:Special:MyLanguage/Manual:$wgMiserMode|מצב חיסכון]].",
+       "api-help-param-limited-in-miser-mode": "<strong>לתשומת לבך:</strong> בשל [[mw:Special:MyLanguage/Manual:$wgMiserMode|מצב חיסכון]], שימוש בזה יכול להוביל לפחות מ־<var>$1limit</var> תוצאות לפני המשך; במצבים קיצוניים ייתכן שיחזרו אפס תוצאות.",
        "api-help-param-direction": "באיזה כיוון למנות:\n;newer:לרשום את הישנים ביותר בהתחלה. לתשומת לבך: $1start חייב להיות לפני $1end.\n;older:לרשום את החדשים ביותר בהתחלה (בררת מחדל). לתשומת לבך: $1start חייב להיות אחרי $1end.",
        "api-help-param-continue": "כשיש עוד תוצאות, להשתמש בזה בשביל להמשיך.",
        "api-help-param-no-description": "<span class=\"apihelp-empty\">(ללא תיאור)</span>",
index d84775f..22b23f0 100644 (file)
@@ -19,7 +19,7 @@
                        "Margherita.mignanelli"
                ]
        },
-       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Documentazione]] (in inglese)\n* [[mw:API:FAQ|FAQ]] (in inglese)\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Mailing list]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Annunci sull'API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Bug & richieste]\n</div>\n<strong>Stato:</strong> tutte le funzioni e caratteristiche mostrate su questa pagina dovrebbero funzionare, ma le API sono ancora in fase attiva di sviluppo, e potrebbero cambiare in qualsiasi momento. Iscriviti alla [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ la mailing list sugli annunci delle API MediaWiki] per essere informato sugli aggiornamenti.\n\n<strong>Istruzioni sbagliate:</strong> quando vengono impartite alle API delle istruzioni sbagliate, un'intestazione HTTP verrà inviata col messaggio \"MediaWiki-API-Error\" e, sia il valore dell'intestazione, sia il codice d'errore, verranno impostati con lo stesso valore. Per maggiori informazioni leggi [[mw:API:Errors_and_warnings|API:Errori ed avvertimenti]] (in inglese).\n\n<strong>Test:</strong> per testare facilmente le richieste API, vedi [[Special:ApiSandbox]].",
+       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:Special:MyLanguage/API:Main_page|Documentazione]] (in inglese)\n* [[mw:Special:MyLanguage/API:FAQ|FAQ]] (in inglese)\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Mailing list]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Annunci sull'API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Bug & richieste]\n</div>\n<strong>Stato:</strong> tutte le funzioni e caratteristiche mostrate su questa pagina dovrebbero funzionare, ma le API sono ancora in fase attiva di sviluppo, e potrebbero cambiare in qualsiasi momento. Iscriviti alla [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ la mailing list sugli annunci delle API MediaWiki] per essere informato sugli aggiornamenti.\n\n<strong>Istruzioni sbagliate:</strong> quando vengono impartite alle API delle istruzioni sbagliate, un'intestazione HTTP verrà inviata col messaggio \"MediaWiki-API-Error\" e, sia il valore dell'intestazione, sia il codice d'errore, verranno impostati con lo stesso valore. Per maggiori informazioni leggi [[mw:Special:MyLanguage/API:Errors_and_warnings|API:Errori ed avvertimenti]] (in inglese).\n\n<strong>Test:</strong> per testare facilmente le richieste API, vedi [[Special:ApiSandbox]].",
        "apihelp-main-param-action": "Azione da compiere.",
        "apihelp-main-param-format": "Formato dell'output.",
        "apihelp-main-param-assert": "Verifica che l'utente abbia effettuato l'accesso se si è impostato <kbd>user</kbd>, o che abbia i permessi di bot se si è impostato <kbd>bot</kbd>.",
        "apihelp-move-example-move": "Sposta <kbd>Badtitle</kbd> a <kbd>Goodtitle</kbd> senza lasciare redirect.",
        "apihelp-opensearch-param-search": "Stringa di ricerca.",
        "apihelp-opensearch-param-limit": "Numero massimo di risultati da restituire.",
-       "apihelp-opensearch-param-suggest": "Non fare nulla se <var>[[mw:Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]</var> è falso.",
+       "apihelp-opensearch-param-suggest": "Non fare nulla se <var>[[mw:Special:MyLanguage/Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]</var> è falso.",
        "apihelp-opensearch-param-format": "Il formato dell'output.",
        "apihelp-opensearch-example-te": "Trova le pagine che iniziano con <kbd>Te</kbd>.",
        "apihelp-options-param-optionvalue": "Il valore per l'opzione specificata da <var>$1optionname</var>.",
        "apihelp-query+siteinfo-paramvalue-prop-libraries": "Restituisci librerie installate sul wiki.",
        "apihelp-query+siteinfo-paramvalue-prop-extensions": "Restituisci estensioni installate sul wiki.",
        "apihelp-query+siteinfo-paramvalue-prop-restrictions": "Restituisce informazioni sui tipi di restrizione (protezione) disponibili.",
+       "apihelp-query+siteinfo-paramvalue-prop-languagevariants": "Restituisce un'elenco di codici lingua per cui [[mw:Special:MyLanguage/LanguageConverter|LanguageConverter]] è attivo, e le varianti supportate per ognuno di essi.",
        "apihelp-query+siteinfo-example-simple": "Recupera informazioni sul sito.",
        "apihelp-query+tags-param-prop": "Quali proprietà ottenere:",
        "apihelp-query+templates-param-limit": "Quanti template restituire.",
        "apihelp-removeauthenticationdata-description": "Rimuove i dati di autenticazione per l'utente corrente.",
        "apihelp-removeauthenticationdata-example-simple": "Tentativo di rimuovere gli attuali dati utente per <kbd>FooAuthenticationRequest</kbd>.",
        "apihelp-resetpassword-description": "Invia una mail per reimpostare la password di un utente.",
-       "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-description-noroutes": "Non sono disponibili rotte per la reimpostazione della password.\n\nAbilita le rotte in <var>[[mw:Special:MyLanguage/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-example-user": "Invia una mail per reimpostare la password all'utente <kbd>Example</kbd>.",
index e17b9ad..d2f595d 100644 (file)
        "apihelp-query+siteinfo-paramvalue-prop-general": "システム全体の情報。",
        "apihelp-query+siteinfo-paramvalue-prop-specialpagealiases": "特別ページの別名の一覧。",
        "apihelp-query+siteinfo-paramvalue-prop-magicwords": "マジックワードとこれらの別名の一覧。",
+       "apihelp-query+siteinfo-paramvalue-prop-fileextensions": "アップロードが許可されているファイル拡張子の一覧を返します。",
        "apihelp-query+siteinfo-param-numberingroup": "利用者グループに属する利用者の数を一覧表示します。",
        "apihelp-query+siteinfo-example-simple": "サイト情報を取得する。",
        "apihelp-query+tags-description": "変更タグを一覧表示します。",
index ec20f8a..f171f08 100644 (file)
        "apihelp-delete-param-watch": "문서를 현재 사용자의 주시문서 목록에 추가합니다.",
        "apihelp-delete-param-unwatch": "문서를 현재 사용자의 주시문서 목록에서 제거합니다.",
        "apihelp-delete-example-simple": "<kbd>Main Page</kbd>를 삭제합니다.",
+       "apihelp-delete-example-reason": "<kbd>Preparing for move</kbd> 라는 이유로 <kbd>Main Page</kbd>를 삭제하기.",
        "apihelp-disabled-description": "이 모듈은 해제되었습니다.",
        "apihelp-edit-description": "문서를 만들고 편집합니다.",
+       "apihelp-edit-param-title": "편집할 문서의 제목. <var>$1pageid</var>과 같이 사용할 수 없습니다.",
        "apihelp-edit-param-section": "문단 번호입니다. <kbd>0</kbd>은 최상위 문단, <kbd>new</kbd>는 새 문단입니다.",
        "apihelp-edit-param-sectiontitle": "새 문단을 위한 제목.",
        "apihelp-edit-param-text": "문서 내용.",
        "apihelp-protect-example-protect": "문서 보호",
        "apihelp-purge-description": "주어진 제목을 위한 캐시를 새로 고침.",
        "apihelp-purge-param-forcelinkupdate": "링크 테이블을 업데이트합니다.",
+       "apihelp-purge-example-simple": "<kbd>Main Page</kbd>와 <kbd>API</kbd> 문서를 새로 고침.",
        "apihelp-query-param-prop": "조회된 페이지에 대해 가져올 속성입니다.",
        "apihelp-query-param-list": "가져올 목록입니다.",
        "apihelp-query-param-meta": "가져올 메타데이터입니다.",
        "apihelp-query+allusers-example-Y": "<kbd>Y</kbd>로 시작하는 사용자를 나열합니다.",
        "apihelp-query+authmanagerinfo-description": "현재의 인증 상태에 대한 정보를 검색합니다.",
        "apihelp-query+backlinks-param-namespace": "열거할 이름공간.",
+       "apihelp-query+backlinks-example-simple": "<kbd>Main Page</kbd>를 가리키는 링크를 보이기.",
+       "apihelp-query+backlinks-example-generator": "<kbd>Main Page</kbd>를 가리키는 문서의 정보를 보기.",
        "apihelp-query+blocks-description": "차단된 모든 사용자와 IP 주소를 나열합니다.",
        "apihelp-query+blocks-param-start": "나열을 시작할 타임스탬프",
        "apihelp-query+blocks-param-end": "나열을 끝낼 타임스탬프",
        "apierror-invalid-file-key": "유효한 파일 키가 아닙니다.",
        "apierror-invalidoldimage": "<var>oldimage</var> 변수에 유효하지 않은 형식이 있습니다.",
        "apierror-invalidparammix-cannotusewith": "<kbd>$1</kbd> 변수는 <kbd>$2</kbd>와(과) 함께 사용할 수 없습니다.",
+       "apierror-invalidsection": "<var>section</var> 변수는 유효한 섹션 ID 또는 <kbd>new</kbd>이어야 합니다.",
        "apierror-invalidsha1base36hash": "제공된 SHA1Base36 해시가 유효하지 않습니다.",
        "apierror-invalidsha1hash": "제공된 SHA1 해시가 유효하지 않습니다.",
        "apierror-invalidtitle": "잘못된 제목 \"$1\".",
index a803645..262f903 100644 (file)
        "apihelp-revisiondelete-param-reason": "Grond fir ze Läschen oder ze Restauréieren.",
        "apihelp-rsd-example-simple": "Den RSD-Schema exportéieren",
        "apihelp-setpagelanguage-description": "D'Sprooch vun enger Säit änneren",
+       "apihelp-setpagelanguage-description-disabled": "Aschalten\n<var>[[mw:Special:MyLanguage/Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]]</var> fir dëse Aktioun ze benotzen",
        "apihelp-setpagelanguage-param-reason": "Grond fir d'Ännerung.",
        "apihelp-setpagelanguage-example-language": "Ännert d'Sprooch vun der <kbd>Main Page</kbd> op baskesch.",
        "apihelp-stashedit-param-title": "Titel vun der Säit déi geännert gëtt.",
index a305bc2..a5291c7 100644 (file)
                        "Mainframe98"
                ]
        },
-       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Documentatie]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api E-maillijst]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API-aankondigingen]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Bugs & verzoeken]\n</div>\n<strong>Status:</strong> Alle functies die op deze pagina worden weergegeven horen te werken. Aan de API wordt actief gewerkt, en deze kan gewijzigd worden. Abonneer u op  de [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ e-maillijst mediawiki-api-announce] voor meldingen over aanpassingen.\n\n<strong>Foutieve verzoeken:</strong> als de API foutieve verzoeken ontvangt, wordt er geantwoord met een HTTP-header met de sleutel \"MediaWiki-API-Error\" en daarna worden de waarde van de header en de foutcode op dezelfde waarde ingesteld. Zie [[mw:API:Errors_and_warnings|API: Errors and warnings]] voor meer informatie.\n\n<strong>Testen:</strong> u kunt [[Special:ApiSandbox|eenvoudig API-verzoeken testen]].",
+       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:Special:MyLanguage/API:Main_page|Documentatie]]\n* [[mw:Special:MyLanguage/API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api E-maillijst]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API-aankondigingen]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Bugs & verzoeken]\n</div>\n<strong>Status:</strong> Alle functies die op deze pagina worden weergegeven horen te werken. Aan de API wordt actief gewerkt, en deze kan gewijzigd worden. Abonneer u op  de [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ e-maillijst mediawiki-api-announce] voor meldingen over aanpassingen.\n\n<strong>Foutieve verzoeken:</strong> als de API foutieve verzoeken ontvangt, wordt er geantwoord met een HTTP-header met de sleutel \"MediaWiki-API-Error\" en daarna worden de waarde van de header en de foutcode op dezelfde waarde ingesteld. Zie [[mw:Special:MyLanguage/API:Errors_and_warnings|API: Foutmeldingen en waarschuwingen]] voor meer informatie.\n\n<strong>Testen:</strong> u kunt [[Special:ApiSandbox|eenvoudig API-verzoeken testen]].",
        "apihelp-main-param-action": "Welke handeling uit te voeren.",
        "apihelp-main-param-format": "De opmaak van de uitvoer.",
-       "apihelp-main-param-maxlag": "De maximale vertraging kan gebruikt worden als MediaWiki is geïnstalleerd op een databasecluster die gebruik maakt van replicatie. Om te voorkomen dat handelingen nog meer databasereplicatievertraging veroorzaken, kan deze parameter er voor zorgen dat de client wacht totdat de replicatievertraging lager is dan de aangegeven waarde. In het geval van buitensporige vertraging, wordt de foutcode <samp>maxlag</samp> teruggegeven met een bericht als <samp>Waiting for $host: $lag seconds lagged</samp>.<br />Zie [[mw:Manual:Maxlag_parameter|Handboek: Maxlag parameter]] voor mee informatie.",
+       "apihelp-main-param-maxlag": "De maximale vertraging kan gebruikt worden als MediaWiki is geïnstalleerd op een databasecluster die gebruik maakt van replicatie. Om te voorkomen dat handelingen nog meer databasereplicatievertraging veroorzaken, kan deze parameter er voor zorgen dat de client wacht totdat de replicatievertraging lager is dan de aangegeven waarde. In het geval van buitensporige vertraging, wordt de foutcode <samp>maxlag</samp> teruggegeven met een bericht als <samp>Waiting for $host: $lag seconds lagged</samp>.<br />Zie [[mw:Special:MyLanguage/Manual:Maxlag_parameter|Handleiding:Maxlag parameter]] voor meer informatie.",
        "apihelp-main-param-smaxage": "Stelt de <code>s-maxage</code> HTTP cache controle header in op het aangegeven aantal seconden. Foutmeldingen komen nooit in de cache.",
        "apihelp-main-param-maxage": "Stelt de <code>max-age</code> HTTP cache controle header in op het aangegeven aantal seconden. Foutmeldingen komen nooit in de cache.",
        "apihelp-main-param-assert": "Controleer of de gebruiker is aangemeld als <kbd>user</kbd> is meegegeven, en of de gebruiker het robotgebruikersrecht heeft als <kbd>bot</kbd> is meegegeven.",
@@ -42,7 +42,7 @@
        "apihelp-block-param-autoblock": "Blokkeer automatisch het laatst gebruikte IP-adres en ieder volgend IP-adres van waaruit ze proberen aan te melden.",
        "apihelp-block-param-noemail": "Gebruiker weerhouden van het sturen van e-mail. (Vereist het <code>blockemail</code> recht).",
        "apihelp-block-param-hidename": "Verberg de gebruikersnaam uit het blokkeerlogboek. (Vereist het <code>hideuser</code> recht).",
-       "apihelp-block-param-allowusertalk": "De gebruiker toestaan om hun eigen overlegpagina te bewerken (afhankelijk van <var>[[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var>).",
+       "apihelp-block-param-allowusertalk": "De gebruiker toestaan om hun eigen overlegpagina te bewerken (afhankelijk van <var>[[mw:Special:MyLanguage/Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var>).",
        "apihelp-block-param-reblock": "De huidige blokkade aanpassen als de gebruiker al geblokkeerd is.",
        "apihelp-block-param-watchuser": "De gebruikerspagina en overlegpagina van de gebruiker of het IP-adres volgen.",
        "apihelp-block-param-tags": "Wijzigingslabels om toe te passen op de regel in het blokkeerlogboek.",
        "apihelp-feedrecentchanges-param-feedformat": "De indeling van de feed.",
        "apihelp-feedrecentchanges-param-namespace": "Naamruimte om de resultaten tot te beperken.",
        "apihelp-feedrecentchanges-param-invert": "Alle naamruimten behalve de geselecteerde.",
+       "apihelp-feedrecentchanges-param-days": "Aantal dagen om de resultaten tot te beperken.",
        "apihelp-feedrecentchanges-param-limit": "Het maximaal aantal weer te geven resultaten.",
        "apihelp-feedrecentchanges-param-hideminor": "Kleine wijzigingen verbergen.",
        "apihelp-feedrecentchanges-param-hidebots": "Wijzigingen gedaan door bots verbergen.",
        "apihelp-purge-param-forcelinkupdate": "Werk de koppelingstabellen bij.",
        "apihelp-purge-param-forcerecursivelinkupdate": "Werk de koppelingentabel bij, en werk de koppelingstabellen bij voor alle pagina's die gebruik maken van deze pagina als sjabloon.",
        "apihelp-query+allcategories-param-dir": "Richting om in te sorteren.",
+       "apihelp-query+allcategories-param-limit": "Hoeveel categorieën te tonen.",
        "apihelp-query+allcategories-paramvalue-prop-size": "Voegt het aantal pagina's in de categorie toe.",
        "apihelp-query+allcategories-paramvalue-prop-hidden": "Markeert categorieën die verborgen zijn met <code>_&#95;HIDDENCAT_&#95;</code>",
        "apihelp-query+alldeletedrevisions-param-tag": "Alleen versies weergeven met dit label.",
index 91e3e50..a339459 100644 (file)
@@ -37,7 +37,7 @@
        "apihelp-block-param-autoblock": "Zablokuj ostatni adres IP tego użytkownika i automatycznie wszystkie kolejne, z których będzie się logował.",
        "apihelp-block-param-noemail": "Uniemożliwia użytkownikowi wysyłanie wiadomości e-mail za pośrednictwem interfejsu wiki. (Wymagane uprawnienie <code>blockemail</code>).",
        "apihelp-block-param-hidename": "Ukryj nazwę użytkownika z rejestru blokad. (Wymagane uprawnienia <code>hideuser</code>)",
-       "apihelp-block-param-allowusertalk": "Pozwala użytkownikowi edytować własną stronę dyskusji (zależy od <var>[[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var>).",
+       "apihelp-block-param-allowusertalk": "Pozwala użytkownikowi edytować własną stronę dyskusji (zależy od <var>[[mw:Special:MyLanguage/Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var>).",
        "apihelp-block-param-reblock": "Jeżeli ten użytkownik jest już zablokowany, nadpisz blokadę.",
        "apihelp-block-param-watchuser": "Obserwuj stronę użytkownika i jego IP oraz ich strony dyskusji.",
        "apihelp-block-example-ip-simple": "Zablokuj IP <kbd>192.0.2.5</kbd> na 3 dni z powodem <kbd>First strike</kbd>.",
        "apihelp-opensearch-param-search": "Wyszukaj tekst.",
        "apihelp-opensearch-param-limit": "Maksymalna liczba zwracanych wyników.",
        "apihelp-opensearch-param-namespace": "Przestrzenie nazw do przeszukania.",
-       "apihelp-opensearch-param-suggest": "Nie działa jeżeli <var>[[mw:Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]</var> ustawiono na false.",
+       "apihelp-opensearch-param-suggest": "Nic nie rób, jeżeli <var>[[mw:Special:MyLanguage/Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]</var> ustawiono na false.",
        "apihelp-opensearch-param-redirects": "Jak obsługiwać przekierowania:\n;return:Zwróć samo przekierowanie.\n;resolve:Zwróć stronę docelową. Może zwrócić mniej niż wyników określonych w $1limit.\nZ powodów historycznych, domyślnie jest to \"return\" dla $1format=json, a \"resolve\" dla innych formatów.",
        "apihelp-opensearch-param-format": "Format danych wyjściowych.",
        "apihelp-opensearch-param-warningsaserror": "Jeżeli pojawią się ostrzeżenia związane z <kbd>format=json</kbd>, zwróć błąd API zamiast ignorowania ich.",
        "api-help-permissions-granted-to": "{{PLURAL:$1|Przydzielone dla}}: $2",
        "api-help-right-apihighlimits": "Użyj wyższych limitów w zapytaniach API (dla zapytań powolnych: $1; dla zapytań szbkich: $2). Limity zapytań powolnych są także stosowane dla parametrów z podanymi wieloma wartościami.",
        "api-help-open-in-apisandbox": "<small>[otwórz w brudnopisie]</small>",
+       "apierror-articleexists": "Artykuł, który próbowałeś utworzyć, już został utworzony.",
        "apierror-baddiff": "Różnicy wersji nie można odtworzyć. Jedna lub obie wersje nie istnieją, lub nie masz uprawnień do ich wyświetlenia.",
        "apierror-badgenerator-unknown": "Nieznany <kbd>generator=$1</kbd>.",
        "apierror-badip": "Parametr IP nie jest prawidłowy.",
index c340d4a..7d5f7ea 100644 (file)
@@ -11,7 +11,8 @@
                        "Caçador de Palavras",
                        "LucyDiniz",
                        "Eduardo Addad de Oliveira",
-                       "Warley Felipe C."
+                       "Warley Felipe C.",
+                       "TheEduGobi"
                ]
        },
        "apihelp-main-param-action": "Qual ação executar.",
@@ -22,6 +23,7 @@
        "apihelp-main-param-requestid": "Qualquer valor dado aqui será incluído na resposta. Pode ser usado para distinguir requisições.",
        "apihelp-main-param-servedby": "Inclua o nome de host que atendeu a solicitação nos resultados.",
        "apihelp-main-param-curtimestamp": "Inclui a data atual no resultado.",
+       "apihelp-main-param-origin": "Ao acessar a API usando uma solicitação AJAX por domínio cruzado (CORS), defina isto como o domínio de origem. Isto deve estar incluso em toda solicitação ''pre-flight'', sendo portanto parte do URI da solicitação (ao invés do corpo do POST).\n\nPara solicitações autenticadas, isto deve corresponder a uma das origens no cabeçalho <code>Origin</code>, para que seja algo como <kbd>https://pt.wikipedia.org</kbd> ou <kbd>https://meta.wikimedia.org</kbd>. Se este parâmetro não corresponder ao cabeçalho <code>Origin</code>, uma resposta 403 será retornada. Se este parâmetro corresponder ao cabeçalho <code>Origin</code> e a origem for permitida (''whitelisted''), os cabeçalhos <code>Access-Control-Allow-Origin</code> e <code>Access-Control-Allow-Credentials</code> serão definidos.\n\nPara solicitações não autenticadas, especifique o valor <kbd>*</kbd>. Isto fará com que o cabeçalho <code>Access-Control-Allow-Origin</code> seja definido, porém o <code>Access-Control-Allow-Credentials</code> será <code>false</code> e todos os dados específicos para usuários tornar-se-ão restritos.",
        "apihelp-block-description": "Bloquear um usuário",
        "apihelp-block-param-user": "Nome de usuário, endereço IP ou faixa de IP para bloquear.",
        "apihelp-block-param-reason": "Razão do bloqueio.",
@@ -91,7 +93,7 @@
        "apihelp-feedcontributions-param-newonly": "Mostrar somente as edições que são criação de páginas.",
        "apihelp-feedcontributions-param-hideminor": "Ocultar edições menores.",
        "apihelp-feedcontributions-param-showsizediff": "Mostrar a diferença de tamanho entre as revisões.",
-       "apihelp-feedrecentchanges-description": "Retorna um feed de alterações recentes.",
+       "apihelp-feedrecentchanges-description": "Retorna um ''feed'' de mudanças recentes.",
        "apihelp-feedrecentchanges-param-feedformat": "O formato do feed.",
        "apihelp-feedrecentchanges-param-namespace": "Espaço nominal a partir do qual limitar resultados.",
        "apihelp-feedrecentchanges-param-invert": "Todos os espaços nominais, exceto o selecionado.",
        "apihelp-feedrecentchanges-param-hidecategorization": "Alterações de membros pertencentes à uma categoria.",
        "apihelp-feedrecentchanges-param-tagfilter": "Filtrar por tag.",
        "apihelp-feedrecentchanges-example-simple": "Mostrar as mudanças recentes.",
-       "apihelp-feedrecentchanges-example-30days": "Mostrar as alterações recentes por 30 dias.",
+       "apihelp-feedrecentchanges-example-30days": "Mostrar as mudanças recentes por 30 dias.",
        "apihelp-feedwatchlist-description": "Retornar um feed da lista de vigiados.",
        "apihelp-feedwatchlist-param-feedformat": "O formato do feed.",
        "apihelp-feedwatchlist-param-hours": "Lista páginas modificadas dentro dessa quantia de horas a partir de agora.",
index cca3a3c..6e70653 100644 (file)
        "apihelp-parse-paramvalue-prop-limitreportdata": "{{doc-apihelp-paramvalue|parse|prop|limitreportdata}}",
        "apihelp-parse-paramvalue-prop-limitreporthtml": "{{doc-apihelp-paramvalue|parse|prop|limitreporthtml}}",
        "apihelp-parse-paramvalue-prop-parsetree": "{{doc-apihelp-paramvalue|parse|prop|parsetree|params=* $1 - Value of the constant CONTENT_MODEL_WIKITEXT|paramstart=2}}",
+       "apihelp-parse-paramvalue-prop-parsewarnings": "{{doc-apihelp-paramvalue|parse|prop|parsewarnings}}",
        "apihelp-parse-param-pst": "{{doc-apihelp-param|parse|pst}}",
        "apihelp-parse-param-onlypst": "{{doc-apihelp-param|parse|onlypst}}",
        "apihelp-parse-param-effectivelanglinks": "{{doc-apihelp-param|parse|effectivelanglinks}}",
index 007c9d7..671ac98 100644 (file)
                        "Kareyac",
                        "Mailman",
                        "Ping08",
-                       "Ivan-r"
+                       "Ivan-r",
+                       "Redredsonia",
+                       "Alexey zakharenkov"
                ]
        },
-       "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-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:Special:MyLanguage/API:Main_page|Документация]]\n* [[mw:Special:MyLanguage/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:Special:MyLanguage/API:Errors_and_warnings|API: Ошибки и предупреждения]].\n\n<strong>Тестирование:</strong> для удобства тестирования API-запросов, см. [[Special:ApiSandbox]].",
        "apihelp-main-param-action": "Действие, которое следует выполнить.",
        "apihelp-main-param-format": "Формат вывода.",
-       "apihelp-main-param-maxlag": "Значение максимального отставания может использоваться, когда MediaWiki устанавливается на кластер из реплицируемых баз данных. Чтобы избежать ухудшения ситуации с отставанием репликации сайта, этот параметр может заставить клиента ждать, когда задержка репликации станет ниже указанного значения. В случае чрезмерной задержки возвращается код ошибки «<samp>maxlag</samp>» с сообщением «<samp>Waiting for $host: $lag seconds lagged</samp>».<br />См. подробнее на странице с описанием [[mw:Manual:Maxlag_parameter|параметра maxlag]].",
+       "apihelp-main-param-maxlag": "Значение максимального отставания может использоваться, когда MediaWiki устанавливается на кластер из реплицируемых баз данных. Чтобы избежать ухудшения ситуации с отставанием репликации сайта, этот параметр может заставить клиента ждать, когда задержка репликации станет ниже указанного значения. В случае чрезмерной задержки возвращается код ошибки «<samp>maxlag</samp>» с сообщением «<samp>Waiting for $host: $lag seconds lagged</samp>».<br />См. подробнее на странице с описанием [[mw:Special:MyLanguage/Manual:Maxlag_parameter|Manual: параметра Maxlag ]].",
        "apihelp-main-param-smaxage": "Устанавливает значение HTTP-заголовка Cache-Control <code>s-maxage</code> в заданное число секунд. Ошибки никогда не кэшируются.",
        "apihelp-main-param-maxage": "Устанавливает значение HTTP-заголовка Cache-Control <code>s-maxage</code> в заданное число секунд. Ошибки никогда не кэшируются.",
        "apihelp-main-param-assert": "Удостовериться, что пользователь авторизован, если задано <kbd>user</kbd>, или что имеет права бота, если задано <kbd>bot</kbd>.",
@@ -50,7 +52,7 @@
        "apihelp-block-param-autoblock": "Автоматически блокировать последний использованный IP-адрес и все последующие, с которых будут совершаться попытки авторизации.",
        "apihelp-block-param-noemail": "Запретить участнику отправлять электронную почту через интерфейс вики. (Требуется право <code>blockemail</code>).",
        "apihelp-block-param-hidename": "Скрыть имя участника из журнала блокировок. (Требуется право <code>hideuser</code>).",
-       "apihelp-block-param-allowusertalk": "Позволяет участникам редактировать их собственные страницы обсуждения (зависит от <var>[[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var>).",
+       "apihelp-block-param-allowusertalk": "Позволяет участникам редактировать их собственные страницы обсуждения (зависит от <var>[[mw:Special:MyLanguage/Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var>).",
        "apihelp-block-param-reblock": "Если участник уже заблокирован, перезаписать существующую блокировку.",
        "apihelp-block-param-watchuser": "Следить за страницей пользователя или IP-участника и страницей обсуждения.",
        "apihelp-block-example-ip-simple": "Заблокировать IP-адрес <kbd>192.0.2.5</kbd> в течение трех дней с причиной <kbd>первого удара</kbd>.",
        "apihelp-parse-example-summary": "Һығымтаны тикшереү.",
        "apihelp-patrol-param-rcid": "Яңы үҙгәртеүҙәрҙе ҡарау идентификаторы.",
        "apihelp-patrol-param-revid": "Ҡарау версияһы идентификаторы.",
-       "apihelp-patrol-example-rcid": "Һуңғы үҙгәрештәрҙе ҡарау.",
-       "apihelp-patrol-example-revid": "ЯңÑ\8bнан Ò¡Ð°Ñ\80аÑ\83.",
+       "apihelp-patrol-example-rcid": "Патрулировать недавние изменения.",
+       "apihelp-patrol-example-revid": "Ð\9fаÑ\82Ñ\80Ñ\83лиÑ\80оваÑ\82Ñ\8c Ð²ÐµÑ\80Ñ\81иÑ\8e.",
        "apihelp-protect-description": "Изменить уровень защиты страницы.",
        "apihelp-protect-param-title": "Бит атамаһы. $1pageid менән бергә ҡулланылмай.",
        "apihelp-protect-param-reason": "(ООН) һағы сәбәптәре.",
        "apihelp-query+revisions+base-param-limit": "Ограничение на количество версий которое будут вовзращено",
        "apihelp-query+search-description": "Выполнить полнотекстовый поиск.",
        "apihelp-query+siteinfo-paramvalue-prop-fileextensions": "Возвращает список расширений (типы файлов), которые доступны к загрузке",
+       "apihelp-query+siteinfo-paramvalue-prop-languagevariants": "Возвращает список кодов языков, для которых включён [[mw:Special:MyLanguage/LanguageConverter|LanguageConverter]], а также варианты,поддерживаемые для каждого языка.",
        "apihelp-query+tags-description": "Список изменерий тегов.",
        "apihelp-query+tags-example-simple": "Лист доступных тегов",
        "apihelp-query+templates-param-namespace": "Показывать шаблоны только из данного списка имен",
        "api-help-permissions": "{{PLURAL:$1|Разрешение|Разрешения}}:",
        "api-help-permissions-granted-to": "{{PLURAL:$1|Granted to}}: $2",
        "apierror-integeroutofrange-abovemax": "<var>$1</var> не может быть более $2 (на $3) для пользователей.",
+       "apierror-invalidoldimage": "Параметр <var>oldimage</var> имеет недопустимый формат.",
        "apierror-nosuchuserid": "Нет пользователя с ID $1.",
        "apierror-pagelang-disabled": "Меняется язык страницы не допускается в этой Вики.",
        "apierror-protect-invalidaction": "Недопустимый тип защиты \"$1\".",
index 1396458..fb6698f 100644 (file)
        "apihelp-query+protectedtitles-example-simple": "Lista skyddade titlar.",
        "apihelp-query+recentchanges-example-simple": "Lista de senaste ändringarna.",
        "apihelp-query+revisions-example-first5-not-localhost": "Hämta första 5 revideringarna av \"huvudsidan\" och som inte gjorts av anonym användare \"127.0.0.1\"",
+       "apihelp-query+siteinfo-paramvalue-prop-languagevariants": "Returnerar en lista över språkkoder som [[mw:LanguageConverter|LanguageConverter]] har aktiverat och de varianter som varje stöder.",
        "apihelp-query+siteinfo-example-simple": "Hämta information om webbplatsen.",
        "apihelp-query+stashimageinfo-description": "Returnerar filinformation för temporära filer.",
        "apihelp-query+stashimageinfo-param-filekey": "Nyckel som identifierar en tidigare uppladdning som lagrats temporärt.",
        "api-help-param-multi-separate": "Separera värden med <kbd>|</kbd> eller [[Special:ApiHelp/main#main/datatypes|alternativ]].",
        "apierror-articleexists": "Artikeln du försökte skapa har redan skapats.",
        "apierror-baddiff": "Diff kan inte hämtas. En eller båda sidversioner finns inte eller du har inte behörighet för att visa dem.",
+       "apierror-invalidoldimage": "Parametern <var>oldimage</var> har ett ogiltigt format.",
        "apierror-invalidsection": "Parametern <var>section</var> måste vara ett giltigt avsnitts-ID eller <kbd>new</kbd>.",
        "apierror-nosuchuserid": "Det finns ingen användare med ID $1.",
        "apierror-protect-invalidaction": "Ogiltig skyddstyp \"$1\".",
index 996f26e..78f16d3 100644 (file)
        "apihelp-parse-paramvalue-prop-limitreportdata": "Дає звіт по обмеженнях у структурованому вигляді. Не видає даних, якщо встановлено <var>$1disablelimitreport</var>.",
        "apihelp-parse-paramvalue-prop-limitreporthtml": "Дає HTML-версію звіту по обмеженнях. Не видає даних, якщо встановлено <var>$1disablelimitreport</var>.",
        "apihelp-parse-paramvalue-prop-parsetree": "Синтаксичне дерево XML вмісту версії (передбачає модель вмісту <code>$1</code>)",
+       "apihelp-parse-paramvalue-prop-parsewarnings": "Виводить попередження, які з'явилися при обробці контенту.",
        "apihelp-parse-param-pst": "Зробіть трансформацію вхідних даних перед збереженням і аналізом. Дійсне лише при використанні з текстом.",
        "apihelp-parse-param-onlypst": "Зробіть трансформацію вхідних даних перед збереженням (PST), але не аналізуйте. Видає той самий вікітекст, після застосування PST. Дійсне лише у разі використання з <var>$1text</var>.",
        "apihelp-parse-param-effectivelanglinks": "Включає мовні посилання, додані розширеннями (для використання з <kbd>$1prop=langlinks</kbd>).",
index 731a9c0..152f1df 100644 (file)
                        "D41D8CD98F"
                ]
        },
-       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|文档]]\n* [[mw:API:FAQ|常见问题]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api 邮件列表]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API公告]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R 程序错误与功能请求]\n</div>\n<strong>状态信息:</strong>本页所展示的所有特性都应正常工作,但是API仍在开发当中,将会随时变化。请订阅[https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ mediawiki-api-announce 邮件列表]以便获得更新通知。\n\n<strong>错误请求:</strong>当API收到错误请求时,HTTP header将会返回一个包含\"MediaWiki-API-Error\"的值,随后header的值与error code将会送回并设置为相同的值。详细信息请参阅[[mw:API:Errors_and_warnings|API: 错误与警告]]。\n\n<strong>测试中:</strong>测试API请求的易用性,请参见[[Special:ApiSandbox]]。",
+       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:Special:MyLanguage/API:Main_page|文档]]\n* [[mw:Special:MyLanguage/API:FAQ|常见问题]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api 邮件列表]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API公告]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R 程序错误与功能请求]\n</div>\n<strong>状态信息:</strong>本页所展示的所有特性都应正常工作,但是API仍在开发当中,将会随时变化。请订阅[https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ mediawiki-api-announce 邮件列表]以便获得更新通知。\n\n<strong>错误请求:</strong>当API收到错误请求时,HTTP header将会返回一个包含\"MediaWiki-API-Error\"的值,随后header的值与error code将会送回并设置为相同的值。详细信息请参阅[[mw:Special:MyLanguage/API:Errors_and_warnings|API: 错误与警告]]。\n\n<strong>测试中:</strong>测试API请求的易用性,请参见[[Special:ApiSandbox]]。",
        "apihelp-main-param-action": "要执行的操作。",
        "apihelp-main-param-format": "输出的格式。",
-       "apihelp-main-param-maxlag": "最大延迟可被用于MediaWiki安装于数据库复制集中。要保存导致更多网站复制延迟的操作,此参数可使客户端等待直到复制延迟少于指定值时。万一发生过多延迟,错误代码<samp>maxlag</samp>会返回消息,例如<samp>等待$host中:延迟$lag秒</samp>。<br />参见[[mw:Manual:Maxlag_parameter|Manual: Maxlag parameter]]以获取更多信息。",
+       "apihelp-main-param-maxlag": "最大延迟可被用于MediaWiki安装于数据库复制集中。要保存导致更多网站复制延迟的操作,此参数可使客户端等待直到复制延迟少于指定值时。万一发生过多延迟,错误代码<samp>maxlag</samp>会返回消息,例如<samp>等待$host中:延迟$lag秒</samp>。<br />参见[[mw:Special:MyLanguage/Manual:Maxlag_parameter|Manual: Maxlag parameter]]以获取更多信息。",
        "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>就验证是否有机器人用户权限。",
@@ -52,7 +52,7 @@
        "apihelp-block-param-autoblock": "自动封禁最近使用的IP地址,以及以后他们尝试登陆使用的IP地址。",
        "apihelp-block-param-noemail": "阻止用户通过wiki发送电子邮件。(需要<code>blockemail</code>权限)。",
        "apihelp-block-param-hidename": "从封禁日志中隐藏用户名。(需要<code>hideuser</code>权限)。",
-       "apihelp-block-param-allowusertalk": "允许用户编辑自己的讨论页(取决于<var>[[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var>)。",
+       "apihelp-block-param-allowusertalk": "允许用户编辑自己的讨论页(取决于<var>[[mw:Special:MyLanguage/Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var>)。",
        "apihelp-block-param-reblock": "如果该用户已被封禁,则覆盖已有的封禁。",
        "apihelp-block-param-watchuser": "监视用户或该 IP 的用户页和讨论页。",
        "apihelp-block-param-tags": "要在封禁日志中应用到实体的更改标签。",
        "apihelp-opensearch-param-search": "搜索字符串。",
        "apihelp-opensearch-param-limit": "要返回的结果最大数。",
        "apihelp-opensearch-param-namespace": "搜索的名字空间。",
-       "apihelp-opensearch-param-suggest": "如果<var>[[mw:Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]</var>设置为false则不做任何事情。",
+       "apihelp-opensearch-param-suggest": "如果<var>[[mw:Special:MyLanguage/Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]</var>设置为false则不做任何事情。",
        "apihelp-opensearch-param-redirects": "如何处理重定向:\n;return:返回重定向本身。\n;resolve:返回目标页面。可能返回少于$1limit个结果。\n由于历史原因,$1format=json默认为\"return\",其他格式默认为\"resolve\"。",
        "apihelp-opensearch-param-format": "输出格式。",
        "apihelp-opensearch-param-warningsaserror": "如果警告通过<kbd>format=json</kbd>提升,返回一个API错误而不是忽略它们。",
        "apihelp-parse-paramvalue-prop-limitreportdata": "以结构化的方式提供限制报告。如果<var>$1disablelimitreport</var>被设定则不提供数据。",
        "apihelp-parse-paramvalue-prop-limitreporthtml": "提供限制报告的HTML版本。当<var>$1disablelimitreport</var>被设置时不会提供数据。",
        "apihelp-parse-paramvalue-prop-parsetree": "修订内容的XML解析树(需要内容模型<code>$1</code>)",
+       "apihelp-parse-paramvalue-prop-parsewarnings": "在解析内容时提供发生的警告",
        "apihelp-parse-param-pst": "在解析输入前,对输入做一次保存前变换处理。仅当使用文本时有效。",
        "apihelp-parse-param-onlypst": "在输入内容中执行预保存转换(PST),但不解析它。在PST被应用后返回相同的wiki文本。只当与<var>$1text</var>一起使用时有效。",
        "apihelp-parse-param-effectivelanglinks": "包含由扩展提供的语言链接(用于与<kbd>$1prop=langlinks</kbd>一起使用)。",
        "apihelp-query+alldeletedrevisions-param-user": "只列出此用户做出的修订。",
        "apihelp-query+alldeletedrevisions-param-excludeuser": "不要列出此用户做出的修订。",
        "apihelp-query+alldeletedrevisions-param-namespace": "只列出此名字空间的页面。",
-       "apihelp-query+alldeletedrevisions-param-miser-user-namespace": "<strong>注意:</strong>由于[[mw:Manual:$wgMiserMode|miser模式]],同时使用<var>$1user</var>和<var>$1namespace</var>将导致继续前返回少于<var>$1limit</var>个结果,在极端条件下可能不返回任何结果。",
+       "apihelp-query+alldeletedrevisions-param-miser-user-namespace": "<strong>注意:</strong>由于[[mw:Special:MyLanguage/Manual:$wgMiserMode|miser模式]],同时使用<var>$1user</var>和<var>$1namespace</var>将导致继续前返回少于<var>$1limit</var>个结果,在极端条件下可能不返回任何结果。",
        "apihelp-query+alldeletedrevisions-param-generatetitles": "当作为生成器使用时,生成标题而不是修订ID。",
        "apihelp-query+alldeletedrevisions-example-user": "列出由<kbd>Example</kbd>作出的最近50次已删除贡献。",
        "apihelp-query+alldeletedrevisions-example-ns-main": "列出前50次已删除的主名字空间修订。",
        "apihelp-query+filearchive-paramvalue-prop-archivename": "添加用于非最新版本的存档版本的文件名。",
        "apihelp-query+filearchive-example-simple": "显示已删除文件列表。",
        "apihelp-query+filerepoinfo-description": "返回有关wiki配置的图片存储库的元信息。",
-       "apihelp-query+filerepoinfo-param-prop": "要获取的存储库属性(这在一些wiki上可能有更多可用选项):\n;apiurl:链接至API的URL - 对从主机获取图片信息有用。\n;name:存储库关键词 - 用于例如<var>[[mw:Manual:$wgForeignFileRepos|$wgForeignFileRepos]]</var>,并且[[Special:ApiHelp/query+imageinfo|imageinfo]]会返回值。\n;displayname:人类可读的存储库wiki名称。\n;rooturl:图片路径的根URL。\n;local:存储库是否在本地。",
+       "apihelp-query+filerepoinfo-param-prop": "要获取的存储库属性(这在一些wiki上可能有更多可用选项):\n;apiurl:链接至API的URL - 对从主机获取图片信息有用。\n;name:存储库关键词 - 用于例如<var>[[mw:Special:MyLanguage/Manual:$wgForeignFileRepos|$wgForeignFileRepos]]</var>,并且[[Special:ApiHelp/query+imageinfo|imageinfo]]会返回值。\n;displayname:人类可读的存储库wiki名称。\n;rooturl:图片路径的根URL。\n;local:存储库是否在本地。",
        "apihelp-query+filerepoinfo-example-simple": "获得有关文件存储库的信息。",
        "apihelp-query+fileusage-description": "查找所有使用指定文件的页面。",
        "apihelp-query+fileusage-param-prop": "要获取的属性:",
        "apihelp-query+siteinfo-paramvalue-prop-rightsinfo": "当可用时返回wiki的版权(许可协议)信息。",
        "apihelp-query+siteinfo-paramvalue-prop-restrictions": "返回可用的编辑限制(保护)类型信息。",
        "apihelp-query+siteinfo-paramvalue-prop-languages": "返回MediaWiki支持的语言列表(可选择使用<var>$1inlanguagecode</var>本地化)。",
-       "apihelp-query+siteinfo-paramvalue-prop-languagevariants": "当启用了[[mw:LanguageConverter|语言转换器]],并且每个语言变体都受支持时,返回语言代码列表。",
+       "apihelp-query+siteinfo-paramvalue-prop-languagevariants": "当启用了[[mw:Special:MyLanguage/LanguageConverter|语言转换器]],并且每个语言变体都受支持时,返回语言代码列表。",
        "apihelp-query+siteinfo-paramvalue-prop-skins": "返回所有启用的皮肤列表(可选择使用<var>$1inlanguagecode</var>本地化,否则是内容语言)。",
        "apihelp-query+siteinfo-paramvalue-prop-extensiontags": "返回解析器扩展标签列表。",
        "apihelp-query+siteinfo-paramvalue-prop-functionhooks": "返回解析器函数钩列表。",
-       "apihelp-query+siteinfo-paramvalue-prop-showhooks": "返回所有订阅的钩列表(<var>[[mw:Manual:$wgHooks|$wgHooks]]</var>的内容)。",
+       "apihelp-query+siteinfo-paramvalue-prop-showhooks": "返回所有订阅的钩列表(<var>[[mw:Special:MyLanguage/Manual:$wgHooks|$wgHooks]]</var>的内容)。",
        "apihelp-query+siteinfo-paramvalue-prop-variables": "返回变量ID列表。",
        "apihelp-query+siteinfo-paramvalue-prop-protocols": "返回外部链接中允许的协议列表。",
        "apihelp-query+siteinfo-paramvalue-prop-defaultoptions": "返回用户设置的默认值。",
        "apihelp-query+usercontribs-paramvalue-prop-flags": "添加编辑标记。",
        "apihelp-query+usercontribs-paramvalue-prop-patrolled": "标记已巡查编辑。",
        "apihelp-query+usercontribs-paramvalue-prop-tags": "列举用于编辑的标签。",
-       "apihelp-query+usercontribs-param-show": "只显示符合这些标准的项目,例如只显示不是小编辑的编辑:<kbd>$2show=!minor</kbd>。\n\n如果<kbd>$2show=patrolled</kbd>或<kbd>$2show=!patrolled</kbd>被设定,早于<var>[[mw:Manual:$wgRCMaxAge|$wgRCMaxAge]]</var>($1秒)的修订不会被显示。",
+       "apihelp-query+usercontribs-param-show": "只显示符合这些标准的项目,例如只显示不是小编辑的编辑:<kbd>$2show=!minor</kbd>。\n\n如果<kbd>$2show=patrolled</kbd>或<kbd>$2show=!patrolled</kbd>被设定,早于<var>[[mw:Special:MyLanguage/Manual:$wgRCMaxAge|$wgRCMaxAge]]</var>($1秒)的修订不会被显示。",
        "apihelp-query+usercontribs-param-tag": "只列出被此标签标记的修订。",
        "apihelp-query+usercontribs-param-toponly": "只列举作为最新修订的更改。",
        "apihelp-query+usercontribs-example-user": "显示用户<kbd>Example</kbd>的贡献。",
        "apihelp-query+userinfo-paramvalue-prop-blockinfo": "如果当前用户被封禁就标记,并注明是谁封禁,以何种原因封禁的。",
        "apihelp-query+userinfo-paramvalue-prop-hasmsg": "如果当前用户有等待中的消息的话,添加标签<samp>messages</samp>。",
        "apihelp-query+userinfo-paramvalue-prop-groups": "列举当前用户隶属的所有群组。",
+       "apihelp-query+userinfo-paramvalue-prop-groupmemberships": "列举明确分配给当前用户的用户组,包括每个用户组成员的过期时间。",
        "apihelp-query+userinfo-paramvalue-prop-implicitgroups": "列举当前用户的所有自动成为成员的用户组。",
        "apihelp-query+userinfo-paramvalue-prop-rights": "列举当前用户拥有的所有权限。",
        "apihelp-query+userinfo-paramvalue-prop-changeablegroups": "列举当前用户可以添加并移除的用户组。",
        "apihelp-query+users-param-prop": "要包含的信息束:",
        "apihelp-query+users-paramvalue-prop-blockinfo": "如果用户被封禁就标记,并注明是谁封禁,以何种原因封禁的。",
        "apihelp-query+users-paramvalue-prop-groups": "列举每位用户属于的所有组。",
+       "apihelp-query+users-paramvalue-prop-groupmemberships": "列举明确分配给每位用户的用户组,包括每个用户组成员的过期时间。",
        "apihelp-query+users-paramvalue-prop-implicitgroups": "列举用户自动作为成员之一的所有组。",
        "apihelp-query+users-paramvalue-prop-rights": "列举每位用户拥有的所有权限。",
        "apihelp-query+users-paramvalue-prop-editcount": "添加用户的编辑计数。",
        "apihelp-removeauthenticationdata-description": "从当前用户移除身份验证数据。",
        "apihelp-removeauthenticationdata-example-simple": "尝试移除当前用户的<kbd>FooAuthenticationRequest</kbd>数据。",
        "apihelp-resetpassword-description": "向用户发送密码重置邮件。",
-       "apihelp-resetpassword-description-noroutes": "没有密码重置路由可用。\n\n在<var>[[mw:Manual:$wgPasswordResetRoutes|$wgPasswordResetRoutes]]</var>中启用路由以使用此模块。",
+       "apihelp-resetpassword-description-noroutes": "没有密码重置路由可用。\n\n在<var>[[mw:Special:MyLanguage/Manual:$wgPasswordResetRoutes|$wgPasswordResetRoutes]]</var>中启用路由以使用此模块。",
        "apihelp-resetpassword-param-user": "正在重置的用户。",
        "apihelp-resetpassword-param-email": "正在重置用户的电子邮件地址。",
        "apihelp-resetpassword-example-user": "向用户<kbd>Example</kbd>发送密码重置邮件。",
        "apihelp-setnotificationtimestamp-example-pagetimestamp": "设置<kbd>Main page</kbd>的通知时间戳,这样所有从2012年1月1日起的编辑都会是未复核的。",
        "apihelp-setnotificationtimestamp-example-allpages": "重置在<kbd>{{ns:user}}</kbd>名字空间中的页面的通知状态。",
        "apihelp-setpagelanguage-description": "更改页面的语言。",
-       "apihelp-setpagelanguage-description-disabled": "此wiki不允许更改页面的语言。\n\n启用<var>[[mw:Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]]</var>以使用此操作。",
+       "apihelp-setpagelanguage-description-disabled": "此wiki不允许更改页面的语言。\n\n启用<var>[[mw:Special:MyLanguage/Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]]</var>以使用此操作。",
        "apihelp-setpagelanguage-param-title": "您希望更改语言的页面标题。不能与<var>$1pageid</var>一起使用。",
        "apihelp-setpagelanguage-param-pageid": "您希望更改语言的页面ID。不能与<var>$1title</var>一起使用。",
        "apihelp-setpagelanguage-param-lang": "更改页面的目标语言的语言代码。使用<kbd>default</kbd>以重置页面为wiki的默认内容语言。",
        "apihelp-xml-param-includexmlnamespace": "如果指定,添加一个XML名字空间。",
        "apihelp-xmlfm-description": "输出数据为XML格式(HTML优质打印效果)。",
        "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-header": "这是$1格式的HTML实现。HTML对调试很有用,但不适合应用程序使用。\n\n指定<var>format</var>参数以更改输出格式。要查看$1格式的非HTML实现,设置<kbd>format=$2</kbd>。\n\n参见[[mw:Special:MyLanguage/API|完整文档]],或[[Special:ApiHelp/main|API帮助]]以获取更多信息。",
+       "api-format-prettyprint-header-only-html": "这是用来调试的HTML实现,不适合实际使用。\n\n参见[[mw:Special:MyLanguage/API|完整文档]],或[[Special:ApiHelp/main|API帮助]]以获取更多信息。",
        "api-format-prettyprint-status": "此响应将会返回HTTP状态$1 $2。",
        "api-pageset-param-titles": "要工作的标题列表。",
        "api-pageset-param-pageids": "要工作的页面ID列表。",
        "api-help-param-default-empty": "默认:<span class=\"apihelp-empty\">(空)</span>",
        "api-help-param-token": "从[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]取回的“$1”令牌",
        "api-help-param-token-webui": "出于兼容性考虑,web UI中使用的令牌也被接受。",
-       "api-help-param-disabled-in-miser-mode": "由于[[mw:Manual:$wgMiserMode|miser模式]]而禁用。",
-       "api-help-param-limited-in-miser-mode": "<strong>注意:</strong>由于[[mw:Manual:$wgMiserMode|miser模式]],使用这个可能导致继续前返回少于<var>$1limit</var>个结果;极端情况下可能不会返回任何结果。",
+       "api-help-param-disabled-in-miser-mode": "由于[[mw:Special:MyLanguage/Manual:$wgMiserMode|miser模式]]而禁用。",
+       "api-help-param-limited-in-miser-mode": "<strong>注意:</strong>由于[[mw:Special:MyLanguage/Manual:$wgMiserMode|miser模式]],使用这个可能导致继续前返回少于<var>$1limit</var>个结果;极端情况下可能不会返回任何结果。",
        "api-help-param-direction": "列举的方向:\n;newer:最早的优先。注意:$1start应早于$1end。\n;older:最新的优先(默认)。注意:$1start应晚于$1end。",
        "api-help-param-continue": "当更多结果可用时,使用这个继续。",
        "api-help-param-no-description": "<span class=\"apihelp-empty\">(没有说明)</span>",
        "apierror-stashzerolength": "文件长度为0,并且不能在暂存库中储存:$1。",
        "apierror-systemblocked": "您已被MediaWiki自动封禁。",
        "apierror-templateexpansion-notwikitext": "模板展开只支持wiki文本内容。$1使用内容模型$2。",
+       "apierror-toofewexpiries": "提供了$1个逾期{{PLURAL:$1|时间戳}},实际则需要$2个。",
        "apierror-unknownaction": "指定的操作<kbd>$1</kbd>不被承认。",
        "apierror-unknownerror-editpage": "未知的编辑页面错误:$1。",
        "apierror-unknownerror-nocode": "未知错误。",
        "apiwarn-nothumb-noimagehandler": "不能创建缩略图,因为$1没有关联的图片处理器。",
        "apiwarn-parse-nocontentmodel": "<var>title</var>或<var>contentmodel</var>未提供,假设$1。",
        "apiwarn-parse-titlewithouttext": "<var>title</var>在没有<var>text</var>的情况下被使用,并且请求了已解析页面的属性。您是想用<var>page</var>而不是<var>title</var>么?",
+       "apiwarn-redirectsandrevids": "重定向解决方案不能与<var>revids</var>参数一起使用。任何<var>revids</var>所指向的重定向都未被解决。",
        "apiwarn-tokennotallowed": "操作“$1”不允许当前用户使用。",
        "apiwarn-toomanyvalues": "参数<var>$1</var>指定了太多的值。上限为$2。",
        "apiwarn-truncatedresult": "此结果被缩短,否则其将大于$1字节的限制。",
        "apiwarn-unclearnowtimestamp": "为时间戳参数<var>$1</var>传递“$2”已被弃用。如因某些原因您需要明确指定当前时间而不计算客户端,请使用<kbd>now</kbd>。",
        "apiwarn-unrecognizedvalues": "参数<var>$1</var>有无法识别的{{PLURAL:$3|值}}:$2。",
        "apiwarn-unsupportedarray": "参数<var>$1</var>使用未受支持的PHP数组语法。",
+       "apiwarn-urlparamwidth": "为了获得衍生自<var>$1urlwidth</var>/<var>$1urlheight</var>的宽度值($3),正在忽略<var>$1urlparam</var>的宽度值集($2)。",
        "apiwarn-validationfailed-badchars": "关键词中的字符无效(只允许<code>a-z</code>、<code>A-Z</code>、<code>0-9</code>、<code>_</code>和<code>-</code>)。",
        "apiwarn-validationfailed-badpref": "不是有效的偏好。",
        "apiwarn-validationfailed-cannotset": "不能通过此模块设置。",
index 0a07a93..7215606 100644 (file)
@@ -28,6 +28,7 @@
 
 use Wikimedia\Rdbms\ResultWrapper;
 use Wikimedia\Rdbms\FakeResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * Class for fetching backlink lists, approximate backlink counts and
index 77ab2d5..57d4581 100644 (file)
@@ -23,6 +23,7 @@
 use MediaWiki\Linker\LinkTarget;
 use MediaWiki\MediaWikiServices;
 use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * Class representing a list of titles
index b720dec..57f66f1 100644 (file)
@@ -20,6 +20,7 @@
  * @file
  * @ingroup Cache
  */
+use Wikimedia\Rdbms\IDatabase;
 use MediaWiki\Linker\LinkTarget;
 use MediaWiki\MediaWikiServices;
 
index 5d48c03..14baeeb 100644 (file)
@@ -238,6 +238,7 @@ class MessageBlobStore implements LoggerAwareInterface {
                }
 
                $json = FormatJson::encode( (object)$messages );
+               // @codeCoverageIgnoreStart
                if ( $json === false ) {
                        $this->logger->warning( 'Failed to encode message blob for {module} ({lang})', [
                                'module' => $module->getName(),
@@ -245,6 +246,7 @@ class MessageBlobStore implements LoggerAwareInterface {
                        ] );
                        $json = '{}';
                }
+               // codeCoverageIgnoreEnd
                return $json;
        }
 }
index 7cd489a..8a42a9a 100644 (file)
@@ -191,11 +191,16 @@ class MessageCache {
                                // either.
                                $po = ParserOptions::newFromAnon();
                                $po->setEditSection( false );
+                               $po->setAllowUnsafeRawHtml( false );
                                return $po;
                        }
 
                        $this->mParserOptions = new ParserOptions;
                        $this->mParserOptions->setEditSection( false );
+                       // Messages may take parameters that could come
+                       // from malicious sources. As a precaution, disable
+                       // the <html> parser tag when parsing messages.
+                       $this->mParserOptions->setAllowUnsafeRawHtml( false );
                }
 
                return $this->mParserOptions;
@@ -480,7 +485,8 @@ class MessageCache {
                } else {
                        # Effectively disallows use of '/' character in NS_MEDIAWIKI for uses
                        # other than language code.
-                       $conds[] = 'page_title NOT' . $dbr->buildLike( $dbr->anyString(), '/', $dbr->anyString() );
+                       $conds[] = 'page_title NOT' .
+                               $dbr->buildLike( $dbr->anyString(), '/', $dbr->anyString() );
                }
 
                # Conditions to fetch oversized pages to ignore them
@@ -546,7 +552,7 @@ class MessageCache {
        /**
         * Updates cache as necessary when message page is changed
         *
-        * @param string $title Message cache key with initial uppercase letter.
+        * @param string $title Message cache key with initial uppercase letter
         * @param string|bool $text New contents of the page (false if deleted)
         */
        public function replace( $title, $text ) {
@@ -591,9 +597,8 @@ class MessageCache {
                                $page->loadPageData( $page::READ_LATEST );
                                $text = $this->getMessageTextFromContent( $page->getContent() );
                                // Check if an individual cache key should exist and update cache accordingly
-                               $titleKey = $this->wanCache->makeKey(
-                                       'messages-big', $this->mCache[$code]['HASH'], $title );
                                if ( is_string( $text ) && strlen( $text ) > $wgMaxMsgCacheEntrySize ) {
+                                       $titleKey = $this->bigMessageCacheKey( $this->mCache[$code]['HASH'], $title );
                                        $this->wanCache->set( $titleKey, ' ' . $text, $this->mExpiry );
                                }
                                // Mark this cache as definitely being "latest" (non-volatile) so
@@ -962,8 +967,8 @@ class MessageCache {
         * some callers require this behavior. LanguageConverter::parseCachedTable()
         * and self::get() are some examples in core.
         *
-        * @param string $title Message cache key with initial uppercase letter.
-        * @param string $code Code denoting the language to try.
+        * @param string $title Message cache key with initial uppercase letter
+        * @param string $code Code denoting the language to try
         * @return string|bool The message, or false if it does not exist or on error
         */
        public function getMsgFromNamespace( $title, $code ) {
@@ -990,8 +995,8 @@ class MessageCache {
                        return false;
                }
 
-               // Try the individual message cache
-               $titleKey = $this->wanCache->makeKey( 'messages-big', $this->mCache[$code]['HASH'], $title );
+               // Individual message cache key
+               $titleKey = $this->bigMessageCacheKey( $this->mCache[$code]['HASH'], $title );
 
                if ( $this->mCacheVolatile[$code] ) {
                        $entry = false;
@@ -1000,6 +1005,7 @@ class MessageCache {
                                __METHOD__ . ': loading volatile key \'{titleKey}\'',
                                [ 'titleKey' => $titleKey, 'code' => $code ] );
                } else {
+                       // Try the individual message cache
                        $entry = $this->wanCache->get( $titleKey );
                }
 
@@ -1052,7 +1058,8 @@ class MessageCache {
                        $message = false; // negative caching
                }
 
-               if ( $message === false ) { // negative caching
+               if ( $message === false ) {
+                       // Negative caching in case a "too big" message is no longer available (deleted)
                        $this->mCache[$code][$title] = '!NONEXISTENT';
                        $this->wanCache->set( $titleKey, '!NONEXISTENT', $this->mExpiry, $cacheOpts );
                }
@@ -1296,4 +1303,13 @@ class MessageCache {
 
                return $msgText;
        }
+
+       /**
+        * @param string $hash Hash for this version of the entire key/value overrides map
+        * @param string $title Message cache key with initial uppercase letter
+        * @return string
+        */
+       private function bigMessageCacheKey( $hash, $title ) {
+               return $this->wanCache->makeKey( 'messages-big', $hash, $title );
+       }
 }
index e7e2d10..52611ec 100644 (file)
@@ -18,6 +18,8 @@
  * @file
  */
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * LCStore implementation which uses the standard DB functions to store data.
  * This will work on any MediaWiki installation.
index cbff113..d499340 100644 (file)
@@ -212,19 +212,17 @@ class LocalisationCache {
                                case 'detect':
                                        if ( !empty( $conf['storeDirectory'] ) ) {
                                                $storeClass = 'LCStoreCDB';
+                                       } elseif ( $wgCacheDirectory ) {
+                                               $storeConf['directory'] = $wgCacheDirectory;
+                                               $storeClass = 'LCStoreCDB';
                                        } else {
-                                               $cacheDir = $wgCacheDirectory ?: wfTempDir();
-                                               if ( $cacheDir ) {
-                                                       $storeConf['directory'] = $cacheDir;
-                                                       $storeClass = 'LCStoreCDB';
-                                               } else {
-                                                       $storeClass = 'LCStoreDB';
-                                               }
+                                               $storeClass = 'LCStoreDB';
                                        }
                                        break;
                                default:
                                        throw new MWException(
-                                               'Please set $wgLocalisationCacheConf[\'store\'] to something sensible.' );
+                                               'Please set $wgLocalisationCacheConf[\'store\'] to something sensible.'
+                                       );
                        }
                }
 
index b6be1f9..4117a11 100644 (file)
@@ -22,6 +22,8 @@
  * @author Matthew Flaschen
  */
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * An individual filter in a boolean group
  *
@@ -95,11 +97,6 @@ class ChangesListBooleanFilter extends ChangesListFilter {
         *  to true.  It does not need to be set if the exact same filter is simply visible
         *  on both.
         * $filterDefinition['default'] bool Default
-        * $filterDefinition['isAllowedCallable'] callable Callable taking two parameters,
-        *  the class name of the special page and an IContextSource, and returning true
-        *  if and only if the current user is permitted to use this filter on the current
-        *  wiki.  If it returns false, it will both hide the UI (in all UIs) and prevent
-        *  the DB query modification from taking effect. (optional, defaults to allowed)
         * $filterDefinition['priority'] int Priority integer.  Higher value means higher
         *  up in the group's filter list.
         * $filterDefinition['queryCallable'] callable Callable accepting parameters, used
@@ -164,17 +161,16 @@ class ChangesListBooleanFilter extends ChangesListFilter {
        /**
         * @inheritdoc
         */
-       public function displaysOnUnstructuredUi( ChangesListSpecialPage $specialPage ) {
-               return $this->showHide &&
-                       $this->isAllowed( $specialPage );
+       public function displaysOnUnstructuredUi() {
+               return !!$this->showHide;
        }
 
        /**
         * @inheritdoc
         */
-       public function isFeatureAvailableOnStructuredUi( ChangesListSpecialPage $specialPage ) {
+       public function isFeatureAvailableOnStructuredUi() {
                return $this->isReplacedInStructuredUi ||
-                       parent::isFeatureAvailableOnStructuredUi( $specialPage );
+                       parent::isFeatureAvailableOnStructuredUi();
        }
 
        /**
index 22e797d..b3a16a8 100644 (file)
@@ -73,13 +73,6 @@ abstract class ChangesListFilter {
         */
        protected $description;
 
-       /**
-        * Callable used to check whether this filter is allowed to take effect
-        *
-        * @var callable $isAllowedCallable
-        */
-       protected $isAllowedCallable;
-
        /**
         * List of conflicting groups
         *
@@ -139,11 +132,6 @@ abstract class ChangesListFilter {
         * $filterDefinition['label'] string i18n key of label for structured UI.
         * $filterDefinition['description'] string i18n key of description for structured
         *  UI.
-        * $filterDefinition['isAllowedCallable'] callable Callable taking two parameters,
-        *  the class name of the special page and an IContextSource, and returning true
-        *  if and only if the current user is permitted to use this filter on the current
-        *  wiki.  If it returns false, it will both hide the UI (in all UIs) and prevent
-        *  the DB query modification from taking effect. (optional, defaults to allowed)
         * $filterDefinition['priority'] int Priority integer.  Higher value means higher
         *  up in the group's filter list.
         */
@@ -179,10 +167,6 @@ abstract class ChangesListFilter {
                        $this->description = $filterDefinition['description'];
                }
 
-               if ( isset( $filterDefinition['isAllowedCallable'] ) ) {
-                       $this->isAllowedCallable = $filterDefinition['isAllowedCallable'];
-               }
-
                $this->priority = $filterDefinition['priority'];
 
                $this->group->registerFilter( $this );
@@ -311,20 +295,18 @@ abstract class ChangesListFilter {
        /**
         * Checks whether the filter should display on the unstructured UI
         *
-        * @param ChangesListSpecialPage $specialPage Current special page
         * @return bool Whether to display
         */
-       abstract public function displaysOnUnstructuredUi( ChangesListSpecialPage $specialPage );
+       abstract public function displaysOnUnstructuredUi();
 
        /**
         * Checks whether the filter should display on the structured UI
         * This refers to the exact filter.  See also isFeatureAvailableOnStructuredUi.
         *
-        * @param ChangesListSpecialPage $specialPage Current special page
         * @return bool Whether to display
         */
-       public function displaysOnStructuredUi( ChangesListSpecialPage $specialPage ) {
-               return $this->label !== null && $this->isAllowed( $specialPage );
+       public function displaysOnStructuredUi() {
+               return $this->label !== null;
        }
 
        /**
@@ -333,8 +315,8 @@ abstract class ChangesListFilter {
         *
         * This can either be the exact filter, or a new filter that replaces it.
         */
-       public function isFeatureAvailableOnStructuredUi( ChangesListSpecialPage $specialPage ) {
-               return $this->displaysOnStructuredUi( $specialPage );
+       public function isFeatureAvailableOnStructuredUi() {
+               return $this->displaysOnStructuredUi();
        }
 
        /**
@@ -344,24 +326,6 @@ abstract class ChangesListFilter {
                return $this->priority;
        }
 
-       /**
-        * Checks whether the filter is allowed for the current context
-        *
-        * @param ChangesListSpecialPage $specialPage Current special page
-        * @return bool Whether it is allowed
-        */
-       public function isAllowed( ChangesListSpecialPage $specialPage ) {
-               if ( $this->isAllowedCallable === null ) {
-                       return true;
-               } else {
-                       return call_user_func(
-                               $this->isAllowedCallable,
-                               get_class( $specialPage ),
-                               $specialPage->getContext()
-                       );
-               }
-       }
-
        /**
         * Gets the CSS class
         *
index d2ad204..4ff5520 100644 (file)
@@ -332,12 +332,11 @@ abstract class ChangesListFilterGroup {
        /**
         * Gets the JS data in the format required by the front-end of the structured UI
         *
-        * @param ChangesListSpecialPage $specialPage
         * @return array|null Associative array, or null if there are no filters that
         *  display in the structured UI.  messageKeys is a special top-level value, with
         *  the value being an array of the message keys to send to the client.
         */
-       public function getJsData( ChangesListSpecialPage $specialPage ) {
+       public function getJsData() {
                $output = [
                        'name' => $this->name,
                        'type' => $this->type,
@@ -367,7 +366,7 @@ abstract class ChangesListFilterGroup {
                } );
 
                foreach ( $this->filters as $filterName => $filter ) {
-                       if ( $filter->displaysOnStructuredUi( $specialPage ) ) {
+                       if ( $filter->displaysOnStructuredUi() ) {
                                $filterData = $filter->getJsData();
                                $output['messageKeys'] = array_merge(
                                        $output['messageKeys'],
index b6a8774..1c977b9 100644 (file)
@@ -11,7 +11,7 @@ class ChangesListStringOptionsFilter extends ChangesListFilter {
        /**
         * @inheritdoc
         */
-       public function displaysOnUnstructuredUi( ChangesListSpecialPage $specialPage ) {
+       public function displaysOnUnstructuredUi() {
                return false;
        }
 }
index befc213..723ef39 100644 (file)
@@ -22,6 +22,8 @@
  * @author Matthew Flaschen
  */
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * Represents a filter group with multiple string options. They are passed to the server as
  * a single form parameter separated by a delimiter.  The parameter name is the
@@ -185,9 +187,7 @@ class ChangesListStringOptionsFilterGroup extends ChangesListFilterGroup {
 
                $allowedFilterNames = [];
                foreach ( $this->filters as $filter ) {
-                       if ( $filter->isAllowed( $specialPage ) ) {
-                               $allowedFilterNames[] = $filter->getName();
-                       }
+                       $allowedFilterNames[] = $filter->getName();
                }
 
                if ( $value === self::ALL ) {
@@ -232,8 +232,8 @@ class ChangesListStringOptionsFilterGroup extends ChangesListFilterGroup {
        /**
         * @inheritdoc
         */
-       public function getJsData( ChangesListSpecialPage $specialPage ) {
-               $output = parent::getJsData( $specialPage );
+       public function getJsData() {
+               $output = parent::getJsData();
 
                $output['separator'] = self::SEPARATOR;
                $output['default'] = $this->getDefault();
index dd8bab9..a37f5f2 100644 (file)
@@ -49,8 +49,9 @@ abstract class ChangeTagsList extends RevisionListBase {
                                $className = 'ChangeTagsLogList';
                                break;
                        default:
-                               throw new Exception( "Class $className requested, but does not exist" );
+                               throw new Exception( "Class $typeName requested, but does not exist" );
                }
+
                return new $className( $context, $title, $ids );
        }
 
index 480aace..271005f 100644 (file)
@@ -19,6 +19,8 @@
  * @ingroup Change tagging
  */
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * Stores a list of taggable log entries.
  * @since 1.25
index 8eae238..a0248c6 100644 (file)
@@ -19,6 +19,8 @@
  * @ingroup Change tagging
  */
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * Stores a list of taggable revisions.
  * @since 1.25
diff --git a/includes/config/EtcdConfig.php b/includes/config/EtcdConfig.php
new file mode 100644 (file)
index 0000000..0f2f641
--- /dev/null
@@ -0,0 +1,275 @@
+<?php
+/**
+ * Copyright 2017
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @author Aaron Schulz
+ */
+
+use Psr\Log\LoggerAwareInterface;
+use Psr\Log\LoggerInterface;
+use Wikimedia\WaitConditionLoop;
+
+/**
+ * Interface for configuration instances
+ *
+ * @since 1.29
+ */
+class EtcdConfig implements Config, LoggerAwareInterface {
+       /** @var MultiHttpClient */
+       private $http;
+       /** @var BagOStuff */
+       private $srvCache;
+       /** @var array */
+       private $procCache;
+       /** @var LoggerInterface */
+       private $logger;
+
+       /** @var string */
+       private $host;
+       /** @var string */
+       private $protocol;
+       /** @var string */
+       private $directory;
+       /** @var string */
+       private $encoding;
+       /** @var integer */
+       private $baseCacheTTL;
+       /** @var integer */
+       private $skewCacheTTL;
+       /** @var integer */
+       private $timeout;
+       /** @var string */
+       private $directoryHash;
+
+       /**
+        * @param array $params Parameter map:
+        *   - host: the host address and port
+        *   - protocol: either http or https
+        *   - directory: the etc "directory" were MediaWiki specific variables are located
+        *   - encoding: one of ("JSON", "YAML")
+        *   - cache: BagOStuff instance or ObjectFactory spec thereof for a server cache.
+        *            The cache will also be used as a fallback if etcd is down.
+        *   - cacheTTL: logical cache TTL in seconds
+        *   - skewTTL: maximum seconds to randomly lower the assigned TTL on cache save
+        *   - timeout: seconds to wait for etcd before throwing an error
+        */
+       public function __construct( array $params ) {
+               $params += [
+                       'protocol' => 'http',
+                       'encoding' => 'JSON',
+                       'cacheTTL' => 10,
+                       'skewTTL' => 1,
+                       'timeout' => 10
+               ];
+
+               $this->host = $params['host'];
+               $this->protocol = $params['protocol'];
+               $this->directory = trim( $params['directory'], '/' );
+               $this->directoryHash = sha1( $this->directory );
+               $this->encoding = $params['encoding'];
+               $this->skewCacheTTL = $params['skewTTL'];
+               $this->baseCacheTTL = max( $params['cacheTTL'] - $this->skewCacheTTL, 0 );
+               $this->timeout = $params['timeout'];
+
+               if ( !isset( $params['cache'] ) ) {
+                       $this->srvCache = new HashBagOStuff( [] );
+               } elseif ( $params['cache'] instanceof BagOStuff ) {
+                       $this->srvCache = $params['cache'];
+               } else {
+                       $this->srvCache = ObjectFactory::getObjectFromSpec( $params['cache'] );
+               }
+
+               $this->logger = new Psr\Log\NullLogger();
+               $this->http = new MultiHttpClient( [
+                       'connTimeout' => $this->timeout,
+                       'reqTimeout' => $this->timeout
+               ] );
+       }
+
+       public function setLogger( LoggerInterface $logger ) {
+               $this->logger = $logger;
+       }
+
+       public function has( $name ) {
+               $this->load();
+
+               return array_key_exists( $name, $this->procCache['config'] );
+       }
+
+       public function get( $name ) {
+               $this->load();
+
+               if ( !array_key_exists( $name, $this->procCache['config'] ) ) {
+                       throw new ConfigException( "No entry found for '$name'." );
+               }
+
+               return $this->procCache['config'][$name];
+       }
+
+       private function load() {
+               if ( $this->procCache !== null ) {
+                       return; // already loaded
+               }
+
+               $now = microtime( true );
+               $key = $this->srvCache->makeKey( 'variable', $this->directoryHash );
+
+               // Get the cached value or block until it is regenerated (by this or another thread)...
+               $data = null; // latest config info
+               $error = null; // last error message
+               $loop = new WaitConditionLoop(
+                       function () use ( $key, $now, &$data, &$error ) {
+                               // Check if the values are in cache yet...
+                               $data = $this->srvCache->get( $key );
+                               if ( is_array( $data ) && $data['expires'] > $now ) {
+                                       $this->logger->debug( "Found up-to-date etcd configuration cache." );
+
+                                       return WaitConditionLoop::CONDITION_REACHED;
+                               }
+
+                               // Cache is either empty or stale;
+                               // refresh the cache from etcd, using a mutex to reduce stampedes...
+                               if ( $this->srvCache->lock( $key, 0, $this->baseCacheTTL ) ) {
+                                       try {
+                                               list( $config, $error, $retry ) = $this->fetchAllFromEtcd();
+                                               if ( $config === null ) {
+                                                       $this->logger->error( "Failed to fetch configuration: $error" );
+                                                       // Fail fast if the error is likely to just keep happening
+                                                       return $retry
+                                                               ? WaitConditionLoop::CONDITION_CONTINUE
+                                                               : WaitConditionLoop::CONDITION_FAILED;
+                                               }
+
+                                               // Avoid having all servers expire cache keys at the same time
+                                               $expiry = microtime( true ) + $this->baseCacheTTL;
+                                               $expiry += mt_rand( 0, 1e6 ) / 1e6 * $this->skewCacheTTL;
+
+                                               $data = [ 'config' => $config, 'expires' => $expiry ];
+                                               $this->srvCache->set( $key, $data, BagOStuff::TTL_INDEFINITE );
+
+                                               $this->logger->info( "Refreshed stale etcd configuration cache." );
+
+                                               return WaitConditionLoop::CONDITION_REACHED;
+                                       } finally {
+                                               $this->srvCache->unlock( $key ); // release mutex
+                                       }
+                               }
+
+                               if ( is_array( $data ) ) {
+                                       $this->logger->info( "Using stale etcd configuration cache." );
+
+                                       return WaitConditionLoop::CONDITION_REACHED;
+                               }
+
+                               return WaitConditionLoop::CONDITION_CONTINUE;
+                       },
+                       $this->timeout
+               );
+
+               if ( $loop->invoke() !== WaitConditionLoop::CONDITION_REACHED ) {
+                       // No cached value exists and etcd query failed; throw an error
+                       throw new ConfigException( "Failed to load configuration from etcd: $error" );
+               }
+
+               $this->procCache = $data;
+       }
+
+       /**
+        * @return array (config array or null, error string, allow retries)
+        */
+       public function fetchAllFromEtcd() {
+               $dsd = new DnsSrvDiscoverer( $this->host );
+               $servers = $dsd->getServers();
+               if ( !$servers ) {
+                       return $this->fetchAllFromEtcdServer( $this->host );
+               }
+
+               do {
+                       // Pick a random etcd server from dns
+                       $server = $dsd->pickServer( $servers );
+                       $host = IP::combineHostAndPort( $server['target'], $server['port'] );
+                       // Try to load the config from this particular server
+                       list( $config, $error, $retry ) = $this->fetchAllFromEtcdServer( $host );
+                       if ( is_array( $config ) || !$retry ) {
+                               break;
+                       }
+
+                       // Avoid the server next time if that failed
+                       $dsd->removeServer( $server, $servers );
+               } while ( $servers );
+
+               return [ $config, $error, $retry ];
+       }
+
+       /**
+        * @param string $address Host and port
+        * @return array (config array or null, error string, whether to allow retries)
+        */
+       protected function fetchAllFromEtcdServer( $address ) {
+               // Retrieve all the values under the MediaWiki config directory
+               list( $rcode, $rdesc, /* $rhdrs */, $rbody, $rerr ) = $this->http->run( [
+                       'method' => 'GET',
+                       'url' => "{$this->protocol}://{$address}/v2/keys/{$this->directory}/",
+                       'headers' => [ 'content-type' => 'application/json' ]
+               ] );
+
+               static $terminalCodes = [ 404 => true ];
+               if ( $rcode < 200 || $rcode > 399 ) {
+                       return [
+                               null,
+                               strlen( $rerr ) ? $rerr : "HTTP $rcode ($rdesc)",
+                               empty( $terminalCodes[$rcode] )
+                       ];
+               }
+
+               $info = json_decode( $rbody, true );
+               if ( $info === null || !isset( $info['node']['nodes'] ) ) {
+                       return [ null, $rcode, "Unexpected JSON response; missing 'nodes' list.", false ];
+               }
+
+               $config = [];
+               foreach ( $info['node']['nodes'] as $node ) {
+                       if ( !empty( $node['dir'] ) ) {
+                               continue; // skip directories
+                       }
+
+                       $name = basename( $node['key'] );
+                       $value = $this->unserialize( $node['value'] );
+                       if ( !is_array( $value ) || !isset( $value['val'] ) ) {
+                               return [ null, "Failed to parse value for '$name'.", false ];
+                       }
+
+                       $config[$name] = $value['val'];
+               }
+
+               return [ $config, null, false ];
+       }
+
+       /**
+        * @param string $string
+        * @return mixed
+        */
+       private function unserialize( $string ) {
+               if ( $this->encoding === 'YAML' ) {
+                       return yaml_parse( $string );
+               } else { // JSON
+                       return json_decode( $string, true );
+               }
+       }
+}
index ea5278f..135c9b2 100644 (file)
@@ -19,6 +19,7 @@
  * @file
  */
 use Liuggio\StatsdClient\Factory\StatsdDataFactory;
+use MediaWiki\MediaWikiServices;
 
 /**
  * The simplest way of implementing IContextSource is to hold a RequestContext as a
@@ -172,7 +173,7 @@ abstract class ContextSource implements IContextSource {
         * @return StatsdDataFactory
         */
        public function getStats() {
-               return $this->getContext()->getStats();
+               return MediaWikiServices::getInstance()->getStatsdDataFactory();
        }
 
        /**
index c4921e2..809b660 100644 (file)
@@ -24,6 +24,7 @@
  * @ingroup Database
  */
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\IMaintainableDatabase;
 
 class CloneDatabase {
        /** @var string Table prefix for cloning */
index 07c6fc7..fbbc962 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * The oci8 extension is fairly weak and doesn't support oci_num_rows, among
  * other things. We use a wrapper class to handle that and other
index 6585575..8b62989 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * Deferrable Update for closure/callback updates via IDatabase::doAtomicSection()
  * @since 1.27
index d61dec2..f9297af 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * Deferrable Update for closure/callback updates that should use auto-commit mode
  * @since 1.28
index 0a9755d..bbe8687 100644 (file)
@@ -19,6 +19,7 @@
  *
  * @file
  */
+use Wikimedia\Rdbms\IDatabase;
 use MediaWiki\MediaWikiServices;
 use Wikimedia\Rdbms\LBFactory;
 use Wikimedia\Rdbms\LoadBalancer;
index 7215696..ca29078 100644 (file)
@@ -21,6 +21,7 @@
  */
 use MediaWiki\MediaWikiServices;
 use Wikimedia\ScopedCallback;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * Update object handling the cleanup of links tables after a page was deleted.
index 0133f19..5697960 100644 (file)
@@ -20,6 +20,7 @@
  * @file
  */
 
+use Wikimedia\Rdbms\IDatabase;
 use MediaWiki\MediaWikiServices;
 use Wikimedia\ScopedCallback;
 
index 5247e97..5b822af 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * Deferrable Update for closure/callback
  */
index ab4a609..aefa7f5 100644 (file)
@@ -17,7 +17,9 @@
  *
  * @file
  */
+use MediaWiki\MediaWikiServices;
 use Wikimedia\Assert\Assert;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * Class for handling updates to the site_stats table
@@ -169,7 +171,7 @@ class SiteStatsUpdate implements DeferrableUpdate, MergeableUpdate {
        }
 
        protected function doUpdateContextStats() {
-               $stats = RequestContext::getMain()->getStats();
+               $stats = MediaWikiServices::getInstance()->getStatsdDataFactory();
                foreach ( [ 'edits', 'articles', 'pages', 'users', 'images' ] as $type ) {
                        $delta = $this->$type;
                        if ( $delta !== 0 ) {
index 25e8841..2411bef 100644 (file)
@@ -21,6 +21,8 @@
  * @file
  */
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * @deprecated Since 1.28 Use DataUpdate directly, injecting the database
  */
index 33ddc59..b12af19 100644 (file)
@@ -1,6 +1,7 @@
 <?php
 
 use Psr\Log\LoggerInterface;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * Class for fixing stale WANObjectCache keys using a purge event source
index 148e50c..b0ab244 100644 (file)
@@ -20,6 +20,7 @@
  * @file
  * @ingroup DifferenceEngine
  */
+use MediaWiki\MediaWikiServices;
 
 /** @deprecated use class constant instead */
 define( 'MW_DIFF_VERSION', '1.11a' );
@@ -852,7 +853,7 @@ class DifferenceEngine extends ContextSource {
                        $result = $this->textDiff( $otext, $ntext );
 
                        $time = intval( ( microtime( true ) - $time ) * 1000 );
-                       $this->getStats()->timing( 'diff_time', $time );
+                       MediaWikiServices::getInstance()->getStatsdDataFactory()->timing( 'diff_time', $time );
                        // Log requests slower than 99th percentile
                        if ( $time > 100 && $this->mOldPage && $this->mNewPage ) {
                                wfDebugLog( 'diff',
index e41ab54..a307468 100644 (file)
@@ -28,6 +28,7 @@
  */
 
 use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * @ingroup SpecialPage Dump
index d907c30..6bb1618 100644 (file)
@@ -21,6 +21,9 @@
  */
 
 use Wikimedia\Rdbms\LoadBalancer;
+use Wikimedia\Rdbms\IDatabase;
+use Wikimedia\Rdbms\DBConnRef;
+use Wikimedia\Rdbms\MaintainableDBConnRef;
 
 /**
  * DB accessable external objects.
index 62e635d..d09c245 100644 (file)
@@ -23,6 +23,7 @@
  */
 
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * Version of FileJournal that logs to a DB table
index 5936e7d..8510d0c 100644 (file)
@@ -1,4 +1,7 @@
 <?php
+
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * MySQL version of DBLockManager that supports shared locks.
  *
index 5bc60a0..856dc36 100644 (file)
@@ -23,6 +23,9 @@
  * @author Aaron Schulz
  */
 
+use Wikimedia\Rdbms\DBConnRef;
+use Wikimedia\Rdbms\MaintainableDBConnRef;
+
 /**
  * @brief Proxy backend that manages file layout rewriting for FileRepo.
  *
index 3e88508..29c017c 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup FileRepo
  */
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * A foreign repository with an accessible MediaWiki database
  *
index d5e29ab..9c92bc0 100644 (file)
@@ -23,6 +23,7 @@
  */
 
 use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * A repository that stores files in the local filesystem and registers them
index f7e85a8..e367812 100644 (file)
@@ -5,6 +5,7 @@
  *
  * Represents files in a repository.
  */
+use MediaWiki\MediaWikiServices;
 
 /**
  * Base code for files.
@@ -436,7 +437,7 @@ abstract class File implements IDBAccessObject {
                        $this->fsFile = $this->repo->getLocalReference( $this->getPath() );
 
                        $statTiming = microtime( true ) - $starttime;
-                       RequestContext::getMain()->getStats()->timing(
+                       MediaWikiServices::getInstance()->getStatsdDataFactory()->timing(
                                'media.thumbnail.generate.fetchoriginal', 1000 * $statTiming );
 
                        if ( !$this->fsFile ) {
@@ -1117,7 +1118,7 @@ abstract class File implements IDBAccessObject {
        public function generateAndSaveThumb( $tmpFile, $transformParams, $flags ) {
                global $wgIgnoreImageErrors;
 
-               $stats = RequestContext::getMain()->getStats();
+               $stats = MediaWikiServices::getInstance()->getStatsdDataFactory();
 
                $handler = $this->getHandler();
 
@@ -1227,7 +1228,7 @@ abstract class File implements IDBAccessObject {
                // this object exists
                $tmpFile->bind( $this );
 
-               RequestContext::getMain()->getStats()->timing(
+               MediaWikiServices::getInstance()->getStatsdDataFactory()->timing(
                        'media.thumbnail.generate.bucket', 1000 * $buckettime );
 
                return true;
index a633fd2..c109fba 100644 (file)
@@ -22,6 +22,7 @@
  */
 
 use \MediaWiki\Logger\LoggerFactory;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * Class to represent a local file in the wiki's own database
index 3a3146b..83a8023 100644 (file)
@@ -1145,6 +1145,9 @@ abstract class HTMLFormField {
         * @since 1.18
         */
        protected static function formatErrors( $errors ) {
+               // Note: If you change the logic in this method, change
+               // htmlform.Checker.js to match.
+
                if ( is_array( $errors ) && count( $errors ) === 1 ) {
                        $errors = array_shift( $errors );
                }
index fa2d5a3..889cb60 100644 (file)
@@ -53,6 +53,8 @@ class Http {
         *    - logger              A \Psr\Logger\LoggerInterface instance for debug logging
         *    - username            Username for HTTP Basic Authentication
         *    - password            Password for HTTP Basic Authentication
+        *    - originalRequest     Information about the original request (as a WebRequest object or
+        *                          an associative array with 'ip' and 'userAgent').
         * @param string $caller The method making this request, for profiling
         * @return string|bool (bool)false on failure or a string on success
         */
index e04402f..88cc510 100644 (file)
@@ -125,6 +125,9 @@ class MWHttpRequest implements LoggerAwareInterface {
                                'Basic ' . base64_encode( $options['username'] . ':' . $options['password'] )
                        );
                }
+               if ( isset( $options['originalRequest'] ) ) {
+                       $this->setOriginalRequest( $options['originalRequest'] );
+               }
 
                $members = [ "postData", "proxy", "noProxy", "sslVerifyHost", "caInfo",
                                "method", "followRedirects", "maxRedirects", "sslVerifyCert", "callback" ];
@@ -606,19 +609,17 @@ class MWHttpRequest implements LoggerAwareInterface {
                                }
                        }
 
-                       if ( $foundRelativeURI ) {
-                               if ( $domain ) {
-                                       return $domain . $locations[$countLocations - 1];
-                               } else {
-                                       $url = parse_url( $this->url );
-                                       if ( isset( $url['host'] ) ) {
-                                               return $url['scheme'] . '://' . $url['host'] .
-                                                       $locations[$countLocations - 1];
-                                       }
-                               }
-                       } else {
+                       if ( !$foundRelativeURI ) {
                                return $locations[$countLocations - 1];
                        }
+                       if ( $domain ) {
+                               return $domain . $locations[$countLocations - 1];
+                       }
+                       $url = parse_url( $this->url );
+                       if ( isset( $url['host'] ) ) {
+                               return $url['scheme'] . '://' . $url['host'] .
+                                       $locations[$countLocations - 1];
+                       }
                }
 
                return $this->url;
@@ -632,4 +633,34 @@ class MWHttpRequest implements LoggerAwareInterface {
        public function canFollowRedirects() {
                return true;
        }
+
+       /**
+        * Set information about the original request. This can be useful for
+        * endpoints/API modules which act as a proxy for some service, and
+        * throttling etc. needs to happen in that service.
+        * Calling this will result in the X-Forwarded-For and X-Original-User-Agent
+        * headers being set.
+        * @param WebRequest|array $originalRequest When in array form, it's
+        *   expected to have the keys 'ip' and 'userAgent'.
+        * @note IP/user agent is personally identifiable information, and should
+        *   only be set when the privacy policy of the request target is
+        *   compatible with that of the MediaWiki installation.
+        */
+       public function setOriginalRequest( $originalRequest ) {
+               if ( $originalRequest instanceof WebRequest ) {
+                       $originalRequest = [
+                               'ip' => $originalRequest->getIP(),
+                               'userAgent' => $originalRequest->getHeader( 'User-Agent' ),
+                       ];
+               } elseif (
+                       !is_array( $originalRequest )
+                       || array_diff( [ 'ip', 'userAgent' ], array_keys( $originalRequest ) )
+               ) {
+                       throw new InvalidArgumentException( __METHOD__ . ': $originalRequest must be a '
+                               . "WebRequest or an array with 'ip' and 'userAgent' keys" );
+               }
+
+               $this->reqHeaders['X-Forwarded-For'] = $originalRequest['ip'];
+               $this->reqHeaders['X-Original-User-Agent'] = $originalRequest['userAgent'];
+       }
 }
index edc3548..f6becb9 100644 (file)
  * Represents a revision, log entry or upload during the import process.
  * This class sticks closely to the structure of the XML dump.
  *
+ * @since 1.2
+ *
  * @ingroup SpecialPage
  */
 class WikiRevision {
-       /** @todo Unused? */
+
+       /**
+        * @since 1.17
+        * @deprecated in 1.29. Unused.
+        * @note Introduced in 9b3128eb2b654761f21fd4ca1d5a1a4b796dc912, unused there, unused now.
+        */
        public $importer = null;
 
-       /** @var Title */
+       /**
+        * @since 1.2
+        * @var Title
+        */
        public $title = null;
 
-       /** @var int */
+       /**
+        * @since 1.6.4
+        * @var int
+        */
        public $id = 0;
 
-       /** @var string */
+       /**
+        * @since 1.2
+        * @var string
+        */
        public $timestamp = "20010115000000";
 
        /**
+        * @since 1.2
         * @var int
-        * @todo Can't find any uses. Public, because that's suspicious. Get clarity. */
+        * @deprecated in 1.29. Unused.
+        * @note Introduced in 436a028086fb3f01c4605c5ad2964d56f9306aca, unused there, unused now.
+        */
        public $user = 0;
 
-       /** @var string */
+       /**
+        * @since 1.2
+        * @var string
+        */
        public $user_text = "";
 
-       /** @var User */
+       /**
+        * @since 1.27
+        * @var User
+        */
        public $userObj = null;
 
-       /** @var string */
+       /**
+        * @since 1.21
+        * @var string
+        */
        public $model = null;
 
-       /** @var string */
+       /**
+        * @since 1.21
+        * @var string
+        */
        public $format = null;
 
-       /** @var string */
+       /**
+        * @since 1.2
+        * @var string
+        */
        public $text = "";
 
-       /** @var int */
+       /**
+        * @since 1.12.2
+        * @var int
+        */
        protected $size;
 
-       /** @var Content */
+       /**
+        * @since 1.21
+        * @var Content
+        */
        public $content = null;
 
-       /** @var ContentHandler */
+       /**
+        * @since 1.24
+        * @var ContentHandler
+        */
        protected $contentHandler = null;
 
-       /** @var string */
+       /**
+        * @since 1.2.6
+        * @var string
+        */
        public $comment = "";
 
-       /** @var bool */
+       /**
+        * @since 1.5.7
+        * @var bool
+        */
        public $minor = false;
 
-       /** @var string */
+       /**
+        * @since 1.12.2
+        * @var string
+        */
        public $type = "";
 
-       /** @var string */
+       /**
+        * @since 1.12.2
+        * @var string
+        */
        public $action = "";
 
-       /** @var string */
+       /**
+        * @since 1.12.2
+        * @var string
+        */
        public $params = "";
 
-       /** @var string */
+       /**
+        * @since 1.17
+        * @var string
+        */
        public $fileSrc = '';
 
-       /** @var bool|string */
+       /**
+        * @since 1.17
+        * @var bool|string
+        */
        public $sha1base36 = false;
 
        /**
-        * @var bool
-        * @todo Unused?
+        * @since 1.17
+        * @var string
         */
-       public $isTemp = false;
-
-       /** @var string */
        public $archiveName = '';
 
+       /**
+        * @since 1.12.2
+        */
        protected $filename;
 
-       /** @var mixed */
+       /**
+        * @since 1.12.2
+        * @var mixed
+        */
        protected $src;
 
-       /** @todo Unused? */
+       /**
+        * @since 1.18
+        * @var bool
+        * @todo Unused?
+        */
+       public $isTemp = false;
+
+       /**
+        * @since 1.18
+        * @deprecated 1.29 use Wikirevision::isTempSrc()
+        * First written to in 43d5d3b682cc1733ad01a837d11af4a402d57e6a
+        * Actually introduced in 52cd34acf590e5be946b7885ffdc13a157c1c6cf
+        */
        public $fileIsTemp;
 
        /** @var bool */
@@ -121,6 +200,7 @@ class WikiRevision {
        }
 
        /**
+        * @since 1.7 taking a Title object (string before)
         * @param Title $title
         * @throws MWException
         */
@@ -136,6 +216,7 @@ class WikiRevision {
        }
 
        /**
+        * @since 1.6.4
         * @param int $id
         */
        public function setID( $id ) {
@@ -143,6 +224,7 @@ class WikiRevision {
        }
 
        /**
+        * @since 1.2
         * @param string $ts
         */
        public function setTimestamp( $ts ) {
@@ -151,6 +233,7 @@ class WikiRevision {
        }
 
        /**
+        * @since 1.2
         * @param string $user
         */
        public function setUsername( $user ) {
@@ -158,6 +241,7 @@ class WikiRevision {
        }
 
        /**
+        * @since 1.27
         * @param User $user
         */
        public function setUserObj( $user ) {
@@ -165,6 +249,7 @@ class WikiRevision {
        }
 
        /**
+        * @since 1.2
         * @param string $ip
         */
        public function setUserIP( $ip ) {
@@ -172,6 +257,7 @@ class WikiRevision {
        }
 
        /**
+        * @since 1.21
         * @param string $model
         */
        public function setModel( $model ) {
@@ -179,6 +265,7 @@ class WikiRevision {
        }
 
        /**
+        * @since 1.21
         * @param string $format
         */
        public function setFormat( $format ) {
@@ -186,6 +273,7 @@ class WikiRevision {
        }
 
        /**
+        * @since 1.2
         * @param string $text
         */
        public function setText( $text ) {
@@ -193,6 +281,7 @@ class WikiRevision {
        }
 
        /**
+        * @since 1.2.6
         * @param string $text
         */
        public function setComment( $text ) {
@@ -200,6 +289,7 @@ class WikiRevision {
        }
 
        /**
+        * @since 1.5.7
         * @param bool $minor
         */
        public function setMinor( $minor ) {
@@ -207,6 +297,7 @@ class WikiRevision {
        }
 
        /**
+        * @since 1.12.2
         * @param mixed $src
         */
        public function setSrc( $src ) {
@@ -214,15 +305,18 @@ class WikiRevision {
        }
 
        /**
+        * @since 1.17
         * @param string $src
         * @param bool $isTemp
         */
        public function setFileSrc( $src, $isTemp ) {
                $this->fileSrc = $src;
                $this->fileIsTemp = $isTemp;
+               $this->isTemp = $isTemp;
        }
 
        /**
+        * @since 1.17
         * @param string $sha1base36
         */
        public function setSha1Base36( $sha1base36 ) {
@@ -230,6 +324,7 @@ class WikiRevision {
        }
 
        /**
+        * @since 1.12.2
         * @param string $filename
         */
        public function setFilename( $filename ) {
@@ -237,6 +332,7 @@ class WikiRevision {
        }
 
        /**
+        * @since 1.17
         * @param string $archiveName
         */
        public function setArchiveName( $archiveName ) {
@@ -244,6 +340,7 @@ class WikiRevision {
        }
 
        /**
+        * @since 1.12.2
         * @param int $size
         */
        public function setSize( $size ) {
@@ -251,6 +348,7 @@ class WikiRevision {
        }
 
        /**
+        * @since 1.12.2
         * @param string $type
         */
        public function setType( $type ) {
@@ -258,6 +356,7 @@ class WikiRevision {
        }
 
        /**
+        * @since 1.12.2
         * @param string $action
         */
        public function setAction( $action ) {
@@ -265,6 +364,7 @@ class WikiRevision {
        }
 
        /**
+        * @since 1.12.2
         * @param array $params
         */
        public function setParams( $params ) {
@@ -272,6 +372,7 @@ class WikiRevision {
        }
 
        /**
+        * @since 1.18
         * @param bool $noupdates
         */
        public function setNoUpdates( $noupdates ) {
@@ -279,6 +380,7 @@ class WikiRevision {
        }
 
        /**
+        * @since 1.2
         * @return Title
         */
        public function getTitle() {
@@ -286,6 +388,7 @@ class WikiRevision {
        }
 
        /**
+        * @since 1.6.4
         * @return int
         */
        public function getID() {
@@ -293,6 +396,7 @@ class WikiRevision {
        }
 
        /**
+        * @since 1.2
         * @return string
         */
        public function getTimestamp() {
@@ -300,6 +404,7 @@ class WikiRevision {
        }
 
        /**
+        * @since 1.2
         * @return string
         */
        public function getUser() {
@@ -307,6 +412,7 @@ class WikiRevision {
        }
 
        /**
+        * @since 1.27
         * @return User
         */
        public function getUserObj() {
@@ -314,6 +420,7 @@ class WikiRevision {
        }
 
        /**
+        * @since 1.2
         * @return string
         */
        public function getText() {
@@ -321,6 +428,7 @@ class WikiRevision {
        }
 
        /**
+        * @since 1.24
         * @return ContentHandler
         */
        public function getContentHandler() {
@@ -332,6 +440,7 @@ class WikiRevision {
        }
 
        /**
+        * @since 1.21
         * @return Content
         */
        public function getContent() {
@@ -344,6 +453,7 @@ class WikiRevision {
        }
 
        /**
+        * @since 1.21
         * @return string
         */
        public function getModel() {
@@ -355,6 +465,7 @@ class WikiRevision {
        }
 
        /**
+        * @since 1.21
         * @return string
         */
        public function getFormat() {
@@ -366,6 +477,7 @@ class WikiRevision {
        }
 
        /**
+        * @since 1.2.6
         * @return string
         */
        public function getComment() {
@@ -373,6 +485,7 @@ class WikiRevision {
        }
 
        /**
+        * @since 1.5.7
         * @return bool
         */
        public function getMinor() {
@@ -380,6 +493,7 @@ class WikiRevision {
        }
 
        /**
+        * @since 1.12.2
         * @return mixed
         */
        public function getSrc() {
@@ -387,6 +501,7 @@ class WikiRevision {
        }
 
        /**
+        * @since 1.17
         * @return bool|string
         */
        public function getSha1() {
@@ -397,6 +512,7 @@ class WikiRevision {
        }
 
        /**
+        * @since 1.17
         * @return string
         */
        public function getFileSrc() {
@@ -404,6 +520,7 @@ class WikiRevision {
        }
 
        /**
+        * @since 1.17
         * @return bool
         */
        public function isTempSrc() {
@@ -411,6 +528,7 @@ class WikiRevision {
        }
 
        /**
+        * @since 1.12.2
         * @return mixed
         */
        public function getFilename() {
@@ -418,6 +536,7 @@ class WikiRevision {
        }
 
        /**
+        * @since 1.17
         * @return string
         */
        public function getArchiveName() {
@@ -425,6 +544,7 @@ class WikiRevision {
        }
 
        /**
+        * @since 1.12.2
         * @return mixed
         */
        public function getSize() {
@@ -432,6 +552,7 @@ class WikiRevision {
        }
 
        /**
+        * @since 1.12.2
         * @return string
         */
        public function getType() {
@@ -439,6 +560,7 @@ class WikiRevision {
        }
 
        /**
+        * @since 1.12.2
         * @return string
         */
        public function getAction() {
@@ -446,6 +568,7 @@ class WikiRevision {
        }
 
        /**
+        * @since 1.12.2
         * @return string
         */
        public function getParams() {
@@ -453,6 +576,7 @@ class WikiRevision {
        }
 
        /**
+        * @since 1.4.1
         * @return bool
         */
        public function importOldRevision() {
@@ -554,6 +678,10 @@ class WikiRevision {
                return true;
        }
 
+       /**
+        * @since 1.12.2
+        * @return bool
+        */
        public function importLogItem() {
                $dbw = wfGetDB( DB_MASTER );
 
@@ -611,6 +739,7 @@ class WikiRevision {
        }
 
        /**
+        * @since 1.12.2
         * @return bool
         */
        public function importUpload() {
@@ -682,6 +811,7 @@ class WikiRevision {
        }
 
        /**
+        * @since 1.12.2
         * @return bool|string
         */
        public function downloadSource() {
index 0305535..22717fc 100644 (file)
@@ -21,6 +21,7 @@
  * @ingroup Deployment
  */
 use Wikimedia\Rdbms\LBFactorySingle;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * Base class for DBMS-specific installation helper classes.
index f8ab1f2..8913c77 100644 (file)
@@ -20,6 +20,7 @@
  * @file
  * @ingroup Deployment
  */
+use Wikimedia\Rdbms\IDatabase;
 use MediaWiki\MediaWikiServices;
 
 require_once __DIR__ . '/../../maintenance/Maintenance.php';
@@ -392,7 +393,7 @@ abstract class DatabaseUpdater {
         * Writes the schema updates desired to a file for the DB Admin to run.
         * @param array $schemaUpdate
         */
-       private function writeSchemaUpdateFile( $schemaUpdate = [] ) {
+       private function writeSchemaUpdateFile( array $schemaUpdate = [] ) {
                $updates = $this->updatesSkipped;
                $this->updatesSkipped = [];
 
@@ -425,7 +426,7 @@ abstract class DatabaseUpdater {
         *
         * @param array $what What updates to perform
         */
-       public function doUpdates( $what = [ 'core', 'extensions', 'stats' ] ) {
+       public function doUpdates( array $what = [ 'core', 'extensions', 'stats' ] ) {
                $this->db->setSchemaVars( $this->getSchemaVars() );
 
                $what = array_flip( $what );
index f03fe6a..0a2b808 100644 (file)
@@ -446,6 +446,8 @@ abstract class Installer {
                $this->parserTitle = Title::newFromText( 'Installer' );
                $this->parserOptions = new ParserOptions( $wgUser ); // language will be wrong :(
                $this->parserOptions->setEditSection( false );
+               // Don't try to access DB before user language is initialised
+               $this->setParserLanguage( Language::factory( 'en' ) );
        }
 
        /**
@@ -674,7 +676,7 @@ abstract class Installer {
                try {
                        $out = $wgParser->parse( $text, $this->parserTitle, $this->parserOptions, $lineStart );
                        $html = $out->getText();
-               } catch ( DBAccessError $e ) {
+               } catch ( MediaWiki\Services\ServiceDisabledException $e ) {
                        $html = '<!--DB access attempted during parse-->  ' . htmlspecialchars( $text );
 
                        if ( !empty( $this->debug ) ) {
index ff13196..70e790c 100644 (file)
@@ -294,6 +294,7 @@ class MysqlUpdater extends DatabaseUpdater {
                        [ 'addField', 'change_tag', 'ct_id', 'patch-change_tag-ct_id.sql' ],
                        [ 'addField', 'tag_summary', 'ts_id', 'patch-tag_summary-ts_id.sql' ],
                        [ 'modifyField', 'recentchanges', 'rc_ip', 'patch-rc_ip_modify.sql' ],
+                       [ 'addIndex', 'archive', 'usertext_timestamp', 'patch-rename-ar_usertext_timestamp.sql' ],
 
                        // 1.29
                        [ 'addField', 'externallinks', 'el_index_60', 'patch-externallinks-el_index_60.sql' ],
index 79ae175..e262eda 100644 (file)
@@ -285,7 +285,7 @@ class OracleUpdater extends DatabaseUpdater {
         *
         * @param array $what
         */
-       public function doUpdates( $what = [ 'core', 'extensions', 'purge', 'stats' ] ) {
+       public function doUpdates( array $what = [ 'core', 'extensions', 'purge', 'stats' ] ) {
                parent::doUpdates( $what );
 
                $this->db->query( 'BEGIN fill_wiki_info; END;' );
index b950420..7a03c87 100644 (file)
@@ -90,6 +90,7 @@
        "config-db-name": "Име на базата от данни:",
        "config-db-name-help": "Избира се име, което да идентифицира уикито.\nТо не трябва да съдържа интервали.\n\nАко се използва споделен хостинг, доставчикът на услугата би трябвало да е предоставил или име на базата от данни, която да бъде използвана, или да позволява създаването на бази от данни чрез контролния панел.",
        "config-db-name-oracle": "Схема на базата от данни:",
+       "config-db-account-oracle-warn": "Има три поддържани сценария за инсталиране на Oracle като бекенд база данни:\n\nАко искате да създадете профил в базата данни като част от процеса на инсталиране, моля, посочете профил със SYSDBA като профил в базата данни за инсталиране и посочете желаните данни за влизане (име и парола) за профил с уеб достъп; в противен случай можете да създадете профил с уеб достъп ръчно и предоставите само него (ако той има необходимите права за създаване на схематични обекти), или да предоставите два различни профила - един с привилегии за създаване на обекти, и друг - с ограничения за уеб достъп.\n\nСкрипт за създаването на профил с необходимите привилегии може да се намери в папката \"maintenance/oracle/\" на тази инсталация. Имайте в предвид, че използването на ограничен профил ще деактивира всички възможности за обслужване на профила по подразбиране.",
        "config-db-install-account": "Потребителска сметка за инсталацията",
        "config-db-username": "Потребителско име за базата от данни:",
        "config-db-password": "Парола за базата от данни:",
        "config-db-web-account": "Сметка за уеб достъп до базата от данни",
        "config-db-web-help": "Избиране на потребителско име и парола, които уеб сървърът ще използва да се свързва с базата от данни при обичайната работа на уикито.",
        "config-db-web-account-same": "Използване на същата сметка като при инсталацията.",
-       "config-db-web-create": "Създаване на сметката ако все още не съществува",
+       "config-db-web-create": "Създаване на сметката, ако все още не съществува",
        "config-db-web-no-create-privs": "Посочената сметка за инсталацията не разполага с достатъчно права за създаване на нова сметка.\nНеобходимо е посочената сметка вече да съществува.",
        "config-mysql-engine": "Хранилище на данни:",
        "config-mysql-innodb": "InnoDB",
index 7a26214..64f6197 100644 (file)
@@ -15,7 +15,7 @@
        "config-localsettings-upgrade": "Kavet ez eus bet ur restr <code>LocalSettings.php</code>.\nEvit hizivaat ar staliadur-se, merkit an talvoud <code>$wgUpgradeKey</code> er voest dindan.\nE gavout a rit e <code>LocalSettings.php</code>.",
        "config-localsettings-cli-upgrade": "Dinoet ez eus bet ur restr <code>LocalSettings.php</code>.\nEvit lakaat ar staliadur-mañ a-live, implijit <code>update.php</code> e plas",
        "config-localsettings-key": "Alc'hwez hizivaat :",
-       "config-localsettings-badkey": "Direizh eo an alc'hwez merket ganeoc'h",
+       "config-localsettings-badkey": "Direizh eo an alc'hwez hizivaat lakaet ganeoc'h.",
        "config-upgrade-key-missing": "Kavet ez eus bet ur staliadur kent eus MediaWiki.\nEvit hizivaat ar staliadur-se, ouzhpennit al linenn da-heul e traoñ ho restr <code>LocalSettings.php</code>:\n\n$1",
        "config-localsettings-incomplete": "Diglok e seblant bezañ ar restr <code>LocalSettings.php</code> zo anezhi dija.\nAn argemmenn $1 n'eo ket termenet.\nKemmit <code>LocalSettings.php</code> evit ma vo termenet an argemmenn-se, ha klikit war « {{int:Config-continue}} ».",
        "config-localsettings-connection-error": "C'hoarvezet ez eus ur fazi en ur gevreañ ouzh an diaz roadennoù oc'h implijout an arventennoù diferet e <code>LocalSettings.php</code>. Reizhit an arventennoù-se hag esaeit en-dro.\n\n$1",
        "config-env-php": "Staliet eo PHP $1.",
        "config-env-hhvm": "HHVM $1 zo staliet.",
        "config-unicode-using-intl": "Oc'h implijout [http://pecl.php.net/intl an astenn PECL intl] evit ar reolata Unicode.",
-       "config-unicode-pure-php-warning": "'''Diwallit''' : N'haller ket kaout an [http://pecl.php.net/intl intl PECL astenn] evit merañ reoladur Unicode, a zistro d'ar stumm gorrek emplementet e-PHP.\nMa lakait da dreiñ ul lec'hienn darempredet-stank e vo mat deoc'h lenn un tammig bihan diwar-benn se war [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode normalization]. (e saozneg)",
+       "config-unicode-pure-php-warning": "<strong>Diwallit</strong> : N'haller ket ober gant an [http://pecl.php.net/intl intl astenn PECL] evit merañ reoladur Unicode; distreiñ d'ar stumm gorrek emplementet e PHP-rik.\nMa rit war-dro ul lec'hienn darempredet-stank e vo mat deoc'h lenn un tammig bihan diwar-benn se war [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations reolennadur Unicode].",
        "config-unicode-update-warning": "'''Diwallit''': ober a ra stumm staliet endalc'her skoueriekaat Unicode gant ur stumm kozh eus [http://site.icu-project.org/ levraoueg meziantoù ar raktres ICU].\nDleout a rafec'h [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations hizivaat] ma seblant deoc'h bezañ pouezus ober gant Unicode.",
-       "config-no-db": "N'eus ket bet gallet kavout ur sturier diazoù roadennoù a zere ! Ret eo deoc'h staliañ ur sturier diazoù roadennoù evit PHP.\nSkoret eo an diazoù roadennoù da-heul : $1.\n\nMa rit gant un herberc'hiañ kenrannet, goulennit digant ho herberc'hier staliañ ur sturier diaz roadennoù azas.\nMa kempunit PHP c'hwi hoc'h-unan, adkeflugnit-eñ en ur weredekaat un arval diaz roadennoù, da skouer en ur ober gant <code>./configure --mysql</code>.\nM'hoc'h eus staliet PHP adalek ur pakad Debian pe Ubuntu, eo ret deoc'h staliañ ar vodulenn php5-mysql ivez.",
+       "config-no-db": "N'eus ket bet gallet kavout ur sturier diazoù roadennoù a zere ! Ret eo deoc'h staliañ ur sturier diazoù roadennoù evit PHP.\nSkoret eo {{PLURAL:$2|ar seurt|ar seurtoù}} diazoù roadennoù da-heul : $1.\n\nMard eo bet kempunet PHP ganeoc'h-c'hwi hoc'h-unan, adkeflugnit-eñ en ur weredekaat un arval diaz roadennoù, da skouer en ur ober gant <code>/configure --with-mysqli</code>.\nM'hoc'h eus staliet PHP adalek ur pakad Debian pe Ubuntu, eo ret deoc'h staliañ, da skouer, ar pakad <code>php5-mysql</code> ivez.",
+       "config-outdated-sqlite": "<strong>Taolit pled :</strong> ober a rit gant SQLite $1, hag a zo izeloc'h eget ar stumm $2 ret bihanañ. Ne vo ket posupl ober gant SQLite.",
        "config-no-fts3": "'''Diwallit ''': Kempunet eo SQLite hep ar [//sqlite.org/fts3.html vodulenn FTS3]; ne vo ket posupl ober gant an arc'hwelioù klask er staliadur-mañ",
+       "config-pcre-old": "<strong>Fazo groñs :</strong> rekis eo ober gant PCRE $1 pe nevesoc'h.\nLiammet eo ho PHP binarel gant PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Gouzout hiroc'h].",
        "config-pcre-no-utf8": "'''Fazi groñs ''': evit doare eo bet kempunet modulenn PCRE PHP hep ar skor PCRE_UTF8.\nEzhomm en deus MediaWiki eus UTF-8 evit mont plaen en-dro.",
        "config-memory-raised": "<code>memory_limit</code> ar PHP zo $1, kemmet e $2.",
        "config-memory-bad": "'''Diwallit :''' Da $1 emañ arventenn <code>memory_limit</code> PHP.\nRe izel eo moarvat.\nMarteze e c'hwito ar staliadenn !",
        "config-apc": "Staliet eo [http://www.php.net/apc APC]",
        "config-apcu": "Staliet eo [http://www.php.net/apcu APCu]",
        "config-wincache": "Staliet eo [http://www.iis.net/download/WinCacheForPhp WinCache]",
+       "config-no-cache-apcu": "<strong>Taolit pled :</strong> N'eus ket bet gallet kavout [http://www.php.net/apcu APCu], [http://xcache.lighttpd.net/ XCache] pe [http://www.iis.net/download/WinCacheForPhp WinCache].\nN'eo ket gweredekaet ar c'hrubuilhañ traezoù.",
+       "config-mod-security": "<strong>Taolit pled :</strong> Gweredekaet eo [http://modsecurity.org/ mod_security]/mod_security2 gant ho servijer web. Ma n'eo ket kfluniet mat e c'hall tegas trubuilhoù da MediaWiki ha meziantoù all a aotre implijerien da ouzhpennañ danvez evel ma karont.\nE kement ha m'eo posupl e tlefe bezañ diweredekaet. A-hend-all, sellit ouzh [http://modsecurity.org/documentation/ mod_security an teuliadur] pe kit e darempred gant skoazell ho herberc'hier m'en em gavit gant fazioù dargouezhek.",
        "config-diff3-bad": "N'eo ket bet kavet GNU diff3.",
+       "config-git": "Kavet eo bet ar meziant kontrolliñ adstummoù Git : <code>$1</code>.",
+       "config-git-bad": "N'eo ket bet kavet ar meziant kontrolliñ stummoù Git.",
        "config-imagemagick": "ImageMagick kavet : <code>$1</code>.\nGweredekaet e vo ar bihanaat skeudennoù ma vez gweredekaet ganeoc'h ar pellgargañ restroù.",
        "config-gd": "Kavet eo bet al levraoueg c'hrafek GD enframmet.\nGweredekaet e vo ar bihanaat skeudennoù ma vez gweredekaet an enporzhiañ restroù.",
        "config-no-scaling": "N'eus ket bet gallet kavout al levraoueg GD pe ImageMagick.\nDiweredekaet e vo ar bihanaat skeudennoù.",
        "config-no-uri": "'''Fazi :''' N'eus ket tu da anavezout URI ar skript red.\nStaliadur nullet.",
+       "config-no-cli-uri": "<strong>Diwallit :</strong> N'eus bet spisaet <code>--scriptpath</code> ebet, graet e vo, dre ziouer, gant : <code>$1</code>.",
        "config-using-server": "Oc'h implijout an anv servijer \"<nowiki>$1</nowiki>\".",
        "config-using-uri": "Oc'h implijout ar servijour URL \"<nowiki>$1$2</nowiki>\".",
        "config-uploads-not-safe": "'''Diwallit :'''Bresk eo ho kavlec'h pellgargañ dre ziouer <code>$1</code> rak gallout a ra erounit ne vern pe skript.\nha pa vefe gwiriet gant MediaWiki an holl restroù pellgarget eo erbedet-groñs da [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security serriñ ar breskter surentez-mañ] a-rao gweredekaat ar pellgargañ.",
+       "config-no-cli-uploads-check": "<strong>Diwallit :</strong> N'eo ket bet gwiriet ho kavlec'h enporzhiañ dre ziouer (<code>$1</code>) e-keñver breskted erounezadur skriptoù tidek e-pad staliadur CLI.",
        "config-brokenlibxml": "Ur meskad stummoù PHP ha libxml2 dreinek a vez implijet gant ho reizhiad. Gallout a ra breinañ ar roadennoù e MediaWiki hag en arloadoù web all.\nHizivait da libxml2 2.7.3 pe nevesoc'h ([https://bugs.php.net/bug.php?id=45996 draen renablet gant PHP]).\nStaliadur c'hwitet.",
+       "config-suhosin-max-value-length": "Staliet eo Suhosin ha bevennin a ra <code>hirder</code> an arventenn GET da $1 okted.\nParzh ResourceLoader Mediawiki a zoujo d'ar vevenn-se met se a zisteray ar varregezh. \nMa c'hallit e tlefec'h spisaat <code>suhosin.get.max_value_length</code> da 1024 pe uheloc'h e <code>php.ini</code>, ha merkañ <code>$wgResourceLoaderMaxQueryLength</code> gant an hevelep talvoud e <code>LocalSettings.php</code>.",
        "config-db-type": "Doare an diaz roadennoù :",
        "config-db-host": "Anv implijer an diaz roadennoù :",
        "config-db-host-help": "M'emañ ho servijer roadennoù war ur servijer disheñvel, merkit amañ anv an ostiz pe ar chomlec'h IP.\n\nMa rit gant un herberc'hiañ kenrannet, e tlefe ho herberc'hier bezañ pourchaset deoc'h an anv ostiz reizh en teulioù titouriñ.\n\nM'emaoc'h o staliañ ur servijer Windows ha ma rit gant MySQL, marteze ne'z aio ket en-dro \"localhost\" evel anv servijer. Ma ne dro ket, klaskit ober gant \"127.0.0.1\" da chomlec'h IP lechel.",
        "config-db-host-oracle": "TNS an diaz roadennoù :",
+       "config-db-host-oracle-help": "Merkit un [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm anv kevreañ lec'hel] reizh; dleout a ra ur restr tnsnames.ora bezañ hewel e-pad ar staliadur.<br /> Ma rit gant al levraouegoù arval 10g pe nevesoc'h e c'hallit ivez ober gant an hentenn envel [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm Easy Connect].",
        "config-db-wiki-settings": "Anavezout ar wiki-mañ",
        "config-db-name": "Anv an diaz roadennoù :",
        "config-db-name-help": "Dibabit un anv evit ho wiki.\nNa lakait ket a esaouennoù ennañ.\n\nMa ri gant un herberc'hiañ kenrannet e vo pourchaset deoc'h un anv diaz roadennoù dibar da vezañ graet gantañ gant ho herberc'hier pe e lezo ac'hanoc'h da grouiñ diazoù roadennoù dre ur banell gontrolliñ.",
        "config-db-name-oracle": "Brastres diaz roadennoù :",
+       "config-db-account-oracle-warn": "Skoret ez eus tri doare evit staliañ Oracle da v/backend diaz roadennoù :\n\nMar fell deoc'h krouiñ ur gont diaz roadennoù e-ser an argerzh staliañ eo rekis pourchas ur gont gant ur roll SYSDBA evel kont diaz roadennoù evit ar staliañ, ha spisaat an titouroù anaout a fell deoc'h evit ar gont moned ouzh ar web. A-hend-all, e c'hallit krouiñ ar gont moned ouzh ar web gant an dorn ha pourchas hepken ar gont-se (ma'z eus bet ranket diskouez aotreoù ret evit krouiñ traezoù ar brastres) pe pourveziñ div gont disheñvel, unan gant dreistwirioù krouiñ hag eben, gant gwirioù strishaet, evit moned ouzh ar web.\n\nGallout a reer kaout ar skript evit kouiñ ur gont a zo rekis dreistwirioù eviti e kavlec'h \"trezalc'h/oracle/\" ar staliadur-mañ. Na zisoñjit ket e vo diweredekaet holl varregezhioù trezalc'h ar gont dre ziouer ma rit gant ur gont strishaet he gwirioù.",
        "config-db-install-account": "Kont implijer evit ar staliadur",
        "config-db-username": "Anv implijer an diaz roadennoù :",
        "config-db-password": "Ger-tremen an diaz roadennoù :",
        "config-db-install-help": "Merkañ anv an implijer hag ar ger-tremen a vo implijet evit kevreañ ouzh an diaz roadennoù e-pad an argerzh staliañ.",
        "config-db-account-lock": "Implijout ar memes anv implijer ha ger-tremen e-kerzh oberiadurioù boutin",
        "config-db-wiki-account": "Kont implijer evit oberiadurioù boutin",
+       "config-db-wiki-help": "Merkañ an anv-implijer hag ar ger-tremen a vo implijet evit kevreañ ouzh an diaz roadennoù e-pad oberiadurioù normal ar wiki.\nMa n'eus ket eus ar gont ha ma'z eus gwirioù a-walc'h gant ar gont staliañ, e vo krouet ar gont implijer-mañ gant al live gwirioù rekis izelañ evit gallout lakaat ar wiki da vont en-dro.",
        "config-db-prefix": "Rakrann taolennoù an diaz roadennoù :",
+       "config-db-prefix-help": "Mard eo ret deoc'h rannañ un diaz roadennoù gant meur a wiki, pe etre MediaWiki hag un arload benak all e c'hallit dibab ouzhpennañ ur rakger da holl anvioù an taolennoù kuit na vije tabutoù.\nArabat ober gant esaouennoù.\n\nPeurliesañ e vez laosket goullo ar vaezienn-mañ.",
        "config-mysql-old": "Rekis eo MySQL $1 pe ur stumm nevesoc'h; ober a rit gant $2.",
        "config-db-port": "Porzh an diaz roadennoù :",
        "config-db-schema": "Brastres evit MediaWiki",
        "config-db-schema-help": "Peurliesañ e vo digudenn ar chema-mañ.\nArabat cheñch anezho ma n'hoc'h eus ket ezhomm d'en ober.",
        "config-pg-test-error": "N'haller ket kevreañ ouzh an diaz-titouroù '''$1''' : $2",
        "config-sqlite-dir": "Kavlec'h roadennoù SQLite :",
+       "config-sqlite-dir-help": "Stokañ a ra SQLite an holl roadennoù en ur restr nemetken.\n\nE-pad ar staliañ, rankout a ra ar servijer web gallout skrivañ er c'havlec'h pourchaset ganeoc'h.\n\nNe zlefe <strong>ket</strong> bezañ tizhadus dre ar web; setu perak ne lakaomp ket anezhañ el lec'h m'emañ ho restroù PHP.\n\nSkivañ a raio ar stalier ur restr <code>.htaccess</code> war un dro gantañ met ma c'hoarvez ur fazi e c'hallfe unan bennak tapout krog en ho roadennoù.\nKement-se a sell ouzh ar roadennoù implijer (chomlec'hioù postel, gerioù-tremen hachet) hag ouzh an adweladennoù diverket ha takadoù gwarzeet all eus ar wiki.\n\nEn em soñjit ha ne vefe ket gwelloc'h lakaat an diaz roadennoù en un tu bennak all, da skouer e <code>/var/lib/mediawiki/yourwiki</code>.",
        "config-oracle-def-ts": "Esaouenn stokañ (\"tablespace\") dre ziouer :",
        "config-oracle-temp-ts": "Esaouenn stokañ (''tablespace'') da c'hortoz :",
        "config-type-mysql": "MySQL (pe kenglotus)",
        "config-type-oracle": "Oracle",
        "config-type-mssql": "Microsoft SQL Server",
        "config-support-info": "Skoret eo ar reizhiadoù diaz titouroù da-heul gant MediaWiki :\n\n$1\n\nMa ne welit ket amañ dindan ar reizhiad diaz titouroù a fell deoc'h ober ganti, heuilhit an titouroù a-us (s.o. al liammoù) evit gweredekaat ar skorañ.",
-       "config-dbsupport-mysql": "* $1 eo an dibab kentañ evit MediaWiki hag an hini skoret ar gwellañ ([http://www.php.net/manual/en/mysql.installation.php penaos kempunañ PHP gant skor MySQL])",
-       "config-dbsupport-postgres": "* Ur reizhiad diaz titouroù brudet ha digor eo $1. Gallout a ra ober evit MySQL ([http://www.php.net/manual/en/pgsql.installation.php Penaos kempunañ PHP gant skor PostgreSQL]). Gallout a ra bezañ un nebeud drein bihan enni ha n'eo ket erbedet he implijout en un endro produiñ.",
-       "config-dbsupport-sqlite": "* $1 zo ur reizhiad diaz titouroù skañv skoret eus ar c'hentañ. ([http://www.php.net/manual/en/pdo.installation.php Penaos kempunañ PHP gant skor SQLite], implijout a ra PDO)",
-       "config-dbsupport-oracle": "* $1 zo un diaz titouroù kenwerzhel. ([http://www.php.net/manual/en/oci8.installation.php Penaos kempunañ PHP gant skor OCI8])",
+       "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] eo an dibab kentañ evit MediaWiki hag an hini skoret ar gwellañ. Mont a ra MediaWiki en-dro gant [{{int:version-db-mariadb-url}} MariaDB] ha [{{int:version-db-percona-url}} Percona Server] ivez, kenglotus o-daou gant MySQL. ([http://www.php.net/manual/en/mysqli.installation.php Penaos kempunañ PHP gant skor MySQL])",
+       "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] zo anezhi ur reizhiad diaz roadennoù frank a wirioù brudet-mat a c'haller ober gantañ e plas MySQL. ([http://www.php.net/manual/en/pgsql.installation.php Penaos kempunañ PHP gant skor PostgreSQL])",
+       "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] zo anezhi ur reizhiad diaz roadennoù skañv skoret eus ar c'hentañ. ([http://www.php.net/manual/en/pdo.installation.php Penaos kempunañ PHP gant skor SQLite], implijout a ra PDO)",
+       "config-dbsupport-oracle": "* Un embregerezh kenwerzhel diaz roadennoù eo [{{int:version-db-oracle-url}} Oracle]. ([http://www.php.net/manual/en/oci8.installation.php Penaos kempunañ PHP gant skor OCI8])",
+       "config-dbsupport-mssql": "* Un embregerezh kenwerzhel diaz roadennoù evit Windows eo [{{int:version-db-mssql-url}} Microsoft SQL Server]. ([http://www.php.net/manual/en/sqlsrv.installation.php Penaos kempunañ PHP gant skor SQLSRV])",
        "config-header-mysql": "Arventennoù MySQL",
        "config-header-postgres": "Arventennoù PostgreSQL",
        "config-header-sqlite": "Arventennoù SQLite",
        "config-missing-db-name": "Ret eo deoc'h merkañ un dalvoudenn evit \"{{int:config-db-name}}\".",
        "config-missing-db-host": "Ret eo deoc'h merkañ un dalvoudenn evit \"{{int:config-db-host}}\"",
        "config-missing-db-server-oracle": "Ret eo deoc'h merkañ un dalvoudenn evit \"{{int:config-db-host-oracle}}\".",
-       "config-invalid-db-server-oracle": "Direizh eo anv TNS an diaz titouroù \"$1\".\nOber hepken gant lizherennoù ASCII (a-z, A-Z), sifroù (0-9), arouezennoù islinennañ (_) ha pikoù (.).",
+       "config-invalid-db-server-oracle": "Direizh eo anv TNS an diaz roadennoù \"$1\".\nOber gant an neudennad \"TNS Name\" pe c'hoazh gant \"Easy Connect ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Hentennoù envel Oracle]).",
        "config-invalid-db-name": "Direizh eo anv an diaz titouroù \"$1\".\nOber hepken gant lizherennoù ASCII (a-z, A-Z), sifroù (0-9), arouezennoù islinennañ (_) ha tiredoù (-).",
        "config-invalid-db-prefix": "Direizh eo rakger an diaz titouroù \"$1\".\nOber hepken gant lizherennoù ASCII (a-z, A-Z), sifroù (0-9), arouezennoù islinennañ (_) ha tiredoù (-).",
        "config-connection-error": "$1.\n\nGwiriit anv an ostiz, an anv implijer, ar ger-tremen ha klaskit en-dro.",
        "config-postgres-old": "Rekis eo PostgreSQL $1 pe ur stumm nevesoc'h; ober a rit gant $2.",
        "config-mssql-old": "Stumm $1 Microsoft SQL Server, pe unan nevesoc'h, zo rekis. Ganeoc'h emañ ar stumm $2.",
        "config-sqlite-name-help": "Dibabit un anv dibar d'ho wiki.\nArabat ober gant esaouennoù pe barrennigoù-stagañ.\nImplijet e vo evit ar restr roadennoù SQLite.",
+       "config-sqlite-parent-unwritable-group": "N'haller ket krouiñ ar c'havlec'h roadennoù <code><nowiki>$1</nowiki></code> peogwir n'hall ket ar servijer Web skrivañ war ar c'havlec'h kar <code><nowiki>$2</nowiki></code>.\n\nKavet eo bet gant ar stalier an anv implijer m'eo oberiant ar servijer drezañ. Evit gallout kenderc'hel, lakait ar c'havlec'h <code><nowiki>$3</nowiki></code> da vezañ tizhus evit ar skrivañ.\nWar ur reizhiad Unix/Linux system ober :\n\n<pre>cd $2\nmkdir $3\nchgrp $4 $3\nchmod g+w $3</pre>",
        "config-sqlite-mkdir-error": "Ur fazi zo bet e-ser krouiñ ar c'havlec'h roadennoù \"$1\".\nGwiriañ al lec'hiadur ha klask en-dro.",
        "config-sqlite-dir-unwritable": "Dibosupl skrivañ er c'havlec'h \"$1\".\nCheñchit ar aotreoù evit ma c'hallfe ar servijer web skrivañ ennañ ha klaskit en-dro.",
        "config-sqlite-connection-error": "$1.\n\nGwiriañ ar c'havlec'h roadennoù hag anv an diaz roadennoù a-is ha klaskit en-dro.",
        "config-admin-error-password": "Fazi diabarzh o lakaat ur ger-tremen evit ar merour « <nowiki>$1</nowiki> » : <pre>$2</pre>",
        "config-admin-error-bademail": "Ebarzhet hoc'h eus ur chomlec'h postel direizh.",
        "config-subscribe": "Koumanantit d'ar [https://lists.wikimedia.org/mailman/listinfo/mediawiki-roll kemennoù evit ar stummoù nevez].",
+       "config-pingback": "Rannañ roadennoù diwar-benn ar staliadur-mañ gant diorroerien Mediawiki.",
        "config-almost-done": "Kazi echu eo !\nGellout a rit tremen ar c'hefluniadur nevez ha staliañ ar wiki war-eeun.",
        "config-optional-continue": "Sevel muioc'h a goulennoù ouzhin.",
        "config-optional-skip": "Aet on skuizh, staliañ ar wiki hepken.",
        "config-license-cc-by": "Creative Commons Deroadenn",
        "config-license-cc-by-nc-sa": "Creative Commons Deroadenn Angenwerzhel Kenrannañ heñvel",
        "config-license-cc-0": "Creative Commons Zero (Domani foran)",
+       "config-license-gfdl": "Aotre implijout teuliadur frank GNU 1.3 pe nevesoc'h",
        "config-license-pd": "Domani foran",
        "config-license-cc-choose": "Dibabit un aotre-implijout Creative Commons personelaet",
        "config-email-settings": "Arventennoù ar postel",
        "config-cc-not-chosen": "Dibabit an aotre-implijout Creative Commons a fell deoc'h ober gantañ ha klikit war \"proceed\".",
        "config-advanced-settings": "Kefluniadur araokaet",
        "config-cache-options": "Arventennoù evit krubuilhañ traezoù :",
-       "config-cache-accel": "Krubuilhañ traezoù PHP (APC, XCache pe WinCache)",
+       "config-cache-accel": "Krubuilhañ traezoù PHP (APC, APCu, XCache pe WinCache)",
        "config-cache-memcached": "Implijout Memcached (en deus ezhomm bezañ staliet ha kefluniet)",
        "config-memcached-servers": "Servijerioù Memcached :",
        "config-memcached-help": "Roll ar chomlec'hioù IP da implijout evit Memcached.\nRet eo spisaat unan dre linenn ha spisaat ar porzh da vezañ implijet. Da skouer :\n127.0.0.1:11211\n192.168.1.25:1234",
        "config-memcache-needservers": "Diuzet hoc'h eus Memcached evel seurt krubuilh met n'hoc'h eus spisaet servijer ebet.",
        "config-memcache-badip": "Ur chomlec'h IP direizh hoc'h eus lakaet evit Memcached : $1.",
+       "config-memcache-noport": "N'eus ket bet spisaet porzh ebet ganeoc'h evit servijer Memcached : $1.\nMa n'anavezit ket ar porzh, setu an hini dre ziouer : 11211.",
        "config-memcache-badport": "Niverennoù porzh Memcached a zlefe bezañ etre $1 ha $2.",
        "config-extensions": "Astennoù",
        "config-extensions-help": "N'eo ket bet detektet an astennoù rollet a-us en ho kavlec'h <code>./astennoù</code>.\n\nMarteze e vo ezhomm kefluniañ pelloc'h met gallout a rit o gweredekaat bremañ.",
        "config-skins": "Gwiskadurioù",
+       "config-skins-help": "Kavet eo bet ar gwiskadurioù renablet a-us en ho kavlec'h <code>./skins</code>. Ret eo deoc'h gweredekaat unan da nebeutañ, ha dibab an hini dre ziouer.",
        "config-skins-use-as-default": "Implijout ar gwiskadur-mañ dre ziouer",
+       "config-skins-missing": "N'eus bet kavet gwiskadur ebet : ober a raio MediaWiki gant unan dre ziouer betek ma vo staliet reoù a zegouezh.",
        "config-skins-must-enable-some": "Ret eo deoc'h dibab da nebautañ ur gwiskadur da weredekaat.",
        "config-skins-must-enable-default": "Ar gwiskadur dre ziouer dibabet a rank bezañ gweredekaet.",
        "config-install-alreadydone": "'''Diwallit''': Staliet hoc'h eus MediaWiki dija war a seblant hag emaoc'h o klask e staliañ c'hoazh.\nKit d'ar bajenn war-lerc'h, mar plij.",
        "config-help": "skoazell",
        "config-help-tooltip": "klikañ evit astenn",
        "config-nofile": "N'eus ket bet gallet kavout ar restr \"$1\". Daoust ha dilamet eo bet ?",
-       "mainpagetext": "'''Meziant MediaWiki staliet.'''",
+       "mainpagetext": "<strong>Staliet eo bet MediaWiki.</strong>",
        "mainpagedocfooter": "Sellit ouzh [https://meta.wikimedia.org/wiki/Help:Contents Sturlevr an implijerien] evit gouzout hiroc'h war an doare da implijout ar meziant wiki.\n\n== Kregiñ ganti ==\n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Roll an arventennoù kefluniañ]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAG MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Roll ar c'haozeadennoù diwar-benn dasparzhoù MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Lec'hiañ MediaWiki en ho yezh"
 }
index 89f8e55..b8dab21 100644 (file)
@@ -86,7 +86,7 @@
        "config-db-host-oracle-help": "Внесете важечко [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm месно име за поврзување]. На оваа воспоставка мора да ѝ биде видлива податотеката tnsnames.ora.<br />Ако користите клиентски библиотеки 10g или понови, тогаш можете да го користите и методот на иметнување на [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm Easy Connect].",
        "config-db-wiki-settings": "Идентификувај го викиво",
        "config-db-name": "Име на базата:",
-       "config-db-name-help": "Одберете име што ќе го претставува вашето вики.\nИмето не смее да содржи празни места.\n\nАко користите заедничко (споделено) вдомување, тогаш вашиот вдомител ќе ви даде конкретно име на база за користење, или пак ќе ви даде да создавате бази преку контролната табла.",
+       "config-db-name-help": "Одберете име што ќе го претставува вашето вики.\nИмето не смее да содржи празни места.\n\nАко користите заедничко (споделено) вдомување, тогаш вашиот вдомител ќе ви даде конкретно име на база за користење, или пак ќе ви даде да создавате бази преку управувачницата.",
        "config-db-name-oracle": "Шема на базата:",
        "config-db-account-oracle-warn": "Постојат три поддржани сценарија за воспоставка на Oracle како базен услужник:\n\nАко сакате да создадете сметка на базата како дел од постапката за воспоставка, наведете сметка со SYSDBA-улога како сметка за базата што ќе се воспостави и наведете ги саканите податоци за сметката за мрежен пристап. Во друг случај, можете да создадете сметка за мрежен пристап рачно и да ја наведете само таа сметка (ако има дозволи за создавање на шематски објекти) или пак да наведете две различни сметки, една со привилегии за создавање, а друга (ограничена) за мрежен пристап.\n\nСкриптата за создавање сметка со задолжителни привилегии ќе ја најдете во папката „maintenance/oracle/“ од оваа воспоставка. Имајте на ум дека ако користите ограничена сметка ќе ги оневозможите сите функции за одржување со основната сметка.",
        "config-db-install-account": "Корисничка смета за воспоставка",
index 13944ee..35fa8e8 100644 (file)
@@ -69,7 +69,7 @@
        "config-env-hhvm": "HHVM $1 está instalado.",
        "config-unicode-using-intl": "Usando a [http://pecl.php.net/intl extensão intl PECL] para a normalização Unicode.",
        "config-unicode-pure-php-warning": "<strong>Aviso</strong>: A [http://pecl.php.net/intl extensão intl PECL] não está disponível para efetuar a normalização Unicode, abortando e passando para a lenta implementação de PHP puro.\nSe o seu site tem um alto volume de tráfego, informe-se sobre a [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations normalização Unicode].",
-       "config-unicode-update-warning": "<strong>Aviso:</strong> A versão instalada do wrapper de normalização Unicode usa uma versão mais antiga da biblioteca do [//www.site.icu-project.org/projeto ICU].\nVocê deve [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations atualizar] se você tem quaisquer preocupações com o uso do Unicode.",
+       "config-unicode-update-warning": "<strong>Aviso:</strong> A versão instalada do wrapper de normalização Unicode usa uma versão mais antiga da biblioteca do [http://www.site.icu-project.org/projeto ICU].\nVocê deve [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations atualizar] se você tem quaisquer preocupações com o uso do Unicode.",
        "config-no-db": "Não foi possível encontrar um driver apropriado para a banco de dados! Você precisa instalar um driver de banco de dados para PHP. {{PLURAL:$2|É aceite o seguinte tipo|São aceites os seguintes tipos}} de banco de dados: $1.\n\nSe compilou o PHP você mesmo, reconfigure-o com um cliente de banco de dados ativado, por exemplo, usando <code>./configure --with-mysqli</code>.\nSe instalou o PHP a partir de um pacote Debian ou Ubuntu, então também precisa instalar, por exemplo, o pacote <code>php5-mysql</code>.",
        "config-outdated-sqlite": "<strong>Aviso:</strong> você tem o SQLite versão $1, que é menor do que a versão mínima necessária $2. O SQLite não estará disponível.",
        "config-no-fts3": "<strong>Aviso</strong> O SQLite foi compilado sem o [//sqlite.org/fts3.html módulo FTS3], as funcionalidades de pesquisa não estarão disponíveis nesta instalação.",
        "config-no-cli-uri": "<strong>Aviso:</strong> Nenhum <code>--scriptpath</code> foi especificado, usando o padrão: <code>$1</code>.",
        "config-using-server": "Utilizando o nome do servidor \"<nowiki>$1</nowiki>\".",
        "config-using-uri": "Usando URL do servidor \"<nowiki>$1$2</nowiki>\".",
+       "config-uploads-not-safe": "<strong>Aviso:</strong> O seu diretório atual de envios <code>$1</code> está vulnerável a execuções de script arbitrárias.\nEmbora o MediaWiki verifique todos os arquivos enviados por ameaças de segurança, é altamente recomendável [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security evitar essa vulnerabilidade de segurança] antes de permitir envios.",
        "config-no-cli-uploads-check": "<strong>Atenção:</strong> O seu diretório padrão para envios (<code>$1</code>) não está marcado para vulnerabilidade\npara execução de script arbitrário durante a instalação do CLI.",
        "config-brokenlibxml": "O sistema tem uma combinação de PHP e libxml2 que é conflitante e pode causar corrupção de dados ocultos no MediaWiki e outros aplicativos da web.\nAtualize para o libxml2 2.7.3 ou mais recente ([https://bugs.php.net/bug.php?id=45996 bugs com o PHP]).\nInstalação abortada.",
+       "config-suhosin-max-value-length": "O Suhosin está instalado e limita o parâmetro GET <code>length</code> para $1 bytes. O componente ResourceLoader trabalhará em torno deste limite, mas rebaixará a performance.\nSe possível, defina <code>suhosin.get.max_value_length</code> em <code>php.ini</code> para 1024 ou mais, e defina <code>$wgResourceLoaderMaxQueryLength</code> em <code>LocalSettings.php</code> para o mesmo valor.",
        "config-db-type": "Tipo de base de dados:",
        "config-db-host": "Servidor da base de dados:",
        "config-db-host-help": "Se a base de dados do seu servidor está em um servidor diferente, digite o nome do hospedeiro ou o endereço IP aqui.\n\nSe você está utilizando um hospedeiro web compartilhado, o seu provedor de hospedagem deverá fornecer o nome do hospedeiro correto na sua documentação.\n\nSe você está instalando em um servidor Windows e usando o MySQL, usar \"localhost\" pode não funcionar para o nome de servidor. Se não funcionar, tente \"127.0.01\" para o endereço de IP local.\n\nSe você está usando PostgreSQl, deixe este campo em branco para se conectar através de um socket Unix.",
index 198422a..1d4fc61 100644 (file)
@@ -8,7 +8,7 @@
        "config-title": "Installazzione de MediaUicchi $1",
        "config-information": "'Mbormaziune",
        "config-localsettings-key": "Chiave de aggiornamende:",
-       "config-localsettings-badkey": "'A chiave ca è date non g'è corrette.",
+       "config-localsettings-badkey": "'A chiave de aggiornamende ca è date non g'è corrette.",
        "config-session-error": "Errore facenne accumenzà 'a sessione: $1",
        "config-your-language": "'A lènga toje:",
        "config-your-language-help": "Scacchie 'na lènghe da ausà duranne 'u processe de installazzione:",
@@ -36,6 +36,8 @@
        "config-db-type": "Tipe de database:",
        "config-db-host-oracle": "Database TNS:",
        "config-db-name-oracle": "Scheme d'u database:",
+       "config-db-username": "Nome utende d'u database:",
+       "config-db-password": "Password d'u database:",
        "config-db-port": "Porte d'u database:",
        "config-db-schema": "Scheme pe MediaUicchi:",
        "config-type-mysql": "MySQL (o combatibbile)",
index ecb8e87..ccc7455 100644 (file)
@@ -9,11 +9,11 @@
        },
        "config-desc": "ตัวติดตั้งสำหรับมีเดียวิกิ",
        "config-title": "การติดตั้งมีเดียวิกิ $1",
-       "config-information": "สารสà¸\99à¹\80à¸\97ศ",
+       "config-information": "à¸\82à¹\89อมูล",
        "config-localsettings-upgrade": "ตรวจพบไฟล์ <code>LocalSettings.php</code>\nเพื่ออัปเกรดการติดตั้งนี้ กรุณากรอกค่าของ <code>$wgUpgradeKey</code> ในกล่องด้านล่าง\nคุณจะพบมันได้ใน <code>LocalSettings.php</code>",
        "config-localsettings-cli-upgrade": "ตรวจพบไฟล์ <code>LocalSettings.php</code>\nเพื่ออัปเกรดการติดตั้งนี้ กรุณาดำเนินงาน <code>update.php</code> แทน",
-       "config-localsettings-key": "à¸\81ุà¸\8dà¹\81à¸\88อัปเกรด:",
-       "config-localsettings-badkey": "à¸\81ุà¸\8dà¹\81à¸\88ที่คุณกรอกไม่ถูกต้อง",
+       "config-localsettings-key": "à¸\84ียà¹\8cอัปเกรด:",
+       "config-localsettings-badkey": "à¸\84ียà¹\8cอัà¸\9bà¹\80à¸\81รà¸\94ที่คุณกรอกไม่ถูกต้อง",
        "config-upgrade-key-missing": "ตรวจพบการติดตั้งมีเดียวิกิที่มีอยู่แล้ว\nเพื่ออัปเกรดการติดตั้งนี้ กรุณาใส่บรรทัดต่อไปนี้ที่ท้ายไฟล์ <code>LocalSettings.php</code> ของคุณ:\n\n$1",
        "config-localsettings-incomplete": "<code>LocalSettings.php</code> ที่มีอยู่ดูเหมือนว่าไม่สมบูรณ์\nตัวแปร $1 ไม่ถูกกำหนด\nกรุณาเปลี่ยนแปลง <code>LocalSettings.php</code> เพื่อกำหนดตัวแปรนี้ และคลิก \"{{int:Config-continue}}\"",
        "config-localsettings-connection-error": "ความผิดพลาดเกิดขึ้นเมื่อเชื่อมต่อฐานข้อมูลโดยใช้การตั้งค่าที่ระบุใน <code>LocalSettings.php</code> กรุณาแก้ไขการตั้งค่าเหล่านี้และลองอีกครั้ง\n\n$1",
        "config-imagemagick": "พบ ImageMagick: <code>$1</code>\nการย่อรูปภาพจะถูกเปิดใช้งาน ถ้าคุณเปิดใช้งานการอัปโหลด",
        "config-gd": "พบไลบรารีกราฟิก GD ภายใน\nการย่อรูปภาพจะถูกเปิดใช้งาน ถ้าคุณเปิดใช้งานการอัปโหลด",
        "config-no-scaling": "ไม่พบไลบรารี GD หรือ ImageMagick\nการย่อรูปภาพจะถูกปิดใช้งาน",
+       "config-no-uri": "<strong>ข้อผิดพลาด:</strong> ไม่สามารถทำการตรวจสอบ URI ปัจจุบันได้\nการติดตั้งถูกยกเลิกแล้ว",
        "config-using-server": "ใช้ชื่อเซิร์ฟเวอร์ \"<nowiki>$1</nowiki>\"",
        "config-using-uri": "ใช้ยูอาร์แอลของเซิร์ฟเวอร์ \"<nowiki>$1$2</nowiki>\"",
+       "config-db-name": "ชื่อฐานข้อมูล:",
        "config-mysql-innodb": "อินโนดีบี",
        "config-mysql-myisam": "มายไอแซม",
        "config-mysql-binary": "ไบนารี",
index 823b1ba..f7394c8 100644 (file)
@@ -16,7 +16,8 @@
                        "Meelo",
                        "HakanIST",
                        "McAang",
-                       "Elftrkn"
+                       "Elftrkn",
+                       "Vito Genovese"
                ]
        },
        "config-desc": "MediaWiki yükleyicisi",
        "config-ns-conflict": "Belirtilen ad \"<nowiki> $1 </nowiki>\" varsayılan MediaWiki ad alanı ile çakışıyor.\nFarklı proje isim alanı belirtin.",
        "config-admin-box": "Yönetici hesabı",
        "config-admin-name": "Kullanıcı adınız:",
-       "config-admin-password": "Şifre:",
-       "config-admin-password-confirm": "Şifre tekrar:",
+       "config-admin-password": "Parola:",
+       "config-admin-password-confirm": "Yeniden parola:",
        "config-admin-help": "Buraya tercih ettiğiniz kullanıcı adını girin; örneğin \"Joe Bloggs\". Bu vikide oturum açmak için kullanacağınız addır.",
        "config-admin-name-blank": "Bir yönetici kullanıcı adını giriniz.",
        "config-admin-name-invalid": "Belirtilen ad \"<nowiki> $1 </nowiki>\" geçersiz.\nFarklı bir kullanıcı adı belirtin.",
        "config-admin-password-blank": "Yönetici hesabı için bir parola girin.",
-       "config-admin-password-mismatch": "Girdiğiniz şifreler birbirleriyle uyuşmuyor.",
+       "config-admin-password-mismatch": "Girdiğiniz iki parola eşleşmiyor.",
        "config-admin-email": "E-posta adresi:",
        "config-admin-email-help": "Wiki'de diğer kullanıcılardan e-posta almak, parolanızı sıfırlamak ve sizin izlediğiniz sayfalarda yapılan değişikliklerin bildirilmesini sağlamak için e-posta adresinizi girin. Bu alanı boş bırakabilirsiniz.",
        "config-admin-error-user": "Bir yönetici adı ile oluşturma sırasında iç hata \"<nowiki> $1 </nowiki>\".",
index 4ccca97..883b5fa 100644 (file)
@@ -288,7 +288,7 @@ class ClassicInterwikiLookup implements InterwikiLookup {
 
                                $row = $dbr->selectRow(
                                        'interwiki',
-                                       ClassicInterwikiLookup::selectFields(),
+                                       self::selectFields(),
                                        [ 'iw_prefix' => $prefix ],
                                        __METHOD__
                                );
@@ -408,7 +408,7 @@ class ClassicInterwikiLookup implements InterwikiLookup {
                }
 
                $res = $db->select( 'interwiki',
-                       $this->selectFields(),
+                       self::selectFields(),
                        $where, __METHOD__, [ 'ORDER BY' => 'iw_prefix' ]
                );
 
index 020a684..9701dd9 100644 (file)
@@ -21,6 +21,7 @@
  * @defgroup JobQueue JobQueue
  * @author Aaron Schulz
  */
+use MediaWiki\MediaWikiServices;
 
 /**
  * Class to handle enqueueing and running of background jobs
@@ -709,7 +710,7 @@ abstract class JobQueue {
        public static function incrStats( $key, $type, $delta = 1 ) {
                static $stats;
                if ( !$stats ) {
-                       $stats = RequestContext::getMain()->getStats();
+                       $stats = MediaWikiServices::getInstance()->getStatsdDataFactory();
                }
                $stats->updateCount( "jobqueue.{$key}.all", $delta );
                $stats->updateCount( "jobqueue.{$key}.{$type}", $delta );
index 2f58947..540b8c5 100644 (file)
  * @file
  * @author Aaron Schulz
  */
+use Wikimedia\Rdbms\IDatabase;
 use MediaWiki\MediaWikiServices;
 use Wikimedia\ScopedCallback;
+use Wikimedia\Rdbms\DBConnRef;
 
 /**
  * Class to handle job queues stored in the DB
index d76d866..ba80c8e 100644 (file)
@@ -20,6 +20,7 @@
  *
  * @file
  */
+use Wikimedia\Rdbms\IDatabase;
 use MediaWiki\MediaWikiServices;
 
 class PurgeJobUtils {
index b1cece8..bba07e2 100644 (file)
@@ -176,6 +176,12 @@ class CSSMin {
         * @return bool|string
         */
        public static function getMimeType( $file ) {
+               // Infer the MIME-type from the file extension
+               $ext = strtolower( pathinfo( $file, PATHINFO_EXTENSION ) );
+               if ( isset( self::$mimeTypes[$ext] ) ) {
+                       return self::$mimeTypes[$ext];
+               }
+
                $realpath = realpath( $file );
                if (
                        $realpath
@@ -186,12 +192,6 @@ class CSSMin {
                        return finfo_file( finfo_open( FILEINFO_MIME_TYPE ), $realpath );
                }
 
-               // Infer the MIME-type from the file extension
-               $ext = strtolower( pathinfo( $file, PATHINFO_EXTENSION ) );
-               if ( isset( self::$mimeTypes[$ext] ) ) {
-                       return self::$mimeTypes[$ext];
-               }
-
                return false;
        }
 
diff --git a/includes/libs/DnsSrvDiscoverer.php b/includes/libs/DnsSrvDiscoverer.php
new file mode 100644 (file)
index 0000000..ce8a204
--- /dev/null
@@ -0,0 +1,108 @@
+<?php
+/**
+ * Service discovery using DNS SRV records
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * @since 1.29
+ */
+class DnsSrvDiscoverer {
+       /**
+        * @var string
+        */
+       private $domain;
+
+       /**
+        * @param string $domain
+        */
+       public function __construct( $domain ) {
+               $this->domain = $domain;
+       }
+
+       /**
+        * Fetch the servers with a DNS SRV request
+        *
+        * @return array
+        */
+       public function getServers() {
+               $result = [];
+               foreach ( $this->getDnsRecords() as $record ) {
+                       $result[] = [
+                               'target' => $record['target'],
+                               'port' => $record['port'],
+                               'pri' => $record['pri'],
+                               'weight' => $record['weight'],
+                       ];
+               }
+
+               return $result;
+       }
+
+       /**
+        * Pick a server according to the priority fields.
+        * Note that weight is currently ignored.
+        *
+        * @param array $servers from getServers
+        * @return array|bool
+        */
+       public function pickServer( array $servers ) {
+               if ( !$servers ) {
+                       return false;
+               }
+
+               $srvsByPrio = [];
+               foreach ( $servers as $server ) {
+                       $srvsByPrio[$server['pri']][] = $server;
+               }
+
+               $min = min( array_keys( $srvsByPrio ) );
+               if ( count( $srvsByPrio[$min] ) == 1 ) {
+                       return $srvsByPrio[$min][0];
+               } else {
+                       // Choose randomly
+                       $rand = mt_rand( 0, count( $srvsByPrio[$min] ) - 1 );
+
+                       return $srvsByPrio[$min][$rand];
+               }
+       }
+
+       /**
+        * @param array $server
+        * @param array $servers
+        * @return array[]
+        */
+       public function removeServer( $server, array $servers ) {
+               foreach ( $servers as $i => $srv ) {
+                       if ( $srv['target'] === $server['target'] && $srv['port'] === $server['port'] ) {
+                               unset( $servers[$i] );
+                               break;
+                       }
+               }
+
+               return array_values( $servers );
+       }
+
+       /**
+        * @return array[]
+        */
+       protected function getDnsRecords() {
+               return dns_get_record( $this->domain, DNS_SRV );
+       }
+}
index 7cb26c6..039bd42 100644 (file)
@@ -1200,21 +1200,20 @@ abstract class FileBackendStore extends FileBackend {
         * to the order in which the handles where given.
         *
         * @param FileBackendStoreOpHandle[] $fileOpHandles
-        *
-        * @throws FileBackendError
         * @return StatusValue[] Map of StatusValue objects
+        * @throws FileBackendError
         */
        final public function executeOpHandlesInternal( array $fileOpHandles ) {
                $ps = $this->scopedProfileSection( __METHOD__ . "-{$this->name}" );
 
                foreach ( $fileOpHandles as $fileOpHandle ) {
                        if ( !( $fileOpHandle instanceof FileBackendStoreOpHandle ) ) {
-                               throw new InvalidArgumentException( "Got a non-FileBackendStoreOpHandle object." );
+                               throw new InvalidArgumentException( "Expected FileBackendStoreOpHandle object." );
                        } elseif ( $fileOpHandle->backend->getName() !== $this->getName() ) {
-                               throw new InvalidArgumentException(
-                                       "Got a FileBackendStoreOpHandle for the wrong backend." );
+                               throw new InvalidArgumentException( "Expected handle for this file backend." );
                        }
                }
+
                $res = $this->doExecuteOpHandlesInternal( $fileOpHandles );
                foreach ( $fileOpHandles as $fileOpHandle ) {
                        $fileOpHandle->closeResources();
index 631f6fd..ae0ad6f 100644 (file)
@@ -287,7 +287,7 @@ class SwiftFileBackend extends FileBackendStore {
                if ( !empty( $params['async'] ) ) { // deferred
                        $status->value = $opHandle;
                } else { // actually write the object in Swift
-                       $status->merge( current( $this->doExecuteOpHandlesInternal( [ $opHandle ] ) ) );
+                       $status->merge( current( $this->executeOpHandlesInternal( [ $opHandle ] ) ) );
                }
 
                return $status;
@@ -353,7 +353,7 @@ class SwiftFileBackend extends FileBackendStore {
                if ( !empty( $params['async'] ) ) { // deferred
                        $status->value = $opHandle;
                } else { // actually write the object in Swift
-                       $status->merge( current( $this->doExecuteOpHandlesInternal( [ $opHandle ] ) ) );
+                       $status->merge( current( $this->executeOpHandlesInternal( [ $opHandle ] ) ) );
                }
 
                return $status;
@@ -401,7 +401,7 @@ class SwiftFileBackend extends FileBackendStore {
                if ( !empty( $params['async'] ) ) { // deferred
                        $status->value = $opHandle;
                } else { // actually write the object in Swift
-                       $status->merge( current( $this->doExecuteOpHandlesInternal( [ $opHandle ] ) ) );
+                       $status->merge( current( $this->executeOpHandlesInternal( [ $opHandle ] ) ) );
                }
 
                return $status;
@@ -460,7 +460,7 @@ class SwiftFileBackend extends FileBackendStore {
                if ( !empty( $params['async'] ) ) { // deferred
                        $status->value = $opHandle;
                } else { // actually move the object in Swift
-                       $status->merge( current( $this->doExecuteOpHandlesInternal( [ $opHandle ] ) ) );
+                       $status->merge( current( $this->executeOpHandlesInternal( [ $opHandle ] ) ) );
                }
 
                return $status;
@@ -500,7 +500,7 @@ class SwiftFileBackend extends FileBackendStore {
                if ( !empty( $params['async'] ) ) { // deferred
                        $status->value = $opHandle;
                } else { // actually delete the object in Swift
-                       $status->merge( current( $this->doExecuteOpHandlesInternal( [ $opHandle ] ) ) );
+                       $status->merge( current( $this->executeOpHandlesInternal( [ $opHandle ] ) ) );
                }
 
                return $status;
@@ -556,7 +556,7 @@ class SwiftFileBackend extends FileBackendStore {
                if ( !empty( $params['async'] ) ) { // deferred
                        $status->value = $opHandle;
                } else { // actually change the object in Swift
-                       $status->merge( current( $this->doExecuteOpHandlesInternal( [ $opHandle ] ) ) );
+                       $status->merge( current( $this->executeOpHandlesInternal( [ $opHandle ] ) ) );
                }
 
                return $status;
index b17b1a0..8ef8196 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup LockManager
  */
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * Version of LockManager based on using named/row DB locks.
  *
index a89d864..1d2e21a 100644 (file)
@@ -127,6 +127,39 @@ abstract class QuorumLockManager extends LockManager {
         * @return StatusValue
         */
        final protected function doLockingRequestBucket( $bucket, array $pathsByType ) {
+               return $this->collectPledgeQuorum(
+                       $bucket,
+                       function ( $lockSrv ) use ( $pathsByType ) {
+                               return $this->getLocksOnServer( $lockSrv, $pathsByType );
+                       }
+               );
+       }
+
+       /**
+        * Attempt to release locks with the peers for a bucket
+        *
+        * @param int $bucket
+        * @param array $pathsByType Map of LockManager::LOCK_* constants to lists of paths
+        * @return StatusValue
+        */
+       final protected function doUnlockingRequestBucket( $bucket, array $pathsByType ) {
+               return $this->releasePledges(
+                       $bucket,
+                       function ( $lockSrv ) use ( $pathsByType ) {
+                               return $this->freeLocksOnServer( $lockSrv, $pathsByType );
+                       }
+               );
+       }
+
+       /**
+        * Attempt to acquire pledges with the peers for a bucket.
+        * This is all or nothing; if any key is already pledged then this totally fails.
+        *
+        * @param int $bucket
+        * @param callable $callback Pledge method taking a server name and yeilding a StatusValue
+        * @return StatusValue
+        */
+       final protected function collectPledgeQuorum( $bucket, callable $callback ) {
                $status = StatusValue::newGood();
 
                $yesVotes = 0; // locks made on trustable servers
@@ -141,7 +174,7 @@ abstract class QuorumLockManager extends LockManager {
                                continue; // server down?
                        }
                        // Attempt to acquire the lock on this peer
-                       $status->merge( $this->getLocksOnServer( $lockSrv, $pathsByType ) );
+                       $status->merge( $callback( $lockSrv ) );
                        if ( !$status->isOK() ) {
                                return $status; // vetoed; resource locked
                        }
@@ -162,13 +195,13 @@ abstract class QuorumLockManager extends LockManager {
        }
 
        /**
-        * Attempt to release locks with the peers for a bucket
+        * Attempt to release pledges with the peers for a bucket
         *
         * @param int $bucket
-        * @param array $pathsByType Map of LockManager::LOCK_* constants to lists of paths
+        * @param callable $callback Pledge method taking a server name and yeilding a StatusValue
         * @return StatusValue
         */
-       final protected function doUnlockingRequestBucket( $bucket, array $pathsByType ) {
+       final protected function releasePledges( $bucket, callable $callback ) {
                $status = StatusValue::newGood();
 
                $yesVotes = 0; // locks freed on trustable servers
@@ -180,7 +213,7 @@ abstract class QuorumLockManager extends LockManager {
                                $status->warning( 'lockmanager-fail-svr-release', $lockSrv );
                        } else {
                                // Attempt to release the lock on this peer
-                               $status->merge( $this->freeLocksOnServer( $lockSrv, $pathsByType ) );
+                               $status->merge( $callback( $lockSrv ) );
                                ++$yesVotes; // success for this peer
                                // Normally the first peers form the quorum, and the others are ignored.
                                // Ignore them in this case, but not when an alternative quorum was used.
index 7f2bf5e..e48cf62 100644 (file)
@@ -73,19 +73,36 @@ class XmlTypeCheck {
         */
        private $parserOptions = [
                'processing_instruction_handler' => '',
+               'external_dtd_handler' => '',
+               'dtd_handler' => '',
+               'require_safe_dtd' => true
        ];
 
        /**
+        * Allow filtering an XML file.
+        *
+        * Filters should return either true or a string to indicate something
+        * is wrong with the file. $this->filterMatch will store if the
+        * file failed validation (true = failed validation).
+        * $this->filterMatchType will contain the validation error.
+        * $this->wellFormed will contain whether the xml file is well-formed.
+        *
+        * @note If multiple filters are hit, only one of them will have the
+        *  result stored in $this->filterMatchType.
+        *
         * @param string $input a filename or string containing the XML element
         * @param callable $filterCallback (optional)
         *        Function to call to do additional custom validity checks from the
         *        SAX element handler event. This gives you access to the element
         *        namespace, name, attributes, and text contents.
-        *        Filter should return 'true' to toggle on $this->filterMatch
+        *        Filter should return a truthy value describing the error.
         * @param bool $isFile (optional) indicates if the first parameter is a
         *        filename (default, true) or if it is a string (false)
         * @param array $options list of additional parsing options:
         *        processing_instruction_handler: Callback for xml_set_processing_instruction_handler
+        *        external_dtd_handler: Callback for the url of external dtd subset
+        *        dtd_handler: Callback given the full text of the <!DOCTYPE declaration.
+        *        require_safe_dtd: Only allow non-recursive entities in internal dtd (default true)
         */
        function __construct( $input, $filterCallback = null, $isFile = true, $options = [] ) {
                $this->filterCallback = $filterCallback;
@@ -186,6 +203,9 @@ class XmlTypeCheck {
                        if ( $reader->nodeType === XMLReader::PI ) {
                                $this->processingInstructionHandler( $reader->name, $reader->value );
                        }
+                       if ( $reader->nodeType === XMLReader::DOC_TYPE ) {
+                               $this->DTDHandler( $reader );
+                       }
                } while ( $reader->nodeType != XMLReader::ELEMENT );
 
                // Process the rest of the document
@@ -234,8 +254,13 @@ class XmlTypeCheck {
                                                $reader->value
                                        );
                                        break;
+                               case XMLReader::DOC_TYPE:
+                                       // We should never see a doctype after first
+                                       // element.
+                                       $this->wellFormed = false;
+                                       break;
                                default:
-                                       // One of DOC, DOC_TYPE, ENTITY, END_ENTITY,
+                                       // One of DOC, ENTITY, END_ENTITY,
                                        // NOTATION, or XML_DECLARATION
                                        // xml_parse didn't send these to the filter, so we won't.
                        }
@@ -339,4 +364,140 @@ class XmlTypeCheck {
                        $this->filterMatchType = $callbackReturn;
                }
        }
+       /**
+        * Handle coming across a <!DOCTYPE declaration.
+        *
+        * @param XMLReader $reader Reader currently pointing at DOCTYPE node.
+        */
+       private function DTDHandler( XMLReader $reader ) {
+               $externalCallback = $this->parserOptions['external_dtd_handler'];
+               $generalCallback = $this->parserOptions['dtd_handler'];
+               $checkIfSafe = $this->parserOptions['require_safe_dtd'];
+               if ( !$externalCallback && !$generalCallback && !$checkIfSafe ) {
+                       return;
+               }
+               $dtd = $reader->readOuterXML();
+               $callbackReturn = false;
+
+               if ( $generalCallback ) {
+                       $callbackReturn = call_user_func( $generalCallback, $dtd );
+               }
+               if ( $callbackReturn ) {
+                       // Filter hit!
+                       $this->filterMatch = true;
+                       $this->filterMatchType = $callbackReturn;
+                       $callbackReturn = false;
+               }
+
+               $parsedDTD = $this->parseDTD( $dtd );
+               if ( $externalCallback && isset( $parsedDTD['type'] ) ) {
+                       $callbackReturn = call_user_func(
+                               $externalCallback,
+                               $parsedDTD['type'],
+                               isset( $parsedDTD['publicid'] ) ? $parsedDTD['publicid'] : null,
+                               isset( $parsedDTD['systemid'] ) ? $parsedDTD['systemid'] : null
+                       );
+               }
+               if ( $callbackReturn ) {
+                       // Filter hit!
+                       $this->filterMatch = true;
+                       $this->filterMatchType = $callbackReturn;
+                       $callbackReturn = false;
+               }
+
+               if ( $checkIfSafe && isset( $parsedDTD['internal'] ) ) {
+                       if ( !$this->checkDTDIsSafe( $parsedDTD['internal'] ) ) {
+                               $this->wellFormed = false;
+                       }
+               }
+       }
+
+       /**
+        * Check if the internal subset of the DTD is safe.
+        *
+        * We whitelist an extremely restricted subset of DTD features.
+        *
+        * Safe is defined as:
+        *  * Only contains entity defintions (e.g. No <!ATLIST )
+        *  * Entity definitions are not "system" entities
+        *  * Entity definitions are not "parameter" (i.e. %) entities
+        *  * Entity definitions do not reference other entites except &amp;
+        *    and quotes. Entity aliases (where the entity contains only
+        *    another entity are allowed)
+        *  * Entity references aren't overly long (>255 bytes).
+        *  * <!ATTLIST svg xmlns:xlink CDATA #FIXED "http://www.w3.org/1999/xlink">
+        *    allowed if matched exactly for compatibility with graphviz
+        *  * Comments.
+        *
+        * @param string $internalSubset The internal subset of the DTD
+        * @return bool true if safe.
+        */
+       private function checkDTDIsSafe( $internalSubset ) {
+               $offset = 0;
+               $res = preg_match(
+                       '/^(?:\s*<!ENTITY\s+\S+\s+' .
+                               '(?:"(?:&[^"%&;]{1,64};|(?:[^"%&]|&amp;|&quot;){0,255})"' .
+                               '|\'(?:&[^"%&;]{1,64};|(?:[^\'%&]|&amp;|&apos;){0,255})\')\s*>' .
+                               '|\s*<!--(?:[^-]|-[^-])*-->' .
+                               '|\s*<!ATTLIST svg xmlns:xlink CDATA #FIXED ' .
+                               '"http:\/\/www.w3.org\/1999\/xlink">)*\s*$/',
+                       $internalSubset
+               );
+
+               return (bool)$res;
+       }
+
+       /**
+        * Parse DTD into parts.
+        *
+        * If there is an error parsing the dtd, sets wellFormed to false.
+        *
+        * @param $dtd string
+        * @return array Possibly containing keys publicid, systemid, type and internal.
+        */
+       private function parseDTD( $dtd ) {
+               $m = [];
+               $res = preg_match(
+                       '/^<!DOCTYPE\s*\S+\s*' .
+                       '(?:(?P<typepublic>PUBLIC)\s*' .
+                               '(?:"(?P<pubquote>[^"]*)"|\'(?P<pubapos>[^\']*)\')' . // public identifer
+                               '\s*"(?P<pubsysquote>[^"]*)"|\'(?P<pubsysapos>[^\']*)\'' . // system identifier
+                       '|(?P<typesystem>SYSTEM)\s*' .
+                               '(?:"(?P<sysquote>[^"]*)"|\'(?P<sysapos>[^\']*)\')' .
+                       ')?\s*' .
+                       '(?:\[\s*(?P<internal>.*)\])?\s*>$/s',
+                       $dtd,
+                       $m
+               );
+               if ( !$res ) {
+                       $this->wellFormed = false;
+                       return [];
+               }
+               $parsed = [];
+               foreach ( $m as $field => $value ) {
+                       if ( $value === '' || is_numeric( $field ) ) {
+                               continue;
+                       }
+                       switch ( $field ) {
+                       case 'typepublic':
+                       case 'typesystem':
+                               $parsed['type'] = $value;
+                               break;
+                       case 'pubquote':
+                       case 'pubapos':
+                               $parsed['publicid'] = $value;
+                               break;
+                       case 'pubsysquote':
+                       case 'pubsysapos':
+                       case 'sysquote':
+                       case 'sysapos':
+                               $parsed['systemid'] = $value;
+                               break;
+                       case 'internal':
+                               $parsed['internal'] = $value;
+                               break;
+                       }
+               }
+               return $parsed;
+       }
 }
index 74bf4b5..c85a82e 100644 (file)
@@ -81,6 +81,22 @@ class CachedBagOStuff extends HashBagOStuff {
                $this->backend->setDebug( $bool );
        }
 
+       public function deleteObjectsExpiringBefore( $date, $progressCallback = false ) {
+               parent::deleteObjectsExpiringBefore( $date, $progressCallback );
+               return $this->backend->deleteObjectsExpiringBefore( $date, $progressCallback );
+       }
+
+       public function makeKey() {
+               return call_user_func_array( [ $this->backend, __FUNCTION__ ], func_get_args() );
+       }
+
+       public function makeGlobalKey() {
+               return call_user_func_array( [ $this->backend, __FUNCTION__ ], func_get_args() );
+       }
+
+       // These just call the backend (tested elsewhere)
+       // @codeCoverageIgnoreStart
+
        public function lock( $key, $timeout = 6, $expiry = 6, $rclass = '' ) {
                return $this->backend->lock( $key, $timeout, $expiry, $rclass );
        }
@@ -89,21 +105,17 @@ class CachedBagOStuff extends HashBagOStuff {
                return $this->backend->unlock( $key );
        }
 
-       public function deleteObjectsExpiringBefore( $date, $progressCallback = false ) {
-               parent::deleteObjectsExpiringBefore( $date, $progressCallback );
-               return $this->backend->deleteObjectsExpiringBefore( $date, $progressCallback );
-       }
-
        public function getLastError() {
                return $this->backend->getLastError();
        }
 
        public function clearLastError() {
-               $this->backend->clearLastError();
+               return $this->backend->clearLastError();
        }
 
        public function modifySimpleRelayEvent( array $event ) {
                return $this->backend->modifySimpleRelayEvent( $event );
        }
 
+       // @codeCoverageIgnoreEnd
 }
index fc00965..49b2fe6 100644 (file)
@@ -3,8 +3,6 @@
 namespace Wikimedia\Rdbms;
 
 use Database;
-use DBConnRef;
-use IDatabase;
 use InvalidArgumentException;
 
 /**
index fc3ebe0..0d5fbf5 100644 (file)
@@ -1,8 +1,9 @@
 <?php
 
-use Wikimedia\Rdbms\DatabaseDomain;
-use Wikimedia\Rdbms\ILoadBalancer;
-use Wikimedia\Rdbms\DBMasterPos;
+namespace Wikimedia\Rdbms;
+
+use Database;
+use InvalidArgumentException;
 
 /**
  * Helper class to handle automatically marking connections as reusable (via RAII pattern)
@@ -603,3 +604,5 @@ class DBConnRef implements IDatabase {
                }
        }
 }
+
+class_alias( 'Wikimedia\Rdbms\DBConnRef', 'DBConnRef' );
index 90e60a3..40bcc1b 100644 (file)
@@ -33,6 +33,8 @@ use Wikimedia\Rdbms\ResultWrapper;
 use Wikimedia\Rdbms\DBMasterPos;
 use Wikimedia\Rdbms\Blob;
 use Wikimedia\Timestamp\ConvertibleTimestamp;
+use Wikimedia\Rdbms\IDatabase;
+use Wikimedia\Rdbms\IMaintainableDatabase;
 
 /**
  * Relational database abstraction object
@@ -366,7 +368,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                }
 
                $class = 'Database' . ucfirst( $driver );
-               if ( class_exists( $class ) && is_subclass_of( $class, 'IDatabase' ) ) {
+               if ( class_exists( $class ) && is_subclass_of( $class, IDatabase::class ) ) {
                        // Resolve some defaults for b/c
                        $p['host'] = isset( $p['host'] ) ? $p['host'] : false;
                        $p['user'] = isset( $p['user'] ) ? $p['user'] : false;
@@ -1542,7 +1544,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                        $sql .= " WHERE " . $this->makeList( $conds, self::LIST_AND );
                }
 
-               return $this->query( $sql, $fname );
+               return (bool)$this->query( $sql, $fname );
        }
 
        public function makeList( $a, $mode = self::LIST_COMMA ) {
@@ -1949,7 +1951,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
        }
 
        /**
-        * Get the name of an index in a given table.
+        * Allows for index remapping in queries where this is not consistent across DBMS
         *
         * @param string $index
         * @return string
@@ -3293,26 +3295,37 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                return false;
        }
 
-       /**
-        * Lock specific tables
-        *
-        * @param array $read Array of tables to lock for read access
-        * @param array $write Array of tables to lock for write access
-        * @param string $method Name of caller
-        * @param bool $lowPriority Whether to indicate writes to be LOW PRIORITY
-        * @return bool
-        */
-       public function lockTables( $read, $write, $method, $lowPriority = true ) {
+       public function tableLocksHaveTransactionScope() {
                return true;
        }
 
-       /**
-        * Unlock specific tables
-        *
-        * @param string $method The caller
-        * @return bool
-        */
-       public function unlockTables( $method ) {
+       final public function lockTables( array $read, array $write, $method ) {
+               if ( $this->writesOrCallbacksPending() ) {
+                       throw new DBUnexpectedError( $this, "Transaction writes or callbacks still pending." );
+               }
+
+               if ( $this->tableLocksHaveTransactionScope() ) {
+                       $this->startAtomic( $method );
+               }
+
+               return $this->doLockTables( $read, $write, $method );
+       }
+
+       protected function doLockTables( array $read, array $write, $method ) {
+               return true;
+       }
+
+       final public function unlockTables( $method ) {
+               if ( $this->tableLocksHaveTransactionScope() ) {
+                       $this->endAtomic( $method );
+
+                       return true; // locks released on COMMIT/ROLLBACK
+               }
+
+               return $this->doUnlockTables( $method );
+       }
+
+       protected function doUnlockTables( $method ) {
                return true;
        }
 
index e900027..e2b5226 100644 (file)
@@ -1054,36 +1054,26 @@ abstract class DatabaseMysqlBase extends Database {
                return true;
        }
 
-       /**
-        * @param array $read
-        * @param array $write
-        * @param string $method
-        * @param bool $lowPriority
-        * @return bool
-        */
-       public function lockTables( $read, $write, $method, $lowPriority = true ) {
-               $items = [];
+       public function tableLocksHaveTransactionScope() {
+               return false; // tied to TCP connection
+       }
 
+       protected function doLockTables( array $read, array $write, $method ) {
+               $items = [];
                foreach ( $write as $table ) {
-                       $tbl = $this->tableName( $table ) .
-                               ( $lowPriority ? ' LOW_PRIORITY' : '' ) .
-                               ' WRITE';
-                       $items[] = $tbl;
+                       $items[] = $this->tableName( $table ) . ' WRITE';
                }
                foreach ( $read as $table ) {
                        $items[] = $this->tableName( $table ) . ' READ';
                }
+
                $sql = "LOCK TABLES " . implode( ',', $items );
                $this->query( $sql, $method );
 
                return true;
        }
 
-       /**
-        * @param string $method
-        * @return bool
-        */
-       public function unlockTables( $method ) {
+       protected function doUnlockTables( $method ) {
                $this->query( "UNLOCK TABLES", $method );
 
                return true;
@@ -1335,4 +1325,38 @@ abstract class DatabaseMysqlBase extends Database {
        public function isView( $name, $prefix = null ) {
                return in_array( $name, $this->listViews( $prefix ) );
        }
+
+       /**
+        * Allows for index remapping in queries where this is not consistent across DBMS
+        *
+        * @param string $index
+        * @return string
+        */
+       protected function indexName( $index ) {
+               /**
+                * When SQLite indexes were introduced in r45764, it was noted that
+                * SQLite requires index names to be unique within the whole database,
+                * not just within a schema. As discussed in CR r45819, to avoid the
+                * need for a schema change on existing installations, the indexes
+                * were implicitly mapped from the new names to the old names.
+                *
+                * This mapping can be removed if DB patches are introduced to alter
+                * the relevant tables in existing installations. Note that because
+                * this index mapping applies to table creation, even new installations
+                * of MySQL have the old names (except for installations created during
+                * a period where this mapping was inappropriately removed, see
+                * T154872).
+                */
+               $renamed = [
+                       'ar_usertext_timestamp' => 'usertext_timestamp',
+                       'un_user_id' => 'user_id',
+                       'un_user_ip' => 'user_ip',
+               ];
+
+               if ( isset( $renamed[$index] ) ) {
+                       return $renamed[$index];
+               } else {
+                       return $index;
+               }
+       }
 }
index af9716d..5bcd4a8 100644 (file)
@@ -1305,6 +1305,33 @@ SQL;
                return parent::streamStatementEnd( $sql, $newLine );
        }
 
+       public function doLockTables( array $read, array $write, $method ) {
+               $tablesWrite = [];
+               foreach ( $write as $table ) {
+                       $tablesWrite[] = $this->tableName( $table );
+               }
+               $tablesRead = [];
+               foreach ( $read as $table ) {
+                       $tablesRead[] = $this->tableName( $table );
+               }
+
+               // Acquire locks for the duration of the current transaction...
+               if ( $tablesWrite ) {
+                       $this->query(
+                               'LOCK TABLE ONLY ' . implode( ',', $tablesWrite ) . ' IN EXCLUSIVE MODE',
+                               $method
+                       );
+               }
+               if ( $tablesRead ) {
+                       $this->query(
+                               'LOCK TABLE ONLY ' . implode( ',', $tablesRead ) . ' IN SHARE MODE',
+                               $method
+                       );
+               }
+
+               return true;
+       }
+
        public function lockIsFree( $lockName, $method ) {
                // http://www.postgresql.org/docs/8.2/static/functions-admin.html#FUNCTIONS-ADVISORY-LOCKS
                $key = $this->addQuotes( $this->bigintFromLockName( $lockName ) );
index 6bc870b..0b146cd 100644 (file)
  * @file
  * @ingroup Database
  */
+namespace Wikimedia\Rdbms;
+
 use Wikimedia\ScopedCallback;
-use Wikimedia\Rdbms\Blob;
-use Wikimedia\Rdbms\LikeMatch;
-use Wikimedia\Rdbms\DBMasterPos;
-use Wikimedia\Rdbms\Field;
-use Wikimedia\Rdbms\IResultWrapper;
+use DBError;
+use DBConnectionError;
+use DBUnexpectedError;
+use DBQueryError;
+use Exception;
+use RuntimeException;
+use UnexpectedValueException;
+use stdClass;
 
 /**
  * Basic database interface for live and lazy-loaded relation database handles
@@ -1802,3 +1807,5 @@ interface IDatabase {
         */
        public function setTableAliases( array $aliases );
 }
+
+class_alias( 'Wikimedia\Rdbms\IDatabase', 'IDatabase' );
index 43cec28..b984c42 100644 (file)
  * @file
  * @ingroup Database
  */
+namespace Wikimedia\Rdbms;
+
+use Exception;
+use RuntimeException;
+use DBUnexpectedError;
 
 /**
  * Advanced database interface for IDatabase handles that include maintenance methods
@@ -205,4 +210,73 @@ interface IMaintainableDatabase extends IDatabase {
        public function duplicateTableStructure(
                $oldName, $newName, $temporary = false, $fname = __METHOD__
        );
+
+       /**
+        * Checks if table locks acquired by lockTables() are transaction-bound in their scope
+        *
+        * Transaction-bound table locks will be released when the current transaction terminates.
+        * Table locks that are not bound to a transaction are not effected by BEGIN/COMMIT/ROLLBACK
+        * and will last until either lockTables()/unlockTables() is called or the TCP connection to
+        * the database is closed.
+        *
+        * @return bool
+        * @since 1.29
+        */
+       public function tableLocksHaveTransactionScope();
+
+       /**
+        * Lock specific tables
+        *
+        * Any pending transaction should be resolved before calling this method, since:
+        *   a) Doing so resets any REPEATABLE-READ snapshot of the data to a fresh one.
+        *   b) Previous row and table locks from the transaction or session may be released
+        *      by LOCK TABLES, which may be unsafe for the changes in such a transaction.
+        *   c) The main use case of lockTables() is to avoid deadlocks and timeouts by locking
+        *      entire tables in order to do long-running, batched, and lag-aware, updates. Batching
+        *      and replication lag checks do not work when all the updates happen in a transaction.
+        *
+        * Always get all relevant table locks up-front in one call, since LOCK TABLES might release
+        * any prior table locks on some RDBMes (e.g MySQL).
+        *
+        * For compatibility, callers should check tableLocksHaveTransactionScope() before using
+        * this method. If locks are scoped specifically to transactions then caller must either:
+        *   - a) Start a new transaction and acquire table locks for the scope of that transaction,
+        *        doing all row updates within that transaction. It will not be possible to update
+        *        rows in batches; this might result in high replication lag.
+        *   - b) Forgo table locks entirely and avoid calling this method. Careful use of hints like
+        *        LOCK IN SHARE MODE and FOR UPDATE and the use of query batching may be preferrable
+        *        to using table locks with a potentially large transaction. Use of MySQL and Postges
+        *        style REPEATABLE-READ (Snapshot Isolation with or without First-Committer-Rule) can
+        *        also be considered for certain tasks that require a consistent view of entire tables.
+        *
+        * If session scoped locks are not supported, then calling lockTables() will trigger
+        * startAtomic(), with unlockTables() triggering endAtomic(). This will automatically
+        * start a transaction if one is not already present and cause the locks to be released
+        * when the transaction finishes (normally during the unlockTables() call).
+        *
+        * In any case, avoid using begin()/commit() in code that runs while such table locks are
+        * acquired, as that breaks in case when a transaction is needed. The startAtomic() and
+        * endAtomic() methods are safe, however, since they will join any existing transaction.
+        *
+        * @param array $read Array of tables to lock for read access
+        * @param array $write Array of tables to lock for write access
+        * @param string $method Name of caller
+        * @return bool
+        * @since 1.29
+        */
+       public function lockTables( array $read, array $write, $method );
+
+       /**
+        * Unlock all tables locked via lockTables()
+        *
+        * If table locks are scoped to transactions, then locks might not be released until the
+        * transaction ends, which could happen after this method is called.
+        *
+        * @param string $method The caller
+        * @return bool
+        * @since 1.29
+        */
+       public function unlockTables( $method );
 }
+
+class_alias( 'Wikimedia\Rdbms\IMaintainableDatabase', 'IMaintainableDatabase' );
index fa3ddf9..8238f3e 100644 (file)
@@ -1,4 +1,7 @@
 <?php
+
+namespace Wikimedia\Rdbms;
+
 /**
  * Helper class to handle automatically marking connections as reusable (via RAII pattern)
  * as well handling deferring the actual network connection until the handle is used
@@ -65,4 +68,18 @@ class MaintainableDBConnRef extends DBConnRef implements IMaintainableDatabase {
        ) {
                return $this->__call( __FUNCTION__, func_get_args() );
        }
+
+       public function tableLocksHaveTransactionScope() {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function lockTables( array $read, array $write, $method ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
+       public function unlockTables( $method ) {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
 }
+
+class_alias( 'Wikimedia\Rdbms\MaintainableDBConnRef', 'MaintainableDBConnRef' );
index c3367e7..cbc8ca3 100644 (file)
@@ -1,6 +1,7 @@
 <?php
 
 use Wikimedia\Rdbms\ILoadBalancer;
+use Wikimedia\Rdbms\IDatabase;
 
 /**@{
  * Database related constants
index 47f8c96..dca1302 100644 (file)
@@ -18,6 +18,7 @@
  * @file
  * @ingroup Database
  */
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * @ingroup Database
index 526596d..226c675 100644 (file)
@@ -18,6 +18,7 @@
  * @file
  * @ingroup Database
  */
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * Database error base class
index 7d303b1..57538a8 100644 (file)
@@ -18,6 +18,7 @@
  * @file
  * @ingroup Database
  */
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * Base class for the more common types of database errors. These are known to occur
index 002d253..b4c3d52 100644 (file)
@@ -18,6 +18,7 @@
  * @file
  * @ingroup Database
  */
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * @ingroup Database
index f05dabc..86547b9 100644 (file)
@@ -30,7 +30,6 @@ use EmptyBagOStuff;
 use WANObjectCache;
 use Exception;
 use RuntimeException;
-use IDatabase;
 use DBTransactionError;
 use DBReplicationWaitError;
 
@@ -508,7 +507,8 @@ abstract class LBFactory implements ILBFactory {
                        'errorLogger' => $this->errorLogger,
                        'hostname' => $this->hostname,
                        'cliMode' => $this->cliMode,
-                       'agent' => $this->agent
+                       'agent' => $this->agent,
+                       'chronologyProtector' => $this->getChronologyProtector()
                ];
        }
 
index 447b96f..0384588 100644 (file)
@@ -23,7 +23,6 @@
 
 namespace Wikimedia\Rdbms;
 
-use IDatabase;
 use InvalidArgumentException;
 
 /**
@@ -252,9 +251,7 @@ class LBFactoryMulti extends LBFactory {
        public function getMainLB( $domain = false ) {
                $section = $this->getSectionForDomain( $domain );
                if ( !isset( $this->mainLBs[$section] ) ) {
-                       $lb = $this->newMainLB( $domain );
-                       $this->getChronologyProtector()->initLB( $lb );
-                       $this->mainLBs[$section] = $lb;
+                       $this->mainLBs[$section] = $this->newMainLB( $domain );
                }
 
                return $this->mainLBs[$section];
@@ -283,7 +280,6 @@ class LBFactoryMulti extends LBFactory {
        public function getExternalLB( $cluster ) {
                if ( !isset( $this->extLBs[$cluster] ) ) {
                        $this->extLBs[$cluster] = $this->newExternalLB( $cluster );
-                       $this->getChronologyProtector()->initLB( $this->extLBs[$cluster] );
                }
 
                return $this->extLBs[$cluster];
index 15cd508..df0a806 100644 (file)
@@ -89,7 +89,6 @@ class LBFactorySimple extends LBFactory {
        public function getMainLB( $domain = false ) {
                if ( !isset( $this->mainLB ) ) {
                        $this->mainLB = $this->newMainLB( $domain );
-                       $this->getChronologyProtector()->initLB( $this->mainLB );
                }
 
                return $this->mainLB;
@@ -106,7 +105,6 @@ class LBFactorySimple extends LBFactory {
        public function getExternalLB( $cluster ) {
                if ( !isset( $this->extLBs[$cluster] ) ) {
                        $this->extLBs[$cluster] = $this->newExternalLB( $cluster );
-                       $this->getChronologyProtector()->initLB( $this->extLBs[$cluster] );
                }
 
                return $this->extLBs[$cluster];
index 5931d80..cd998c3 100644 (file)
@@ -23,7 +23,6 @@
 
 namespace Wikimedia\Rdbms;
 
-use IDatabase;
 use InvalidArgumentException;
 use BadMethodCallException;
 
index 4c277ff..2ea0e4e 100644 (file)
  */
 namespace Wikimedia\Rdbms;
 
-use IDatabase;
 use Database;
-use DBConnRef;
-use MaintainableDBConnRef;
 use DBError;
 use DBAccessError;
 use DBTransactionError;
@@ -105,6 +102,7 @@ interface ILoadBalancer {
         *  - srvCache : BagOStuff object for server cache [optional]
         *  - memCache : BagOStuff object for cluster memory cache [optional]
         *  - wanCache : WANObjectCache object [optional]
+        *  - chronologyProtector: ChronologyProtector object [optional]
         *  - hostname : The name of the current server [optional]
         *  - cliMode: Whether the execution context is a CLI script. [optional]
         *  - profiler : Class name or instance with profileIn()/profileOut() methods. [optional]
@@ -138,7 +136,7 @@ interface ILoadBalancer {
         * If a DB_REPLICA connection has been opened already, then wait immediately.
         * Otherwise sets a variable telling it to wait if such a connection is opened.
         *
-        * @param DBMasterPos $pos
+        * @param DBMasterPos|bool $pos Master position or false
         */
        public function waitFor( $pos );
 
@@ -147,7 +145,7 @@ interface ILoadBalancer {
         *
         * This can be used a faster proxy for waitForAll()
         *
-        * @param DBMasterPos $pos
+        * @param DBMasterPos|bool $pos Master position or false
         * @param int $timeout Max seconds to wait; default is mWaitTimeout
         * @return bool Success (able to connect and no timeouts reached)
         */
@@ -156,7 +154,7 @@ interface ILoadBalancer {
        /**
         * Set the master wait position and wait for ALL replica DBs to catch up to it
         *
-        * @param DBMasterPos $pos
+        * @param DBMasterPos|bool $pos Master position or false
         * @param int $timeout Max seconds to wait; default is mWaitTimeout
         * @return bool Success (able to connect and no timeouts reached)
         */
index 6878712..d178657 100644 (file)
@@ -25,10 +25,7 @@ namespace Wikimedia\Rdbms;
 use Psr\Log\LoggerInterface;
 use Psr\Log\NullLogger;
 use Wikimedia\ScopedCallback;
-use IDatabase;
 use Database;
-use DBConnRef;
-use MaintainableDBConnRef;
 use BagOStuff;
 use EmptyBagOStuff;
 use WANObjectCache;
@@ -69,6 +66,8 @@ class LoadBalancer implements ILoadBalancer {
 
        /** @var ILoadMonitor */
        private $loadMonitor;
+       /** @var ChronologyProtector|null */
+       private $chronProt;
        /** @var BagOStuff */
        private $srvCache;
        /** @var BagOStuff */
@@ -124,6 +123,8 @@ class LoadBalancer implements ILoadBalancer {
 
        /** @var boolean */
        private $disabled = false;
+       /** @var boolean */
+       private $chronProtInitialized = false;
 
        /** @var integer Warn when this many connection are held */
        const CONN_HELD_WARN_THRESHOLD = 10;
@@ -222,6 +223,10 @@ class LoadBalancer implements ILoadBalancer {
                        : ( gethostname() ?: 'unknown' );
                $this->cliMode = isset( $params['cliMode'] ) ? $params['cliMode'] : PHP_SAPI === 'cli';
                $this->agent = isset( $params['agent'] ) ? $params['agent'] : '';
+
+               if ( isset( $params['chronologyProtector'] ) ) {
+                       $this->chronProt = $params['chronologyProtector'];
+               }
        }
 
        /**
@@ -424,21 +429,24 @@ class LoadBalancer implements ILoadBalancer {
                return $i;
        }
 
-       /**
-        * @param DBMasterPos|false $pos
-        */
        public function waitFor( $pos ) {
+               $oldPos = $this->mWaitForPos;
                $this->mWaitForPos = $pos;
-               $i = $this->mReadIndex;
 
+               // If a generic reader connection was already established, then wait now
+               $i = $this->mReadIndex;
                if ( $i > 0 ) {
                        if ( !$this->doWait( $i ) ) {
                                $this->laggedReplicaMode = true;
                        }
                }
+
+               // Restore the older position if it was higher
+               $this->setWaitForPositionIfHigher( $oldPos );
        }
 
        public function waitForOne( $pos, $timeout = null ) {
+               $oldPos = $this->mWaitForPos;
                $this->mWaitForPos = $pos;
 
                $i = $this->mReadIndex;
@@ -456,10 +464,14 @@ class LoadBalancer implements ILoadBalancer {
                        $ok = true; // no applicable loads
                }
 
+               // Restore the older position if it was higher
+               $this->setWaitForPositionIfHigher( $oldPos );
+
                return $ok;
        }
 
        public function waitForAll( $pos, $timeout = null ) {
+               $oldPos = $this->mWaitForPos;
                $this->mWaitForPos = $pos;
                $serverCount = count( $this->mServers );
 
@@ -470,9 +482,25 @@ class LoadBalancer implements ILoadBalancer {
                        }
                }
 
+               // Restore the older position if it was higher
+               $this->setWaitForPositionIfHigher( $oldPos );
+
                return $ok;
        }
 
+       /**
+        * @param DBMasterPos|bool $pos
+        */
+       private function setWaitForPositionIfHigher( $pos ) {
+               if ( !$pos ) {
+                       return;
+               }
+
+               if ( !$this->mWaitForPos || $pos->hasReached( $this->mWaitForPos ) ) {
+                       $this->mWaitForPos = $pos;
+               }
+       }
+
        /**
         * @param int $i
         * @return IDatabase|bool
@@ -718,6 +746,13 @@ class LoadBalancer implements ILoadBalancer {
                        $domain = false; // local connection requested
                }
 
+               if ( !$this->chronProtInitialized && $this->chronProt ) {
+                       $this->connLogger->debug( __METHOD__ . ': calling initLB() before first connection.' );
+                       // Load CP positions before connecting so that doWait() triggers later if needed
+                       $this->chronProtInitialized = true;
+                       $this->chronProt->initLB( $this );
+               }
+
                if ( $domain !== false ) {
                        $conn = $this->openForeignConnection( $i, $domain );
                } elseif ( isset( $this->mConns['local'][$i][0] ) ) {
index 5e92c33..d120b6f 100644 (file)
@@ -24,7 +24,6 @@ namespace Wikimedia\Rdbms;
 use Psr\Log\LoggerInterface;
 use Psr\Log\NullLogger;
 use Wikimedia\ScopedCallback;
-use IDatabase;
 use BagOStuff;
 
 /**
index 05973df..ceb0052 100644 (file)
@@ -39,6 +39,12 @@ class DeleteLogFormatter extends LogFormatter {
                                // logentry-suppress-event-legacy, logentry-suppress-revision-legacy
                                return "$key-legacy";
                        }
+               } elseif ( $this->entry->getSubtype() === 'restore' ) {
+                       $rawParams = $this->entry->getParameters();
+                       if ( !isset( $rawParams[':assoc:count'] ) ) {
+                               // Message: logentry-delete-restore-nocount
+                               return $key . '-nocount';
+                       }
                }
 
                return $key;
@@ -97,6 +103,19 @@ class DeleteLogFormatter extends LogFormatter {
                                $this->parsedParametersDeleteLog = array_slice( $params, 0, 3 );
                                return $this->parsedParametersDeleteLog;
                        }
+               } elseif ( $subtype === 'restore' ) {
+                       $rawParams = $this->entry->getParameters();
+                       if ( isset( $rawParams[':assoc:count'] ) ) {
+                               $countList = [];
+                               foreach ( $rawParams[':assoc:count'] as $type => $count ) {
+                                       if ( $count ) {
+                                               // Messages: restore-count-revisions, restore-count-files
+                                               $countList[] = $this->context->msg( 'restore-count-' . $type )
+                                                       ->numParams( $count )->plain();
+                                       }
+                               }
+                               $params[3] = $this->context->getLanguage()->listToText( $countList );
+                       }
                }
 
                $this->parsedParametersDeleteLog = $params;
@@ -276,6 +295,11 @@ class DeleteLogFormatter extends LogFormatter {
                                $params[':assoc:old'][$key] = (bool)( $old & $bit );
                                $params[':assoc:new'][$key] = (bool)( $new & $bit );
                        }
+               } elseif ( $subtype === 'restore' ) {
+                       $rawParams = $entry->getParameters();
+                       if ( isset( $rawParams[':assoc:count'] ) ) {
+                               $params[':assoc:count'] = $rawParams[':assoc:count'];
+                       }
                }
 
                return $params;
index c9f1345..1c5899b 100644 (file)
@@ -28,6 +28,8 @@
  * @since 1.19
  */
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * Interface for log entries. Every log entry has these methods.
  *
index 4382910..317652a 100644 (file)
@@ -24,6 +24,7 @@
  */
 
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\IDatabase;
 
 class LogEventsList extends ContextSource {
        const NO_ACTION_LINK = 1;
index f93b1b5..b7ebfc9 100644 (file)
@@ -97,7 +97,7 @@ class IPTC {
                                case '2#025': /* keywords */
                                        $data['Keywords'] = self::convIPTC( $val, $c );
                                        break;
-                               case '2#101': /* Country (shown)*/
+                               case '2#101': /* Country (shown) */
                                        $data['CountryDest'] = self::convIPTC( $val, $c );
                                        break;
                                case '2#095': /* state/province (shown) */
@@ -115,7 +115,7 @@ class IPTC {
                                case '2#040': /* special instructions */
                                        $data['SpecialInstructions'] = self::convIPTC( $val, $c );
                                        break;
-                               case '2#105': /* headline*/
+                               case '2#105': /* headline */
                                        $data['Headline'] = self::convIPTC( $val, $c );
                                        break;
                                case '2#110': /* credit */
index cf9033b..3370e5b 100644 (file)
@@ -246,8 +246,14 @@ class ObjectCache {
                global $wgMainCacheType, $wgMessageCacheType, $wgParserCacheType;
                $candidates = [ $wgMainCacheType, $wgMessageCacheType, $wgParserCacheType ];
                foreach ( $candidates as $candidate ) {
+                       $cache = false;
                        if ( $candidate !== CACHE_NONE && $candidate !== CACHE_ANYTHING ) {
-                               return self::getInstance( $candidate );
+                               $cache = self::getInstance( $candidate );
+                               // CACHE_ACCEL might default to nothing if no APCu
+                               // See includes/ServiceWiring.php
+                               if ( !( $cache instanceof EmptyBagOStuff ) ) {
+                                       return $cache;
+                               }
                        }
                }
 
index 07581d7..8f94374 100644 (file)
@@ -21,6 +21,7 @@
  * @ingroup Cache
  */
 
+use Wikimedia\Rdbms\IDatabase;
 use \MediaWiki\MediaWikiServices;
 use \Wikimedia\WaitConditionLoop;
 use \Wikimedia\Rdbms\TransactionProfiler;
index e7a906d..ee0ff22 100644 (file)
@@ -19,6 +19,7 @@
  *
  * @file
  */
+use MediaWiki\MediaWikiServices;
 
 /**
  * Class for viewing MediaWiki article and history.
@@ -494,7 +495,7 @@ class Article implements Page {
                $useParserCache = $this->mPage->shouldCheckParserCache( $parserOptions, $oldid );
                wfDebug( 'Article::view using parser cache: ' . ( $useParserCache ? 'yes' : 'no' ) . "\n" );
                if ( $user->getStubThreshold() ) {
-                       $this->getContext()->getStats()->increment( 'pcache_miss_stub' );
+                       MediaWikiServices::getInstance()->getStatsdDataFactory()->increment( 'pcache_miss_stub' );
                }
 
                $this->showRedirectedFromHeader();
@@ -1132,7 +1133,7 @@ class Article implements Page {
                        || $title->getNamespace() == NS_USER_TALK
                ) {
                        $rootPart = explode( '/', $title->getText() )[0];
-                       $user = User::newFromName( $rootPart, false /* allow IP users*/ );
+                       $user = User::newFromName( $rootPart, false /* allow IP users */ );
                        $ip = User::isIP( $rootPart );
                        $block = Block::newFromTarget( $user, $user );
 
@@ -2042,16 +2043,20 @@ class Article implements Page {
        /**
         * Call to WikiPage function for backwards compatibility.
         * @see WikiPage::doPurge
+        * @note In 1.28 (and only 1.28), this took a $flags parameter that
+        *  controlled how much purging was done.
         */
-       public function doPurge( $flags = WikiPage::PURGE_ALL ) {
-               return $this->mPage->doPurge( $flags );
+       public function doPurge() {
+               return $this->mPage->doPurge();
        }
 
        /**
         * Call to WikiPage function for backwards compatibility.
         * @see WikiPage::getLastPurgeTimestamp
+        * @deprecated since 1.29
         */
        public function getLastPurgeTimestamp() {
+               wfDeprecated( __METHOD__, '1.29' );
                return $this->mPage->getLastPurgeTimestamp();
        }
 
index 58f1666..4785ef1 100644 (file)
@@ -31,10 +31,28 @@ class ImageHistoryPseudoPager extends ReverseChronologicalPager {
         */
        protected $mTitle;
 
+       /**
+        * @since 1.14
+        * @var ImagePage
+        */
+       public $mImagePage;
+
+       /**
+        * @since 1.14
+        * @var File[]
+        */
+       public $mHist;
+
+       /**
+        * @since 1.14
+        * @var int[]
+        */
+       public $mRange;
+
        /**
         * @param ImagePage $imagePage
         */
-       function __construct( $imagePage ) {
+       public function __construct( $imagePage ) {
                parent::__construct( $imagePage->getContext() );
                $this->mImagePage = $imagePage;
                $this->mTitle = clone $imagePage->getTitle();
@@ -53,18 +71,18 @@ class ImageHistoryPseudoPager extends ReverseChronologicalPager {
        /**
         * @return Title
         */
-       function getTitle() {
+       public function getTitle() {
                return $this->mTitle;
        }
 
-       function getQueryInfo() {
+       public function getQueryInfo() {
                return false;
        }
 
        /**
         * @return string
         */
-       function getIndexField() {
+       public function getIndexField() {
                return '';
        }
 
@@ -72,14 +90,14 @@ class ImageHistoryPseudoPager extends ReverseChronologicalPager {
         * @param object $row
         * @return string
         */
-       function formatRow( $row ) {
+       public function formatRow( $row ) {
                return '';
        }
 
        /**
         * @return string
         */
-       function getBody() {
+       public function getBody() {
                $s = '';
                $this->doQuery();
                if ( count( $this->mHist ) ) {
@@ -113,7 +131,7 @@ class ImageHistoryPseudoPager extends ReverseChronologicalPager {
                return $s;
        }
 
-       function doQuery() {
+       public function doQuery() {
                if ( $this->mQueryDone ) {
                        return;
                }
index 388e693..11e1a30 100644 (file)
@@ -20,6 +20,7 @@
 
 use MediaWiki\MediaWikiServices;
 use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * Used to show archived pages and eventually restore them.
@@ -66,6 +67,56 @@ class PageArchive {
                return self::listPages( $dbr, '' );
        }
 
+       /**
+        * List deleted pages recorded in the archive matching the
+        * given term, using search engine archive.
+        * Returns result wrapper with (ar_namespace, ar_title, count) fields.
+        *
+        * @param string $term Search term
+        * @return ResultWrapper
+        */
+       public static function listPagesBySearch( $term ) {
+               $title = Title::newFromText( $term );
+               if ( $title ) {
+                       $ns = $title->getNamespace();
+                       $termMain = $title->getText();
+                       $termDb = $title->getDBkey();
+               } else {
+                       // Prolly won't work too good
+                       // @todo handle bare namespace names cleanly?
+                       $ns = 0;
+                       $termMain = $termDb = $term;
+               }
+
+               // Try search engine first
+               $engine = MediaWikiServices::getInstance()->newSearchEngine();
+               $engine->setLimitOffset( 100 );
+               $engine->setNamespaces( [ $ns ] );
+               $results = $engine->searchArchiveTitle( $termMain );
+               if ( !$results->isOK() ) {
+                       $results = [];
+               } else {
+                       $results = $results->getValue();
+               }
+
+               if ( !$results ) {
+                       // Fall back to regular prefix search
+                       return self::listPagesByPrefix( $term );
+               }
+
+               $dbr = wfGetDB( DB_REPLICA );
+               $condTitles = array_unique( array_map( function ( Title $t ) {
+                       return $t->getDBkey();
+               }, $results ) );
+               $conds = [
+                       'ar_namespace' => $ns,
+                       $dbr->makeList( [ 'ar_title' => $condTitles ], LIST_OR ) . " OR ar_title " .
+                       $dbr->buildLike( $termDb, $dbr->anyString() )
+               ];
+
+               return self::listPages( $dbr, $conds );
+       }
+
        /**
         * List deleted pages recorded in the archive table matching the
         * given title prefix.
@@ -132,6 +183,7 @@ class PageArchive {
                $fields = [
                        'ar_minor_edit', 'ar_timestamp', 'ar_user', 'ar_user_text',
                        'ar_comment', 'ar_len', 'ar_deleted', 'ar_rev_id', 'ar_sha1',
+                       'ar_page_id'
                ];
 
                if ( $this->config->get( 'ContentHandlerUseDB' ) ) {
@@ -401,25 +453,12 @@ class PageArchive {
 
                // Touch the log!
 
-               if ( $textRestored && $filesRestored ) {
-                       $reason = wfMessage( 'undeletedrevisions-files' )
-                               ->numParams( $textRestored, $filesRestored )->inContentLanguage()->text();
-               } elseif ( $textRestored ) {
-                       $reason = wfMessage( 'undeletedrevisions' )->numParams( $textRestored )
-                               ->inContentLanguage()->text();
-               } elseif ( $filesRestored ) {
-                       $reason = wfMessage( 'undeletedfiles' )->numParams( $filesRestored )
-                               ->inContentLanguage()->text();
-               } else {
+               if ( !$textRestored && !$filesRestored ) {
                        wfDebug( "Undelete: nothing undeleted...\n" );
 
                        return false;
                }
 
-               if ( trim( $comment ) != '' ) {
-                       $reason .= wfMessage( 'colon-separator' )->inContentLanguage()->text() . $comment;
-               }
-
                if ( $user === null ) {
                        global $wgUser;
                        $user = $wgUser;
@@ -428,15 +467,21 @@ class PageArchive {
                $logEntry = new ManualLogEntry( 'delete', 'restore' );
                $logEntry->setPerformer( $user );
                $logEntry->setTarget( $this->title );
-               $logEntry->setComment( $reason );
+               $logEntry->setComment( $comment );
                $logEntry->setTags( $tags );
+               $logEntry->setParameters( [
+                       ':assoc:count' => [
+                               'revisions' => $textRestored,
+                               'files' => $filesRestored,
+                       ],
+               ] );
 
                Hooks::run( 'ArticleUndeleteLogEntry', [ $this, &$logEntry, $user ] );
 
                $logid = $logEntry->insert();
                $logEntry->publish( $logid );
 
-               return [ $textRestored, $filesRestored, $reason ];
+               return [ $textRestored, $filesRestored, $comment ];
        }
 
        /**
@@ -619,7 +664,7 @@ class PageArchive {
                $restored = 0; // number of revisions restored
                /** @var Revision $revision */
                $revision = null;
-
+               $restoredPages = [];
                // If there are no restorable revisions, we can skip most of the steps.
                if ( $latestRestorableRow === null ) {
                        $failedRevisionCount = $rev_count;
@@ -676,6 +721,7 @@ class PageArchive {
 
                                Hooks::run( 'ArticleRevisionUndeleted',
                                        [ &$this->title, $revision, $row->ar_page_id ] );
+                               $restoredPages[$row->ar_page_id] = true;
                        }
 
                        // Now that it's safely stored, take it out of the archive
@@ -716,7 +762,8 @@ class PageArchive {
                                );
                        }
 
-                       Hooks::run( 'ArticleUndelete', [ &$this->title, $created, $comment, $oldPageId ] );
+                       Hooks::run( 'ArticleUndelete',
+                               [ &$this->title, $created, $comment, $oldPageId, $restoredPages ] );
                        if ( $this->title->getNamespace() == NS_FILE ) {
                                DeferredUpdates::addUpdate( new HTMLCacheUpdate( $this->title, 'imagelinks' ) );
                        }
index e4b524b..66fadf5 100644 (file)
@@ -164,9 +164,12 @@ class WikiFilePage extends WikiPage {
                return $this->mDupes;
        }
 
-       public function doPurge( $flags = self::PURGE_ALL ) {
+       /**
+        * Override handling of action=purge
+        * @return bool
+        */
+       public function doPurge() {
                $this->loadFile();
-
                if ( $this->mFile->exists() ) {
                        wfDebug( 'ImagePage::doPurge purging ' . $this->mFile->getName() . "\n" );
                        DeferredUpdates::addUpdate( new HTMLCacheUpdate( $this->mTitle, 'imagelinks' ) );
@@ -182,8 +185,7 @@ class WikiFilePage extends WikiPage {
                        // Purge redirect cache
                        $this->mRepo->invalidateImageRedirect( $this->mTitle );
                }
-
-               return parent::doPurge( $flags );
+               return parent::doPurge();
        }
 
        /**
index 4bc8ad6..7044e6a 100644 (file)
@@ -23,6 +23,7 @@
 use \MediaWiki\Logger\LoggerFactory;
 use \MediaWiki\MediaWikiServices;
 use Wikimedia\Rdbms\FakeResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * Class representing a MediaWiki article and history.
@@ -84,9 +85,10 @@ class WikiPage implements Page, IDBAccessObject {
         */
        protected $mLinksUpdated = '19700101000000';
 
-       const PURGE_CDN_CACHE = 1; // purge CDN cache for page variant URLs
-       const PURGE_CLUSTER_PCACHE = 2; // purge parser cache in the local datacenter
-       const PURGE_GLOBAL_PCACHE = 4; // set page_touched to clear parser cache in all datacenters
+       /** @deprecated since 1.29. Added in 1.28 for partial purging, no longer used. */
+       const PURGE_CDN_CACHE = 1;
+       const PURGE_CLUSTER_PCACHE = 2;
+       const PURGE_GLOBAL_PCACHE = 4;
        const PURGE_ALL = 7;
 
        /**
@@ -574,35 +576,12 @@ class WikiPage implements Page, IDBAccessObject {
         * @return Revision|null
         */
        public function getOldestRevision() {
-
                // Try using the replica DB first, then try the master
-               $continue = 2;
-               $db = wfGetDB( DB_REPLICA );
-               $revSelectFields = Revision::selectFields();
-
-               $row = null;
-               while ( $continue ) {
-                       $row = $db->selectRow(
-                               [ 'revision' ],
-                               $revSelectFields,
-                               [
-                                       'rev_page' => $this->getId()
-                               ],
-                               __METHOD__,
-                               [
-                                       'ORDER BY' => 'rev_timestamp ASC'
-                               ]
-                       );
-
-                       if ( $row ) {
-                               $continue = 0;
-                       } else {
-                               $db = wfGetDB( DB_MASTER );
-                               $continue--;
-                       }
+               $rev = $this->mTitle->getFirstRevision();
+               if ( !$rev ) {
+                       $rev = $this->mTitle->getFirstRevision( Title::GAID_FOR_UPDATE );
                }
-
-               return $row ? Revision::newFromRow( $row ) : null;
+               return $rev;
        }
 
        /**
@@ -1119,10 +1098,11 @@ class WikiPage implements Page, IDBAccessObject {
 
        /**
         * Perform the actions of a page purging
-        * @param integer $flags Bitfield of WikiPage::PURGE_* constants
         * @return bool
+        * @note In 1.28 (and only 1.28), this took a $flags parameter that
+        *  controlled how much purging was done.
         */
-       public function doPurge( $flags = self::PURGE_ALL ) {
+       public function doPurge() {
                // Avoid PHP 7.1 warning of passing $this by reference
                $wikiPage = $this;
 
@@ -1130,30 +1110,15 @@ class WikiPage implements Page, IDBAccessObject {
                        return false;
                }
 
-               if ( ( $flags & self::PURGE_GLOBAL_PCACHE ) == self::PURGE_GLOBAL_PCACHE ) {
-                       // Set page_touched in the database to invalidate all DC caches
-                       $this->mTitle->invalidateCache();
-               } elseif ( ( $flags & self::PURGE_CLUSTER_PCACHE ) == self::PURGE_CLUSTER_PCACHE ) {
-                       // Delete the parser options key in the local cluster to invalidate the DC cache
-                       ParserCache::singleton()->deleteOptionsKey( $this );
-                       // Avoid sending HTTP 304s in ViewAction to the client who just issued the purge
-                       $cache = ObjectCache::getLocalClusterInstance();
-                       $cache->set(
-                               $cache->makeKey( 'page', 'last-dc-purge', $this->getId() ),
-                               wfTimestamp( TS_MW ),
-                               $cache::TTL_HOUR
-                       );
-               }
+               $this->mTitle->invalidateCache();
 
-               if ( ( $flags & self::PURGE_CDN_CACHE ) == self::PURGE_CDN_CACHE ) {
-                       // Clear any HTML file cache
-                       HTMLFileCache::clearFileCache( $this->getTitle() );
-                       // Send purge after any page_touched above update was committed
-                       DeferredUpdates::addUpdate(
-                               new CdnCacheUpdate( $this->mTitle->getCdnUrls() ),
-                               DeferredUpdates::PRESEND
-                       );
-               }
+               // Clear file cache
+               HTMLFileCache::clearFileCache( $this->getTitle() );
+               // Send purge after above page_touched update was committed
+               DeferredUpdates::addUpdate(
+                       new CdnCacheUpdate( $this->mTitle->getCdnUrls() ),
+                       DeferredUpdates::PRESEND
+               );
 
                if ( $this->mTitle->getNamespace() == NS_MEDIAWIKI ) {
                        $messageCache = MessageCache::singleton();
@@ -1168,11 +1133,11 @@ class WikiPage implements Page, IDBAccessObject {
         *
         * @return string|bool TS_MW timestamp or false
         * @since 1.28
+        * @deprecated since 1.29. It will always return false.
         */
        public function getLastPurgeTimestamp() {
-               $cache = ObjectCache::getLocalClusterInstance();
-
-               return $cache->get( $cache->makeKey( 'page', 'last-dc-purge', $this->getId() ) );
+               wfDeprecated( __METHOD__, '1.29' );
+               return false;
        }
 
        /**
index 4694890..0b867ef 100644 (file)
@@ -22,6 +22,7 @@
  */
 
 use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * IndexPager is an efficient pager which uses a (roughly unique) index in the
index c943b7c..438603a 100644 (file)
@@ -79,12 +79,25 @@ class CoreTagHooks {
         * @param array $attributes
         * @param Parser $parser
         * @throws MWException
-        * @return array
+        * @return array|string Output of tag hook
         */
        public static function html( $content, $attributes, $parser ) {
                global $wgRawHtml;
                if ( $wgRawHtml ) {
-                       return [ $content, 'markerType' => 'nowiki' ];
+                       if ( $parser->getOptions()->getAllowUnsafeRawHtml() ) {
+                               return [ $content, 'markerType' => 'nowiki' ];
+                       } else {
+                               // In a system message where raw html is
+                               // not allowed (but it is allowed in other
+                               // contexts).
+                               return Html::rawElement(
+                                       'span',
+                                       [ 'class' => 'error' ],
+                                       // Using ->text() not ->parse() as
+                                       // a paranoia measure against a loop.
+                                       wfMessage( 'rawhtml-notallowed' )->escaped()
+                               );
+                       }
                } else {
                        throw new MWException( '<html> extension tag encountered unexpectedly' );
                }
index 8db1fe3..953f021 100644 (file)
@@ -1610,9 +1610,7 @@ class Parser {
                                true, 'free',
                                $this->getExternalLinkAttribs( $url ), $this->mTitle );
                        # Register it in the output object...
-                       # Replace unnecessary URL escape codes with their equivalent characters
-                       $pasteurized = self::normalizeLinkUrl( $url );
-                       $this->mOutput->addExternalLink( $pasteurized );
+                       $this->mOutput->addExternalLink( $url );
                }
                return $text . $trail;
        }
@@ -1908,10 +1906,7 @@ class Parser {
                                $this->getExternalLinkAttribs( $url ), $this->mTitle ) . $dtrail . $trail;
 
                        # Register link in the output object.
-                       # Replace unnecessary URL escape codes with the referenced character
-                       # This prevents spammers from hiding links from the filters
-                       $pasteurized = self::normalizeLinkUrl( $url );
-                       $this->mOutput->addExternalLink( $pasteurized );
+                       $this->mOutput->addExternalLink( $url );
                }
 
                return $s;
@@ -3257,6 +3252,7 @@ class Parser {
                                $text = '<span class="error">'
                                        . wfMessage( 'parser-template-loop-warning', $titleText )->inContentLanguage()->text()
                                        . '</span>';
+                               $this->addTrackingCategory( 'template-loop-category' );
                                wfDebug( __METHOD__ . ": template loop broken at '$titleText'\n" );
                        }
                }
@@ -4974,7 +4970,7 @@ class Parser {
                $ig->setShowFilename( false );
                $ig->setParser( $this );
                $ig->setHideBadImages();
-               $ig->setAttributes( Sanitizer::validateTagAttributes( $params, 'table' ) );
+               $ig->setAttributes( Sanitizer::validateTagAttributes( $params, 'ul' ) );
 
                if ( isset( $params['showfilename'] ) ) {
                        $ig->setShowFilename( true );
@@ -5085,9 +5081,11 @@ class Parser {
                                                        }
                                                        if ( preg_match( "/^($prots)$addr$chars*$/u", $linkValue ) ) {
                                                                $link = $linkValue;
+                                                               $this->mOutput->addExternalLink( $link );
                                                        } else {
                                                                $localLinkTitle = Title::newFromText( $linkValue );
                                                                if ( $localLinkTitle !== null ) {
+                                                                       $this->mOutput->addLink( $localLinkTitle );
                                                                        $link = $localLinkTitle->getLinkURL();
                                                                }
                                                        }
index 7be8281..2cdd8c7 100644 (file)
@@ -243,6 +243,21 @@ class ParserOptions {
         */
        private $redirectTarget = null;
 
+       /**
+        * If the wiki is configured to allow raw html ($wgRawHtml = true)
+        * is it allowed in the specific case of parsing this page.
+        *
+        * This is meant to disable unsafe parser tags in cases where
+        * a malicious user may control the input to the parser.
+        *
+        * @note This is expected to be true for normal pages even if the
+        *  wiki has $wgRawHtml disabled in general. The setting only
+        *  signifies that raw html would be unsafe in the current context
+        *  provided that raw html is allowed at all.
+        * @var boolean
+        */
+       private $allowUnsafeRawHtml = true;
+
        public function getInterwikiMagic() {
                return $this->mInterwikiMagic;
        }
@@ -457,6 +472,15 @@ class ParserOptions {
        public function getMagicRFCLinks() {
                return $this->mMagicRFCLinks;
        }
+
+       /**
+        * @since 1.29
+        * @return bool
+        */
+       public function getAllowUnsafeRawHtml() {
+               return $this->allowUnsafeRawHtml;
+       }
+
        public function setInterwikiMagic( $x ) {
                return wfSetVar( $this->mInterwikiMagic, $x );
        }
@@ -596,6 +620,15 @@ class ParserOptions {
                return wfSetVar( $this->mIsPrintable, $x );
        }
 
+       /**
+        * @param bool|null Value to set or null to get current value
+        * @return bool Current value for allowUnsafeRawHtml
+        * @since 1.29
+        */
+       public function setAllowUnsafeRawHtml( $x ) {
+               return wfSetVar( $this->allowUnsafeRawHtml, $x );
+       }
+
        /**
         * Set the redirect target.
         *
index b2f99b3..7de3b30 100644 (file)
@@ -535,6 +535,10 @@ class ParserOutput extends CacheTime {
                # We don't register links pointing to our own server, unless... :-)
                global $wgServer, $wgRegisterInternalExternals;
 
+               # Replace unnecessary URL escape codes with the referenced character
+               # This prevents spammers from hiding links from the filters
+               $url = parser::normalizeLinkUrl( $url );
+
                $registerExternalLink = true;
                if ( !$wgRegisterInternalExternals ) {
                        $registerExternalLink = !self::isLinkInternal( $wgServer, $url );
index 52aa54a..bb86551 100644 (file)
@@ -21,6 +21,7 @@
  * @file
  * @ingroup Profiler
  */
+use MediaWiki\MediaWikiServices;
 
 /**
  * ProfilerOutput class that flushes profiling data to the profiling
@@ -38,7 +39,7 @@ class ProfilerOutputStats extends ProfilerOutput {
         */
        public function log( array $stats ) {
                $prefix = isset( $this->params['prefix'] ) ? $this->params['prefix'] : '';
-               $contextStats = $this->collector->getContext()->getStats();
+               $contextStats = MediaWikiServices::getInstance()->getStatsdDataFactory();
 
                foreach ( $stats as $stat ) {
                        $key = "{$prefix}.{$stat['name']}";
index 717fb45..e72eaf2 100644 (file)
@@ -185,7 +185,7 @@ class ResourceLoader implements LoggerAwareInterface {
                        return self::applyFilter( $filter, $data );
                }
 
-               $stats = RequestContext::getMain()->getStats();
+               $stats = MediaWikiServices::getInstance()->getStatsdDataFactory();
                $cache = ObjectCache::getLocalServerInstance( CACHE_ANYTHING );
 
                $key = $cache->makeGlobalKey(
index 6a6a3c2..19d5471 100644 (file)
@@ -67,23 +67,27 @@ class ResourceLoaderImage {
                                }
                        }
                }
+               // Remove 'deprecated' key
+               if ( is_array( $this->descriptor ) ) {
+                       unset( $this->descriptor[ 'deprecated' ] );
+               }
 
                // Ensure that all files have common extension.
                $extensions = [];
-               $descriptor = (array)$descriptor;
+               $descriptor = (array)$this->descriptor;
                array_walk_recursive( $descriptor, function ( $path ) use ( &$extensions ) {
                        $extensions[] = pathinfo( $path, PATHINFO_EXTENSION );
                } );
                $extensions = array_unique( $extensions );
                if ( count( $extensions ) !== 1 ) {
                        throw new InvalidArgumentException(
-                               "File type for different image files of '$name' not the same"
+                               "File type for different image files of '$name' not the same in module '$module'"
                        );
                }
                $ext = $extensions[0];
                if ( !isset( self::$fileTypes[$ext] ) ) {
                        throw new InvalidArgumentException(
-                               "Invalid file type for image files of '$name' (valid: svg, png, gif, jpg)"
+                               "Invalid file type for image files of '$name' (valid: svg, png, gif, jpg) in module '$module'"
                        );
                }
                $this->extension = $ext;
index 4c9e6be..d26c961 100644 (file)
@@ -317,11 +317,7 @@ class ResourceLoaderImageModule extends ResourceLoaderModule {
                $selectors = $this->getSelectors();
 
                foreach ( $this->getImages( $context ) as $name => $image ) {
-                       $declarations = $this->getCssDeclarations(
-                               $image->getDataUri( $context, null, 'original' ),
-                               $image->getUrl( $context, $script, null, 'rasterized' )
-                       );
-                       $declarations = implode( "\n\t", $declarations );
+                       $declarations = $this->getStyleDeclarations( $context, $image, $script );
                        $selector = strtr(
                                $selectors['selectorWithoutVariant'],
                                [
@@ -333,11 +329,7 @@ class ResourceLoaderImageModule extends ResourceLoaderModule {
                        $rules[] = "$selector {\n\t$declarations\n}";
 
                        foreach ( $image->getVariants() as $variant ) {
-                               $declarations = $this->getCssDeclarations(
-                                       $image->getDataUri( $context, $variant, 'original' ),
-                                       $image->getUrl( $context, $script, $variant, 'rasterized' )
-                               );
-                               $declarations = implode( "\n\t", $declarations );
+                               $declarations = $this->getStyleDeclarations( $context, $image, $script, $variant );
                                $selector = strtr(
                                        $selectors['selectorWithVariant'],
                                        [
@@ -354,6 +346,28 @@ class ResourceLoaderImageModule extends ResourceLoaderModule {
                return [ 'all' => $style ];
        }
 
+       /**
+        * @param ResourceLoaderContext $context
+        * @param ResourceLoaderImage $image Image to get the style for
+        * @param string $script URL to load.php
+        * @param string|null $variant Variant to get the style for
+        * @return string
+        */
+       private function getStyleDeclarations(
+               ResourceLoaderContext $context,
+               ResourceLoaderImage $image,
+               $script,
+               $variant = null
+       ) {
+               $imageDataUri = $image->getDataUri( $context, $variant, 'original' );
+               $primaryUrl = $imageDataUri ?: $image->getUrl( $context, $script, $variant, 'original' );
+               $declarations = $this->getCssDeclarations(
+                       $primaryUrl,
+                       $image->getUrl( $context, $script, $variant, 'rasterized' )
+               );
+               return implode( "\n\t", $declarations );
+       }
+
        /**
         * SVG support using a transparent gradient to guarantee cross-browser
         * compatibility (browsers able to understand gradient syntax support also SVG).
index a3b059b..1704481 100644 (file)
@@ -43,9 +43,26 @@ class ResourceLoaderJqueryMsgModule extends ResourceLoaderFileModule {
                        )
                );
 
-               $dataScript = Xml::encodeJsCall( 'mw.jqueryMsg.setParserDefaults', [ $parserDefaults ] );
+               $mainDataScript = Xml::encodeJsCall( 'mw.jqueryMsg.setParserDefaults', [ $parserDefaults ] );
 
-               return $fileScript . $dataScript;
+               // Associative array mapping magic words (e.g. SITENAME)
+               // to their values.
+               $magicWords = [
+                       'SITENAME' => $this->getConfig()->get( 'Sitename' ),
+               ];
+
+               Hooks::run( 'ResourceLoaderJqueryMsgModuleMagicWords', [ $context, &$magicWords ] );
+
+               $magicWordExtendData = [
+                       'magic' => $magicWords,
+               ];
+
+               $magicWordDataScript = Xml::encodeJsCall( 'mw.jqueryMsg.setParserDefaults', [
+                       $magicWordExtendData,
+                       /* deep= */ true
+               ] );
+
+               return $fileScript . $mainDataScript . $magicWordDataScript;
        }
 
        /**
index a2b4b1d..5404e0f 100644 (file)
@@ -147,8 +147,8 @@ abstract class ResourceLoaderModule implements LoggerAwareInterface {
                if ( $deprecationInfo ) {
                        $name = $this->getName();
                        $warning = 'This page is using the deprecated ResourceLoader module "' . $name . '".';
-                       if ( !is_bool( $deprecationInfo ) && isset( $deprecationInfo['message'] ) ) {
-                               $warning .= "\n" . $deprecationInfo['message'];
+                       if ( is_string( $deprecationInfo ) ) {
+                               $warning .= "\n" . $deprecationInfo;
                        }
                        return Xml::encodeJsCall(
                                'mw.log.warn',
@@ -624,7 +624,7 @@ abstract class ResourceLoaderModule implements LoggerAwareInterface {
         */
        final protected function buildContent( ResourceLoaderContext $context ) {
                $rl = $context->getResourceLoader();
-               $stats = RequestContext::getMain()->getStats();
+               $stats = MediaWikiServices::getInstance()->getStatsdDataFactory();
                $statStart = microtime( true );
 
                // Only include properties that are relevant to this context (e.g. only=scripts)
index 91e63e7..d72b3af 100644 (file)
@@ -23,8 +23,6 @@
 
 class ResourceLoaderSkinModule extends ResourceLoaderFileModule {
 
-       /* Methods */
-
        /**
         * @param ResourceLoaderContext $context
         * @return array
@@ -77,13 +75,12 @@ class ResourceLoaderSkinModule extends ResourceLoaderFileModule {
                return false;
        }
 
-       /**
-        * @param ResourceLoaderContext $context
-        * @return string: Hash
-        */
-       public function getModifiedHash( ResourceLoaderContext $context ) {
-               $logo = $this->getConfig()->get( 'Logo' );
-               $logoHD = $this->getConfig()->get( 'LogoHD' );
-               return md5( parent::getModifiedHash( $context ) . $logo . json_encode( $logoHD ) );
+       public function getDefinitionSummary( ResourceLoaderContext $context ) {
+               $summary = parent::getDefinitionSummary( $context );
+               $summary[] = [
+                       'logo' => $this->getConfig()->get( 'Logo' ),
+                       'logoHD' => $this->getConfig()->get( 'LogoHD' ),
+               ];
+               return $summary;
        }
 }
index 44371bb..a0061e3 100644 (file)
@@ -93,6 +93,7 @@ class ResourceLoaderSpecialCharacterDataModule extends ResourceLoaderModule {
                        'special-characters-group-thai',
                        'special-characters-group-lao',
                        'special-characters-group-khmer',
+                       'special-characters-group-canadianaboriginal',
                        'special-characters-title-endash',
                        'special-characters-title-emdash',
                        'special-characters-title-minus'
index 48e4a0d..04b2f72 100644 (file)
@@ -342,7 +342,7 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
 
        /**
         * @param ResourceLoaderContext $context
-        * @return string
+        * @return string JavaScript code
         */
        public function getScript( ResourceLoaderContext $context ) {
                global $IP;
index 6632045..b9dc098 100644 (file)
@@ -37,7 +37,7 @@ class ResourceLoaderUserDefaultsModule extends ResourceLoaderModule {
 
        /**
         * @param ResourceLoaderContext $context
-        * @return string
+        * @return string JavaScript code
         */
        public function getScript( ResourceLoaderContext $context ) {
                return Xml::encodeJsCall(
index b3b3f16..0c332cf 100644 (file)
@@ -48,7 +48,7 @@ class ResourceLoaderUserOptionsModule extends ResourceLoaderModule {
 
        /**
         * @param ResourceLoaderContext $context
-        * @return string
+        * @return string JavaScript code
         */
        public function getScript( ResourceLoaderContext $context ) {
                return Xml::encodeJsCall( 'mw.user.options.set',
index cea1f39..bfa7326 100644 (file)
@@ -57,7 +57,7 @@ class ResourceLoaderUserTokensModule extends ResourceLoaderModule {
         * Add FILTER_NOMIN annotation to prevent needless minification and caching (T84960).
         *
         * @param ResourceLoaderContext $context
-        * @return string
+        * @return string JavaScript code
         */
        public function getScript( ResourceLoaderContext $context ) {
                return Xml::encodeJsCall(
index b0d060b..3eac5df 100644 (file)
@@ -22,6 +22,8 @@
  * @author Roan Kattouw
  */
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * Abstraction for ResourceLoader modules which pull from wiki pages
  *
@@ -146,7 +148,16 @@ class ResourceLoaderWikiModule extends ResourceLoaderModule {
        protected function getContent( $titleText ) {
                $title = Title::newFromText( $titleText );
                if ( !$title ) {
-                       return null;
+                       return null; // Bad title
+               }
+
+               // If the page is a redirect, follow the redirect.
+               if ( $title->isRedirect() ) {
+                       $content = $this->getContentObj( $title );
+                       $title = $content ? $content->getUltimateRedirectTarget() : null;
+                       if ( !$title ) {
+                               return null; // Dead redirect
+                       }
                }
 
                $handler = ContentHandler::getForTitle( $title );
@@ -155,9 +166,22 @@ class ResourceLoaderWikiModule extends ResourceLoaderModule {
                } elseif ( $handler->isSupportedFormat( CONTENT_FORMAT_JAVASCRIPT ) ) {
                        $format = CONTENT_FORMAT_JAVASCRIPT;
                } else {
-                       return null;
+                       return null; // Bad content model
                }
 
+               $content = $this->getContentObj( $title );
+               if ( !$content ) {
+                       return null; // No content found
+               }
+
+               return $content->serialize( $format );
+       }
+
+       /**
+        * @param Title $title
+        * @return Content|null
+        */
+       protected function getContentObj( Title $title ) {
                $revision = Revision::newKnownCurrent( wfGetDB( DB_REPLICA ), $title->getArticleID(),
                        $title->getLatestRevID() );
                if ( !$revision ) {
@@ -165,18 +189,16 @@ class ResourceLoaderWikiModule extends ResourceLoaderModule {
                }
                $revision->setTitle( $title );
                $content = $revision->getContent( Revision::RAW );
-
                if ( !$content ) {
                        wfDebugLog( 'resourceloader', __METHOD__ . ': failed to load content of JS/CSS page!' );
                        return null;
                }
-
-               return $content->serialize( $format );
+               return $content;
        }
 
        /**
         * @param ResourceLoaderContext $context
-        * @return string
+        * @return string JavaScript code
         */
        public function getScript( ResourceLoaderContext $context ) {
                $scripts = '';
index ad9259b..9afaf40 100644 (file)
@@ -19,6 +19,8 @@
  * @ingroup RevisionDelete
  */
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * List for archive table items, i.e. revisions deleted via action=delete
  */
index afee637..1d80d86 100644 (file)
@@ -19,6 +19,8 @@
  * @ingroup RevisionDelete
  */
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * List for filearchive table items
  */
index 9beafc9..62bafe9 100644 (file)
@@ -19,6 +19,8 @@
  * @ingroup RevisionDelete
  */
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * Item class for an oldimage table row
  */
index 00cb2e1..77cf976 100644 (file)
@@ -19,6 +19,8 @@
  * @ingroup RevisionDelete
  */
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * List for oldimage table items
  */
index ff1d2ed..1932778 100644 (file)
@@ -19,6 +19,8 @@
  * @ingroup RevisionDelete
  */
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * List for logging table items
  */
index 453c6cc..1ea6a38 100644 (file)
@@ -20,6 +20,7 @@
  */
 
 use Wikimedia\Rdbms\FakeResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * List for revision table items
index 7f41eb2..7812fb9 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup RevisionDelete
  */
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * Backend functions for suppressing and unsuppressing all references to a given user,
  * used when blocking with HideUser enabled.  This was spun out of SpecialBlockip.php
index 38c60d0..d51e525 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup Search
  */
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * Base search engine base class for database-backed searches
  * @ingroup Search
index 9817b6c..6bb4e5a 100644 (file)
@@ -72,6 +72,21 @@ abstract class SearchEngine {
                return null;
        }
 
+       /**
+        * Perform a title search in the article archive.
+        * NOTE: these results still should be filtered by
+        * matching against PageArchive, permissions checks etc
+        * The results returned by this methods are only sugegstions and
+        * may not end up being shown to the user.
+        *
+        * @param string $term Raw search term
+        * @return Status<Title[]>
+        * @since 1.29
+        */
+       function searchArchiveTitle( $term ) {
+               return Status::newGood( [] );
+       }
+
        /**
         * Perform a title-only search query and return a result set.
         * If title searches are not supported or disabled, return null.
index a767bc3..613d33c 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * Factory class for SearchEngine.
  * Allows to create engine of the specific type.
index d0e3a24..cebdb40 100644 (file)
 class SearchHighlighter {
        protected $mCleanWikitext = true;
 
+       /**
+        * @warning If you pass false to this constructor, then
+        *  the caller is responsible for HTML escaping.
+        */
        function __construct( $cleanupWikitext = true ) {
                $this->mCleanWikitext = $cleanupWikitext;
        }
@@ -456,6 +460,10 @@ class SearchHighlighter {
                $text = preg_replace( "/('''|<\/?[iIuUbB]>)/", "", $text );
                $text = preg_replace( "/''/", "", $text );
 
+               // Note, the previous /<\/?[^>]+>/ is insufficient
+               // for XSS safety as the HTML tag can span multiple
+               // search results (T144845).
+               $text = Sanitizer::escapeHtmlAllowEntities( $text );
                return $text;
        }
 
index e571c58..5868904 100644 (file)
@@ -287,12 +287,31 @@ abstract class BaseTemplate extends QuickTemplate {
         * @param string $name
         */
        protected function renderAfterPortlet( $name ) {
+               echo $this->getAfterPortlet( $name );
+       }
+
+       /**
+        * Allows extensions to hook into known portlets and add stuff to them
+        *
+        * @param string $name
+        *
+        * @return string html
+        * @since 1.29
+        */
+       protected function getAfterPortlet( $name ) {
+               $html = '';
                $content = '';
                Hooks::run( 'BaseTemplateAfterPortlet', [ $this, $name, &$content ] );
 
                if ( $content !== '' ) {
-                       echo "<div class='after-portlet after-portlet-$name'>$content</div>";
+                       $html = Html::rawElement(
+                               'div',
+                               [ 'class' => [ 'after-portlet', 'after-portlet-' . $name ] ],
+                               $content
+                       );
                }
+
+               return $html;
        }
 
        /**
@@ -632,6 +651,69 @@ abstract class BaseTemplate extends QuickTemplate {
                return $footericons;
        }
 
+       /**
+        * Renderer for getFooterIcons and getFooterLinks
+        *
+        * @param string $iconStyle $option for getFooterIcons: "icononly", "nocopyright"
+        * @param string $linkStyle $option for getFooterLinks: "flat"
+        *
+        * @return string html
+        * @since 1.29
+        */
+       protected function getFooter( $iconStyle = 'icononly', $linkStyle = 'flat' ) {
+               $validFooterIcons = $this->getFooterIcons( $iconStyle );
+               $validFooterLinks = $this->getFooterLinks( $linkStyle );
+
+               $html = '';
+
+               if ( count( $validFooterIcons ) + count( $validFooterLinks ) > 0 ) {
+                       $html .= Html::openElement( 'div', [
+                               'id' => 'footer-bottom',
+                               'role' => 'contentinfo',
+                               'lang' => $this->get( 'userlang' ),
+                               'dir' => $this->get( 'dir' )
+                       ] );
+                       $footerEnd = Html::closeElement( 'div' );
+               } else {
+                       $footerEnd = '';
+               }
+               foreach ( $validFooterIcons as $blockName => $footerIcons ) {
+                       $html .= Html::openElement( 'div', [
+                               'id' => 'f-' . Sanitizer::escapeId( $blockName ) . 'ico',
+                               'class' => 'footer-icons'
+                       ] );
+                       foreach ( $footerIcons as $icon ) {
+                               $html .= $this->getSkin()->makeFooterIcon( $icon );
+                       }
+                       $html .= Html::closeElement( 'div' );
+               }
+               if ( count( $validFooterLinks ) > 0 ) {
+                       $html .= Html::openElement( 'ul', [ 'id' => 'f-list', 'class' => 'footer-places' ] );
+                       foreach ( $validFooterLinks as $aLink ) {
+                               $html .= Html::rawElement(
+                                       'li',
+                                       [ 'id' => Sanitizer::escapeId( $aLink ) ],
+                                       $this->get( $aLink )
+                               );
+                       }
+                       $html .= Html::closeElement( 'ul' );
+               }
+
+               $html .= $this->getClear() . $footerEnd;
+
+               return $html;
+       }
+
+       /**
+        * Get a div with the core visualClear class, for clearing floats
+        *
+        * @return string html
+        * @since 1.29
+        */
+       protected function getClear() {
+               return Html::element( 'div', [ 'class' => 'visualClear' ] );
+       }
+
        /**
         * Get the suggested HTML for page status indicators: icons (or short text snippets) usually
         * displayed in the top-right corner of the page, outside of the main content.
@@ -664,15 +746,25 @@ abstract class BaseTemplate extends QuickTemplate {
        }
 
        /**
-        * Output the basic end-page trail including bottomscripts, reporttime, and
+        * Output getTrail
+        */
+       function printTrail() {
+               echo $this->getTrail();
+       }
+
+       /**
+        * Get the basic end-page trail including bottomscripts, reporttime, and
         * debug stuff. This should be called right before outputting the closing
         * body and html tags.
+        *
+        * @return string
+        * @since 1.29
         */
-       function printTrail() {
-?>
-<?php echo MWDebug::getDebugHTML( $this->getSkin()->getContext() ); ?>
-<?php $this->html( 'bottomscripts' ); /* JS call to runBodyOnloadHook */ ?>
-<?php $this->html( 'reporttime' ) ?>
-<?php
+       function getTrail() {
+               $html = MWDebug::getDebugHTML( $this->getSkin()->getContext() );
+               $html .= $this->get( 'bottomscripts' );
+               $html .= $this->get( 'reporttime' );
+
+               return $html;
        }
 }
index 8f702ba..ad9a248 100644 (file)
@@ -22,6 +22,7 @@
  */
 use MediaWiki\Logger\LoggerFactory;
 use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * Special page which uses a ChangesList to show query results.
@@ -58,6 +59,13 @@ abstract class ChangesListSpecialPage extends SpecialPage {
         */
        private $filterGroupDefinitions;
 
+       // Same format as filterGroupDefinitions, but for a single group (reviewStatus)
+       // that is registered conditionally.
+       private $reviewStatusFilterGroupDefinition;
+
+       // Single filter registered conditionally
+       private $hideCategorizationFilterDefinition;
+
        /**
         * Filter groups, and their contained filters
         * This is an associative array (with group name as key) of ChangesListFilterGroup objects.
@@ -177,11 +185,7 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                                                        &$query_options, &$join_conds ) {
 
                                                        $user = $ctx->getUser();
-                                                       if ( $user->getId() ) {
-                                                               $conds[] = 'rc_user != ' . $dbr->addQuotes( $user->getId() );
-                                                       } else {
-                                                               $conds[] = 'rc_user_text != ' . $dbr->addQuotes( $user->getName() );
-                                                       }
+                                                       $conds[] = 'rc_user_text != ' . $dbr->addQuotes( $user->getName() );
                                                },
                                                'cssClassSuffix' => 'self',
                                                'isRowApplicableCallable' => function ( $ctx, $rc ) {
@@ -197,11 +201,7 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                                                        &$query_options, &$join_conds ) {
 
                                                        $user = $ctx->getUser();
-                                                       if ( $user->getId() ) {
-                                                               $conds[] = 'rc_user = ' . $dbr->addQuotes( $user->getId() );
-                                                       } else {
-                                                               $conds[] = 'rc_user_text = ' . $dbr->addQuotes( $user->getName() );
-                                                       }
+                                                       $conds[] = 'rc_user_text = ' . $dbr->addQuotes( $user->getName() );
                                                },
                                                'cssClassSuffix' => 'others',
                                                'isRowApplicableCallable' => function ( $ctx, $rc ) {
@@ -252,57 +252,13 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                                ]
                        ],
 
-                       [
-                               'name' => 'reviewStatus',
-                               'title' => 'rcfilters-filtergroup-reviewstatus',
-                               'class' => ChangesListBooleanFilterGroup::class,
-                               'filters' => [
-                                       [
-                                               'name' => 'hidepatrolled',
-                                               'label' => 'rcfilters-filter-patrolled-label',
-                                               'description' => 'rcfilters-filter-patrolled-description',
-                                               // rcshowhidepatr-show, rcshowhidepatr-hide
-                                               // wlshowhidepatr
-                                               'showHideSuffix' => 'showhidepatr',
-                                               'default' => false,
-                                               'isAllowedCallable' => function ( $pageClassName, $context ) {
-                                                       return $context->getUser()->useRCPatrol();
-                                               },
-                                               'queryCallable' => function ( $specialClassName, $ctx, $dbr, &$tables, &$fields, &$conds,
-                                                       &$query_options, &$join_conds ) {
-
-                                                       $conds[] = 'rc_patrolled = 0';
-                                               },
-                                               'cssClassSuffix' => 'patrolled',
-                                               'isRowApplicableCallable' => function ( $ctx, $rc ) {
-                                                       return $rc->getAttribute( 'rc_patrolled' );
-                                               },
-                                       ],
-                                       [
-                                               'name' => 'hideunpatrolled',
-                                               'label' => 'rcfilters-filter-unpatrolled-label',
-                                               'description' => 'rcfilters-filter-unpatrolled-description',
-                                               'default' => false,
-                                               'isAllowedCallable' => function ( $pageClassName, $context ) {
-                                                       return $context->getUser()->useRCPatrol();
-                                               },
-                                               'queryCallable' => function ( $specialClassName, $ctx, $dbr, &$tables, &$fields, &$conds,
-                                                       &$query_options, &$join_conds ) {
-
-                                                       $conds[] = 'rc_patrolled = 1';
-                                               },
-                                               'cssClassSuffix' => 'unpatrolled',
-                                               'isRowApplicableCallable' => function ( $ctx, $rc ) {
-                                                       return !$rc->getAttribute( 'rc_patrolled' );
-                                               },
-                                       ],
-                               ],
-                       ],
+                       // reviewStatus (conditional)
 
                        [
                                'name' => 'significance',
                                'title' => 'rcfilters-filtergroup-significance',
                                'class' => ChangesListBooleanFilterGroup::class,
+                               'priority' => -6,
                                'filters' => [
                                        [
                                                'name' => 'hideminor',
@@ -351,6 +307,7 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                                                'label' => 'rcfilters-filter-pageedits-label',
                                                'description' => 'rcfilters-filter-pageedits-description',
                                                'default' => false,
+                                               'priority' => -2,
                                                'queryCallable' => function ( $specialClassName, $ctx, $dbr, &$tables, &$fields, &$conds,
                                                        &$query_options, &$join_conds ) {
 
@@ -366,6 +323,7 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                                                'label' => 'rcfilters-filter-newpages-label',
                                                'description' => 'rcfilters-filter-newpages-description',
                                                'default' => false,
+                                               'priority' => -3,
                                                'queryCallable' => function ( $specialClassName, $ctx, $dbr, &$tables, &$fields, &$conds,
                                                        &$query_options, &$join_conds ) {
 
@@ -376,44 +334,91 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                                                        return $rc->getAttribute( 'rc_source' ) === RecentChange::SRC_NEW;
                                                },
                                        ],
+
+                                       // hidecategorization
+
                                        [
-                                               'name' => 'hidecategorization',
-                                               'label' => 'rcfilters-filter-categorization-label',
-                                               'description' => 'rcfilters-filter-categorization-description',
-                                               // rcshowhidecategorization-show, rcshowhidecategorization-hide.
-                                               // wlshowhidecategorization
-                                               'showHideSuffix' => 'showhidecategorization',
-                                               'isAllowedCallable' => function ( $pageClassName, $context ) {
-                                                       return $context->getConfig()->get( 'RCWatchCategoryMembership' );
+                                               'name' => 'hidelog',
+                                               'label' => 'rcfilters-filter-logactions-label',
+                                               'description' => 'rcfilters-filter-logactions-description',
+                                               'default' => false,
+                                               'priority' => -5,
+                                               'queryCallable' => function ( $specialClassName, $ctx, $dbr, &$tables, &$fields, &$conds,
+                                                       &$query_options, &$join_conds ) {
+
+                                                       $conds[] = 'rc_type != ' . $dbr->addQuotes( RC_LOG );
                                                },
+                                               'cssClassSuffix' => 'src-mw-log',
+                                               'isRowApplicableCallable' => function ( $ctx, $rc ) {
+                                                       return $rc->getAttribute( 'rc_source' ) === RecentChange::SRC_LOG;
+                                               }
+                                       ],
+                               ],
+                       ],
+               ];
+
+               $this->reviewStatusFilterGroupDefinition = [
+                       [
+                               'name' => 'reviewStatus',
+                               'title' => 'rcfilters-filtergroup-reviewstatus',
+                               'class' => ChangesListBooleanFilterGroup::class,
+                               'priority' => -5,
+                               'filters' => [
+                                       [
+                                               'name' => 'hidepatrolled',
+                                               'label' => 'rcfilters-filter-patrolled-label',
+                                               'description' => 'rcfilters-filter-patrolled-description',
+                                               // rcshowhidepatr-show, rcshowhidepatr-hide
+                                               // wlshowhidepatr
+                                               'showHideSuffix' => 'showhidepatr',
                                                'default' => false,
                                                'queryCallable' => function ( $specialClassName, $ctx, $dbr, &$tables, &$fields, &$conds,
                                                        &$query_options, &$join_conds ) {
 
-                                                       $conds[] = 'rc_type != ' . $dbr->addQuotes( RC_CATEGORIZE );
+                                                       $conds[] = 'rc_patrolled = 0';
                                                },
-                                               'cssClassSuffix' => 'src-mw-categorize',
+                                               'cssClassSuffix' => 'patrolled',
                                                'isRowApplicableCallable' => function ( $ctx, $rc ) {
-                                                       return $rc->getAttribute( 'rc_source' ) === RecentChange::SRC_CATEGORIZE;
+                                                                                    return $rc->getAttribute( 'rc_patrolled' );
                                                },
                                        ],
                                        [
-                                               'name' => 'hidelog',
-                                               'label' => 'rcfilters-filter-logactions-label',
-                                               'description' => 'rcfilters-filter-logactions-description',
+                                               'name' => 'hideunpatrolled',
+                                               'label' => 'rcfilters-filter-unpatrolled-label',
+                                               'description' => 'rcfilters-filter-unpatrolled-description',
                                                'default' => false,
                                                'queryCallable' => function ( $specialClassName, $ctx, $dbr, &$tables, &$fields, &$conds,
                                                        &$query_options, &$join_conds ) {
 
-                                                       $conds[] = 'rc_type != ' . $dbr->addQuotes( RC_LOG );
+                                                       $conds[] = 'rc_patrolled = 1';
                                                },
-                                               'cssClassSuffix' => 'src-mw-log',
+                                               'cssClassSuffix' => 'unpatrolled',
                                                'isRowApplicableCallable' => function ( $ctx, $rc ) {
-                                                       return $rc->getAttribute( 'rc_source' ) === RecentChange::SRC_LOG;
-                                               }
+                                                                                    return !$rc->getAttribute( 'rc_patrolled' );
+                                               },
                                        ],
                                ],
-                       ],
+                       ]
+               ];
+
+               $this->hideCategorizationFilterDefinition = [
+                       'name' => 'hidecategorization',
+                       'label' => 'rcfilters-filter-categorization-label',
+                       'description' => 'rcfilters-filter-categorization-description',
+                       // rcshowhidecategorization-show, rcshowhidecategorization-hide.
+                       // wlshowhidecategorization
+                       'showHideSuffix' => 'showhidecategorization',
+                       'default' => false,
+                       'priority' => -4,
+                       'queryCallable' => function ( $specialClassName, $ctx, $dbr, &$tables, &$fields, &$conds,
+                               &$query_options, &$join_conds ) {
+
+                               $conds[] = 'rc_type != ' . $dbr->addQuotes( RC_CATEGORIZE );
+                       },
+                       'cssClassSuffix' => 'src-mw-categorize',
+                       'isRowApplicableCallable' => function ( $ctx, $rc ) {
+                               return $rc->getAttribute( 'rc_source' ) === RecentChange::SRC_CATEGORIZE;
+                       },
                ];
        }
 
@@ -434,6 +439,7 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                if ( $rows === false ) {
                        if ( !$this->including() ) {
                                $this->doHeader( $opts, 0 );
+                               $this->outputNoResults();
                                $this->getOutput()->setStatusCode( 404 );
                        }
 
@@ -453,7 +459,6 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                        }
                }
                $batch->execute();
-
                $this->webOutput( $rows, $opts );
 
                $rows->free();
@@ -467,6 +472,17 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                }
        }
 
+       /**
+        * Add the "no results" message to the output
+        */
+       protected function outputNoResults() {
+               $this->getOutput()->addHTML(
+                       '<div class="mw-changeslist-empty">' .
+                       $this->msg( 'recentchanges-noresult' )->parse() .
+                       '</div>'
+               );
+       }
+
        /**
         * Get the database result for this special page instance. Used by ApiFeedRecentChanges.
         *
@@ -499,7 +515,8 @@ abstract class ChangesListSpecialPage extends SpecialPage {
        }
 
        /**
-        * Register all filters and their groups, plus conflicts
+        * Register all filters and their groups (including those from hooks), plus handle
+        * conflicts and defaults.
         *
         * You might want to customize these in the same method, in subclasses.  You can
         * call getFilterGroup to access a group, and (on the group) getFilter to access a
@@ -509,6 +526,27 @@ abstract class ChangesListSpecialPage extends SpecialPage {
        protected function registerFilters() {
                $this->registerFiltersFromDefinitions( $this->filterGroupDefinitions );
 
+               // Make sure this is not being transcluded (we don't want to show this
+               // information to all users just because the user that saves the edit can
+               // patrol)
+               if ( !$this->including() && $this->getUser()->useRCPatrol() ) {
+                       $this->registerFiltersFromDefinitions( $this->reviewStatusFilterGroupDefinition );
+               }
+
+               $changeTypeGroup = $this->getFilterGroup( 'changeType' );
+
+               if ( $this->getConfig()->get( 'RCWatchCategoryMembership' ) ) {
+                       $transformedHideCategorizationDef = $this->transformFilterDefinition(
+                               $this->hideCategorizationFilterDefinition
+                       );
+
+                       $transformedHideCategorizationDef['group'] = $changeTypeGroup;
+
+                       $hideCategorization = new ChangesListBooleanFilter(
+                               $transformedHideCategorizationDef
+                       );
+               }
+
                Hooks::run( 'ChangesListSpecialPageStructuredFilters', [ $this ] );
 
                $unstructuredGroupDefinition =
@@ -531,6 +569,48 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                        'rcfilters-filtergroup-user-experience-level-conflicts-unregistered',
                        'rcfilters-filter-unregistered-conflicts-user-experience-level'
                );
+
+               $categoryFilter = $changeTypeGroup->getFilter( 'hidecategorization' );
+               $logactionsFilter = $changeTypeGroup->getFilter( 'hidelog' );
+               $pagecreationFilter = $changeTypeGroup->getFilter( 'hidenewpages' );
+
+               $significanceTypeGroup = $this->getFilterGroup( 'significance' );
+               $hideMinorFilter = $significanceTypeGroup->getFilter( 'hideminor' );
+
+               // categoryFilter is conditional; see registerFilters
+               if ( $categoryFilter !== null ) {
+                       $hideMinorFilter->conflictsWith(
+                               $categoryFilter,
+                               'rcfilters-hideminor-conflicts-typeofchange-global',
+                               'rcfilters-hideminor-conflicts-typeofchange',
+                               'rcfilters-typeofchange-conflicts-hideminor'
+                       );
+               }
+               $hideMinorFilter->conflictsWith(
+                       $logactionsFilter,
+                       'rcfilters-hideminor-conflicts-typeofchange-global',
+                       'rcfilters-hideminor-conflicts-typeofchange',
+                       'rcfilters-typeofchange-conflicts-hideminor'
+               );
+               $hideMinorFilter->conflictsWith(
+                       $pagecreationFilter,
+                       'rcfilters-hideminor-conflicts-typeofchange-global',
+                       'rcfilters-hideminor-conflicts-typeofchange',
+                       'rcfilters-typeofchange-conflicts-hideminor'
+               );
+       }
+
+       /**
+        * Transforms filter definition to prepare it for constructor.
+        *
+        * See overrides of this method as well.
+        *
+        * @param array $filterDefinition Original filter definition
+        *
+        * @return array Transformed definition
+        */
+       protected function transformFilterDefinition( array $filterDefinition ) {
+               return $filterDefinition;
        }
 
        /**
@@ -539,17 +619,27 @@ abstract class ChangesListSpecialPage extends SpecialPage {
         * Array specifying groups and their filters; see Filter and
         * ChangesListFilterGroup constructors.
         *
-        * There is light processing to simplify core maintenance.  See overrides
-        * of this method as well.
+        * There is light processing to simplify core maintenance.
         */
        protected function registerFiltersFromDefinitions( array $definition ) {
-               $priority = -1;
+               $autoFillPriority = -1;
                foreach ( $definition as $groupDefinition ) {
-                       $groupDefinition['priority'] = $priority;
-                       $priority--;
+                       if ( !isset( $groupDefinition['priority'] ) ) {
+                               $groupDefinition['priority'] = $autoFillPriority;
+                       } else {
+                               // If it's explicitly specified, start over the auto-fill
+                               $autoFillPriority = $groupDefinition['priority'];
+                       }
+
+                       $autoFillPriority--;
 
                        $className = $groupDefinition['class'];
                        unset( $groupDefinition['class'] );
+
+                       foreach ( $groupDefinition['filters'] as &$filterDefinition ) {
+                               $filterDefinition = $this->transformFilterDefinition( $filterDefinition );
+                       }
+
                        $this->registerFilterGroup( new $className( $groupDefinition ) );
                }
        }
@@ -815,7 +905,7 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                                        $query_options, $join_conds, $opts[$filterGroup->getName()] );
                        } else {
                                foreach ( $filterGroup->getFilters() as $filter ) {
-                                       if ( $opts[$filter->getName()] && $filter->isAllowed( $this ) ) {
+                                       if ( $opts[$filter->getName()] ) {
                                                $filter->modifyQuery( $dbr, $this, $tables, $fields, $conds,
                                                        $query_options, $join_conds );
                                        }
index bafee65..59abefd 100644 (file)
@@ -22,6 +22,7 @@
  */
 
 use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * Variant of QueryPage which uses a gallery to output results, thus
index 45cef2b..76b1535 100644 (file)
@@ -22,6 +22,7 @@
  */
 
 use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * Variant of QueryPage which formats the result as a simple link to the page
index 65e82e8..68d2d30 100644 (file)
@@ -22,6 +22,7 @@
  */
 
 use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * This is a class for doing query pages; since they're almost all the same,
@@ -407,7 +408,7 @@ abstract class QueryPage extends SpecialPage {
                        $options = isset( $query['options'] ) ? (array)$query['options'] : [];
                        $join_conds = isset( $query['join_conds'] ) ? (array)$query['join_conds'] : [];
 
-                       if ( count( $order ) ) {
+                       if ( $order ) {
                                $options['ORDER BY'] = $order;
                        }
 
@@ -457,26 +458,46 @@ abstract class QueryPage extends SpecialPage {
        public function fetchFromCache( $limit, $offset = false ) {
                $dbr = wfGetDB( DB_REPLICA );
                $options = [];
+
                if ( $limit !== false ) {
                        $options['LIMIT'] = intval( $limit );
                }
+
                if ( $offset !== false ) {
                        $options['OFFSET'] = intval( $offset );
                }
+
+               $order = $this->getCacheOrderFields();
                if ( $this->sortDescending() ) {
-                       $options['ORDER BY'] = 'qc_value DESC';
-               } else {
-                       $options['ORDER BY'] = 'qc_value ASC';
+                       foreach ( $order as &$field ) {
+                               $field .= " DESC";
+                       }
+               }
+               if ( $order ) {
+                       $options['ORDER BY'] = $order;
                }
-               return $dbr->select( 'querycache', [ 'qc_type',
+
+               return $dbr->select( 'querycache',
+                               [ 'qc_type',
                                'namespace' => 'qc_namespace',
                                'title' => 'qc_title',
                                'value' => 'qc_value' ],
                                [ 'qc_type' => $this->getName() ],
-                               __METHOD__, $options
+                               __METHOD__,
+                               $options
                );
        }
 
+       /**
+        * Return the order fields for fetchFromCache. Default is to always use
+        * "ORDER BY value" which was the default prior to this function.
+        * @return array
+        * @since 1.29
+        */
+       function getCacheOrderFields() {
+               return [ 'value' ];
+       }
+
        public function getCachedTimestamp() {
                if ( is_null( $this->cachedTimestamp ) ) {
                        $dbr = wfGetDB( DB_REPLICA );
index b1ddacf..9b5d5f4 100644 (file)
@@ -41,7 +41,7 @@ abstract class RedirectSpecialPage extends UnlistedSpecialPage {
                $query = $this->getRedirectQuery();
                // Redirect to a page title with possible query parameters
                if ( $redirect instanceof Title ) {
-                       $url = $redirect->getFullURL( $query );
+                       $url = $redirect->getFullUrlForRedirect( $query );
                        $this->getOutput()->redirect( $url );
 
                        return $redirect;
index 33e1cc3..84d3b08 100644 (file)
@@ -96,6 +96,7 @@ class SpecialPageFactory {
                'Block' => 'SpecialBlock',
                'Unblock' => 'SpecialUnblock',
                'BlockList' => 'SpecialBlockList',
+               'AutoblockList' => 'SpecialAutoblockList',
                'ChangePassword' => 'SpecialChangePassword',
                'BotPasswords' => 'SpecialBotPasswords',
                'PasswordReset' => 'SpecialPasswordReset',
@@ -144,6 +145,7 @@ class SpecialPageFactory {
                'RandomInCategory' => 'SpecialRandomInCategory',
                'Randomredirect' => 'SpecialRandomredirect',
                'Randomrootpage' => 'SpecialRandomrootpage',
+               'GoToInterwiki' => 'SpecialGoToInterwiki',
 
                // High use pages
                'Mostlinkedcategories' => 'MostlinkedCategoriesPage',
@@ -504,7 +506,7 @@ class SpecialPageFactory {
         * @param bool $including Bool output is being captured for use in {{special:whatever}}
         * @param LinkRenderer|null $linkRenderer (since 1.28)
         *
-        * @return bool
+        * @return bool|Title
         */
        public static function executePath( Title &$title, IContextSource &$context, $including = false,
                LinkRenderer $linkRenderer = null
index 9d92cbd..d788f2b 100644 (file)
@@ -22,6 +22,7 @@
  */
 
 use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * Class definition for a wanted query page like
@@ -119,4 +120,37 @@ abstract class WantedQueryPage extends QueryPage {
                $label = $this->msg( 'nlinks' )->numParams( $result->value )->escaped();
                return Linker::link( $wlh, $label );
        }
+
+       /**
+        * Order by title for pages with the same number of links to them
+        *
+        * @return array
+        * @since 1.29
+        */
+       function getOrderFields() {
+               return [ 'value DESC', 'namespace', 'title' ];
+       }
+
+       /**
+        * Do not order descending for all order fields.  We will use DESC only on one field, see
+        * getOrderFields above. This overwrites sortDescending from QueryPage::getOrderFields().
+        * Do NOT change this to true unless you remove the phrase DESC in getOrderFiels above.
+        * If you do a database error will be thrown due to double adding DESC to query!
+        *
+        * @return bool
+        * @since 1.29
+        */
+       function sortDescending() {
+               return false;
+       }
+
+       /**
+        * Also use the order fields returned by getOrderFields when fetching from the cache.
+        * @return array
+        * @since 1.29
+        */
+       function getCacheOrderFields() {
+               return $this->getOrderFields();
+       }
+
 }
index 49ca9f4..4056709 100644 (file)
@@ -67,8 +67,6 @@ class SpecialAllMessages extends SpecialPage {
                        wfGetLangObj( $request->getVal( 'lang', $par ) )
                );
 
-               $this->langcode = $this->table->lang->getCode();
-
                $out->addHTML( $this->table->buildForm() );
                $out->addParserOutputContent( $this->table->getFullOutput() );
        }
index 4b8446a..17f6cca 100644 (file)
@@ -69,7 +69,11 @@ class SpecialAllPages extends IncludableSpecialPage {
                $from = $request->getVal( 'from', null );
                $to = $request->getVal( 'to', null );
                $namespace = $request->getInt( 'namespace' );
-               $hideredirects = $request->getBool( 'hideredirects', false );
+
+               $miserMode = (bool)$this->getConfig()->get( 'MiserMode' );
+
+               // Redirects filter is disabled in MiserMode
+               $hideredirects = $request->getBool( 'hideredirects', false ) && !$miserMode;
 
                $namespaces = $this->getLanguage()->getNamespaces();
 
@@ -100,6 +104,7 @@ class SpecialAllPages extends IncludableSpecialPage {
        protected function outputHTMLForm( $namespace = NS_MAIN,
                $from = '', $to = '', $hideRedirects = false
        ) {
+               $miserMode = (bool)$this->getConfig()->get( 'MiserMode' );
                $fields = [
                        'from' => [
                                'type' => 'text',
@@ -133,6 +138,11 @@ class SpecialAllPages extends IncludableSpecialPage {
                                'value' => $hideRedirects,
                        ],
                ];
+
+               if ( $miserMode ) {
+                       unset( $fields['hideredirects'] );
+               }
+
                $form = HTMLForm::factory( 'table', $fields, $this->getContext() );
                $form->setMethod( 'get' )
                        ->setWrapperLegendMsg( 'allpages' )
diff --git a/includes/specials/SpecialAutoblockList.php b/includes/specials/SpecialAutoblockList.php
new file mode 100644 (file)
index 0000000..dcb2444
--- /dev/null
@@ -0,0 +1,152 @@
+<?php
+/**
+ * Implements Special:AutoblockList
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup SpecialPage
+ */
+
+/**
+ * A special page that lists autoblocks
+ *
+ * @since 1.29
+ * @ingroup SpecialPage
+ */
+class SpecialAutoblockList extends SpecialPage {
+
+       function __construct() {
+               parent::__construct( 'AutoblockList' );
+       }
+
+       /**
+        * Main execution point
+        *
+        * @param string $par Title fragment
+        */
+       public function execute( $par ) {
+               $this->setHeaders();
+               $this->outputHeader();
+               $out = $this->getOutput();
+               $lang = $this->getLanguage();
+               $out->setPageTitle( $this->msg( 'autoblocklist' ) );
+               $this->addHelpLink( 'Autoblock' );
+               $out->addModuleStyles( [ 'mediawiki.special' ] );
+
+               # setup BlockListPager here to get the actual default Limit
+               $pager = $this->getBlockListPager();
+
+               # Just show the block list
+               $fields = [
+                       'Limit' => [
+                               'type' => 'limitselect',
+                               'label-message' => 'table_pager_limit_label',
+                               'options' => [
+                                       $lang->formatNum( 20 ) => 20,
+                                       $lang->formatNum( 50 ) => 50,
+                                       $lang->formatNum( 100 ) => 100,
+                                       $lang->formatNum( 250 ) => 250,
+                                       $lang->formatNum( 500 ) => 500,
+                               ],
+                               'name' => 'limit',
+                               'default' => $pager->getLimit(),
+                       ]
+               ];
+
+               $context = new DerivativeContext( $this->getContext() );
+               $context->setTitle( $this->getPageTitle() ); // Remove subpage
+               $form = HTMLForm::factory( 'ooui', $fields, $context );
+               $form->setMethod( 'get' )
+                       ->setFormIdentifier( 'blocklist' )
+                       ->setWrapperLegendMsg( 'autoblocklist-legend' )
+                       ->setSubmitTextMsg( 'autoblocklist-submit' )
+                       ->setSubmitProgressive()
+                       ->prepareForm()
+                       ->displayForm( false );
+
+               $this->showList( $pager );
+       }
+
+       /**
+        * Setup a new BlockListPager instance.
+        * @return BlockListPager
+        */
+       protected function getBlockListPager() {
+               $conds = [
+                       'ipb_parent_block_id IS NOT NULL'
+               ];
+               # Is the user allowed to see hidden blocks?
+               if ( !$this->getUser()->isAllowed( 'hideuser' ) ) {
+                       $conds['ipb_deleted'] = 0;
+               }
+
+               return new BlockListPager( $this, $conds );
+       }
+
+       /**
+        * Show the list of blocked accounts matching the actual filter.
+        * @param BlockListPager $pager The BlockListPager instance for this page
+        */
+       protected function showList( BlockListPager $pager ) {
+               $out = $this->getOutput();
+
+               # Check for other blocks, i.e. global/tor blocks
+               $otherAutoblockLink = [];
+               Hooks::run( 'OtherAutoblockLogLink', [ &$otherAutoblockLink ] );
+
+               # Show additional header for the local block only when other blocks exists.
+               # Not necessary in a standard installation without such extensions enabled
+               if ( count( $otherAutoblockLink ) ) {
+                       $out->addHTML(
+                               Html::element( 'h2', [], $this->msg( 'autoblocklist-localblocks',
+                                       $pager->getNumRows() )->parse() )
+                               . "\n"
+                       );
+               }
+
+               if ( $pager->getNumRows() ) {
+                       $out->addParserOutputContent( $pager->getFullOutput() );
+               } else {
+                       $out->addWikiMsg( 'autoblocklist-empty' );
+               }
+
+               if ( count( $otherAutoblockLink ) ) {
+                       $out->addHTML(
+                               Html::rawElement(
+                                       'h2',
+                                       [],
+                                       $this->msg( 'autoblocklist-otherblocks', count( $otherAutoblockLink ) )->parse()
+                               ) . "\n"
+                       );
+                       $list = '';
+                       foreach ( $otherAutoblockLink as $link ) {
+                               $list .= Html::rawElement( 'li', [], $link ) . "\n";
+                       }
+                       $out->addHTML(
+                               Html::rawElement(
+                                       'ul',
+                                       [ 'class' => 'mw-autoblocklist-otherblocks' ],
+                                       $list
+                               ) . "\n"
+                       );
+               }
+       }
+
+       protected function getGroupName() {
+               return 'users';
+       }
+}
index 9aba41e..cd9345d 100644 (file)
@@ -22,6 +22,7 @@
  */
 
 use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * A special page listing redirects to non existent page. Those should be
index b81ca3d..970a2e2 100644 (file)
@@ -126,7 +126,27 @@ class SpecialChangeCredentials extends AuthManagerSpecialPage {
                if ( !static::$loadUserData ) {
                        return [];
                } else {
-                       return parent::getAuthFormDescriptor( $requests, $action );
+                       $descriptor = parent::getAuthFormDescriptor( $requests, $action );
+
+                       $any = false;
+                       foreach ( $descriptor as &$field ) {
+                               if ( $field['type'] === 'password' && $field['name'] !== 'retype' ) {
+                                       $any = true;
+                                       if ( isset( $field['cssclass'] ) ) {
+                                               $field['cssclass'] .= ' mw-changecredentials-validate-password';
+                                       } else {
+                                               $field['cssclass'] = 'mw-changecredentials-validate-password';
+                                       }
+                               }
+                       }
+
+                       if ( $any ) {
+                               $this->getOutput()->addModules( [
+                                       'mediawiki.special.changecredentials.js'
+                               ] );
+                       }
+
+                       return $descriptor;
                }
        }
 
@@ -238,7 +258,7 @@ class SpecialChangeCredentials extends AuthManagerSpecialPage {
                }
 
                $title = Title::newFromText( $returnTo );
-               return $title->getFullURL( $returnToQuery );
+               return $title->getFullUrlForRedirect( $returnToQuery );
        }
 
        protected function getRequestBlacklist() {
index 785447f..eb98fe7 100644 (file)
@@ -136,7 +136,7 @@ class SpecialChangeEmail extends FormSpecialPage {
                $query = $request->getVal( 'returntoquery' );
 
                if ( $this->status->value === true ) {
-                       $this->getOutput()->redirect( $titleObj->getFullURL( $query ) );
+                       $this->getOutput()->redirect( $titleObj->getFullUrlForRedirect( $query ) );
                } elseif ( $this->status->value === 'eauth' ) {
                        # Notify user that a confirmation email has been sent...
                        $this->getOutput()->wrapWikiMsg( "<div class='error' style='clear: both;'>\n$1\n</div>",
index 59351dc..d7e99db 100644 (file)
@@ -22,6 +22,7 @@
  */
 
 use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * A special page listing redirects to redirecting page.
diff --git a/includes/specials/SpecialGoToInterwiki.php b/includes/specials/SpecialGoToInterwiki.php
new file mode 100644 (file)
index 0000000..809a14a
--- /dev/null
@@ -0,0 +1,79 @@
+<?php
+/**
+ * Implements Special:GoToInterwiki
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup SpecialPage
+ */
+
+/**
+ * Landing page for non-local interwiki links.
+ *
+ * Meant to warn people that the site they're visiting
+ * is not the local wiki (In case of phishing tricks).
+ * Only meant to be used for things that directly
+ * redirect from url (e.g. Special:Search/google:foo )
+ * Not meant for general interwiki linking (e.g.
+ * [[google:foo]] should still directly link)
+ *
+ * @ingroup SpecialPage
+ */
+class SpecialGoToInterwiki extends UnlistedSpecialPage {
+       public function __construct( $name = 'GoToInterwiki' ) {
+               parent::__construct( $name );
+       }
+
+       public function execute( $par ) {
+               $this->setHeaders();
+               $target = Title::newFromText( $par );
+               // Disallow special pages as a precaution against
+               // possible redirect loops.
+               if ( !$target || $target->isSpecialPage() ) {
+                       $this->getOutput()->setStatusCode( 404 );
+                       $this->getOutput()->addWikiMsg( 'gotointerwiki-invalid' );
+                       return;
+               }
+
+               $url = $target->getFullURL();
+               if ( !$target->isExternal() || $target->isLocal() ) {
+                       // Either a normal page, or a local interwiki.
+                       // just redirect.
+                       $this->getOutput()->redirect( $url, '301' );
+               } else {
+                       $this->getOutput()->addWikiMsg(
+                               'gotointerwiki-external',
+                               $url,
+                               $target->getFullText()
+                       );
+               }
+       }
+
+       /**
+        * @return bool
+        */
+       public function requiresWrite() {
+               return false;
+       }
+
+       /**
+        * @return String
+        */
+       protected function getGroupName() {
+               return 'redirects';
+       }
+}
index a1f5efa..dae6074 100644 (file)
@@ -23,6 +23,7 @@
  */
 
 use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * Special:LinkSearch to search the external-links table.
index 52c710d..d5fb001 100644 (file)
@@ -25,6 +25,7 @@
  */
 
 use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * Special:ListDuplicatedFiles Lists all files where the current version is
index b2d6a33..5f38629 100644 (file)
@@ -25,6 +25,7 @@
  */
 
 use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * Special:Listredirects - Lists all the redirects on the wiki.
index a88767a..7c4b490 100644 (file)
@@ -23,6 +23,7 @@
  */
 
 use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * @ingroup SpecialPage
index 0776eec..bebed12 100644 (file)
@@ -25,6 +25,7 @@
  */
 
 use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * A special page that list pages that have highest category count
index 8560dca..c140ee9 100644 (file)
@@ -25,6 +25,7 @@
  */
 
 use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * A special page that listed pages that have highest interwiki count
index ff8550d..fbfaa73 100644 (file)
@@ -26,6 +26,7 @@
  */
 
 use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * A special page to show pages ordered by the number of pages linking to them.
index 699940b..956207f 100644 (file)
@@ -25,6 +25,7 @@
  */
 
 use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * A querypage to show categories ordered in descending order by the pages in them
index f5c2c5f..dee1c8e 100644 (file)
@@ -23,6 +23,7 @@
  */
 
 use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * Special page lists templates with a large number of
index 9e3a750..12dae8b 100644 (file)
@@ -39,6 +39,7 @@ class SpecialNewFiles extends IncludableSpecialPage {
                $opts = new FormOptions();
 
                $opts->add( 'like', '' );
+               $opts->add( 'user', '' );
                $opts->add( 'showbots', false );
                $opts->add( 'hidepatrolled', false );
                $opts->add( 'limit', 50 );
@@ -75,6 +76,12 @@ class SpecialNewFiles extends IncludableSpecialPage {
                                'name' => 'like',
                        ],
 
+                       'user' => [
+                               'type' => 'text',
+                               'label-message' => 'newimages-user',
+                               'name' => 'user',
+                       ],
+
                        'showbots' => [
                                'type' => 'check',
                                'label-message' => 'newimages-showbots',
old mode 100755 (executable)
new mode 100644 (file)
index db05ebe..2943fd4 100644 (file)
@@ -136,7 +136,7 @@ class SpecialPageLanguage extends FormSpecialPage {
                }
 
                // Url to redirect to after the operation
-               $this->goToUrl = $title->getFullURL(
+               $this->goToUrl = $title->getFullUrlForRedirect(
                        $title->isRedirect() ? [ 'redirect' => 'no' ] : []
                );
 
index eee5b64..40b50ea 100644 (file)
@@ -148,7 +148,7 @@ class SpecialPreferences extends SpecialPage {
                // Set session data for the success message
                $this->getRequest()->getSession()->set( 'specialPreferencesSaveSuccess', 1 );
 
-               $url = $this->getPageTitle()->getFullURL();
+               $url = $this->getPageTitle()->getFullUrlForRedirect();
                $this->getOutput()->redirect( $url );
 
                return true;
index 29e8900..f88f09c 100644 (file)
@@ -23,6 +23,7 @@
 
 use MediaWiki\MediaWikiServices;
 use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\FakeResultWrapper;
 
 /**
  * A special page that lists last changes made to the wiki
@@ -77,9 +78,7 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
 
                        $out->addHTML(
                                ResourceLoader::makeInlineScript(
-                                       Xml::encodeJsCall( 'mw.messages.set', [
-                                               $messages
-                                       ] )
+                                       ResourceLoader::makeMessageSetScript( $messages )
                                )
                        );
 
@@ -90,16 +89,12 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
        /**
         * @inheritdoc
         */
-       protected function registerFiltersFromDefinitions( array $definition ) {
-               foreach ( $definition as $groupName => &$groupDefinition ) {
-                       foreach ( $groupDefinition['filters'] as &$filterDefinition ) {
-                               if ( isset( $filterDefinition['showHideSuffix'] ) ) {
-                                       $filterDefinition['showHide'] = 'rc' . $filterDefinition['showHideSuffix'];
-                               }
-                       }
+       protected function transformFilterDefinition( array $filterDefinition ) {
+               if ( isset( $filterDefinition['showHideSuffix'] ) ) {
+                       $filterDefinition['showHide'] = 'rc' . $filterDefinition['showHideSuffix'];
                }
 
-               parent::registerFiltersFromDefinitions( $definition );
+               return $filterDefinition;
        }
 
        /**
@@ -119,12 +114,18 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                $hideBots->setDefault( true );
 
                $reviewStatus = $this->getFilterGroup( 'reviewStatus' );
-               $hidePatrolled = $reviewStatus->getFilter( 'hidepatrolled' );
-               $hidePatrolled->setDefault( $user->getBoolOption( 'hidepatrolled' ) );
+               if ( $reviewStatus !== null ) {
+                       // Conditional on feature being available and rights
+                       $hidePatrolled = $reviewStatus->getFilter( 'hidepatrolled' );
+                       $hidePatrolled->setDefault( $user->getBoolOption( 'hidepatrolled' ) );
+               }
 
                $changeType = $this->getFilterGroup( 'changeType' );
                $hideCategorization = $changeType->getFilter( 'hidecategorization' );
-               $hideCategorization->setDefault( $user->getBoolOption( 'hidecategorization' ) );
+               if ( $hideCategorization !== null ) {
+                       // Conditional on feature being available
+                       $hideCategorization->setDefault( $user->getBoolOption( 'hidecategorization' ) );
+               }
        }
 
        /**
@@ -397,11 +398,7 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                $rclistOutput .= $list->endRecentChangesList();
 
                if ( $rows->numRows() === 0 ) {
-                       $this->getOutput()->addHTML(
-                               '<div class="mw-changeslist-empty">' .
-                               $this->msg( 'recentchanges-noresult' )->parse() .
-                               '</div>'
-                       );
+                       $this->outputNoResults();
                        if ( !$this->including() ) {
                                $this->getOutput()->setStatusCode( 404 );
                        }
@@ -694,7 +691,7 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                                $newrows[$k] = $rowsarr[$k];
                        }
                }
-               $rows = $newrows;
+               $rows = new FakeResultWrapper( array_values( $newrows ) );
        }
 
        /**
@@ -749,6 +746,9 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                $user = $this->getUser();
                $config = $this->getConfig();
                if ( $options['from'] ) {
+                       $resetLink = $this->makeOptionsLink( $this->msg( 'rclistfromreset' ),
+                               [ 'from' => '' ], $nondefaults );
+
                        $note .= $this->msg( 'rcnotefrom' )
                                ->numParams( $options['limit'] )
                                ->params(
@@ -757,7 +757,13 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                                        $lang->userTime( $options['from'], $user )
                                )
                                ->numParams( $numRows )
-                               ->parse() . '<br />';
+                               ->parse() . ' ' .
+                               Html::rawElement(
+                                       'span',
+                                       [ 'class' => 'rcoptions-listfromreset' ],
+                                       $this->msg( 'parentheses' )->rawParams( $resetLink )->parse()
+                               ) .
+                               '<br />';
                }
 
                # Sort data for display and make sure it's unique after we've added user data.
index 9cc0048..139e4f7 100644 (file)
@@ -259,7 +259,7 @@ class SpecialSearch extends SpecialPage {
                        return null;
                }
 
-               return $url === null ? $title->getFullURL() : $url;
+               return $url === null ? $title->getFullUrlForRedirect() : $url;
        }
 
        /**
index a5e5113..3282a7a 100644 (file)
@@ -22,6 +22,7 @@
  */
 
 use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * SpecialShortpages extends QueryPage. It is used to return the shortest
index dc5f877..eb4f0cc 100644 (file)
@@ -21,6 +21,7 @@
  * @ingroup SpecialPage
  */
 
+use MediaWiki\MediaWikiServices;
 use Wikimedia\Rdbms\ResultWrapper;
 
 /**
@@ -45,6 +46,10 @@ class SpecialUndelete extends SpecialPage {
 
        /** @var Title */
        private $mTargetObj;
+       /**
+        * @var string Search prefix
+        */
+       private $mSearchPrefix;
 
        function __construct() {
                parent::__construct( 'Undelete', 'deletedhistory' );
@@ -235,6 +240,7 @@ class SpecialUndelete extends SpecialPage {
                        Xml::openElement( 'form', [ 'method' => 'get', 'action' => wfScript() ] ) .
                                Xml::fieldset( $this->msg( 'undelete-search-box' )->text() ) .
                                Html::hidden( 'title', $this->getPageTitle()->getPrefixedDBkey() ) .
+                               Html::hidden( 'fuzzy', $this->getRequest()->getVal( 'fuzzy' ) ) .
                                Html::rawElement(
                                        'label',
                                        [ 'for' => 'prefix' ],
@@ -245,15 +251,25 @@ class SpecialUndelete extends SpecialPage {
                                        20,
                                        $this->mSearchPrefix,
                                        [ 'id' => 'prefix', 'autofocus' => '' ]
-                               ) . ' ' .
-                               Xml::submitButton( $this->msg( 'undelete-search-submit' )->text() ) .
+                               ) .
+                               ' ' .
+                               Xml::submitButton(
+                                       $this->msg( 'undelete-search-submit' )->text(),
+                                       [ 'id' => 'searchUndelete' ]
+                               ) .
                                Xml::closeElement( 'fieldset' ) .
                                Xml::closeElement( 'form' )
                );
 
                # List undeletable articles
                if ( $this->mSearchPrefix ) {
-                       $result = PageArchive::listPagesByPrefix( $this->mSearchPrefix );
+                       // For now, we enable search engine match only when specifically asked to
+                       // by using fuzzy=1 parameter.
+                       if ( $this->getRequest()->getVal( "fuzzy", false ) ) {
+                               $result = PageArchive::listPagesBySearch( $this->mSearchPrefix );
+                       } else {
+                               $result = PageArchive::listPagesByPrefix( $this->mSearchPrefix );
+                       }
                        $this->showList( $result );
                }
        }
@@ -277,7 +293,7 @@ class SpecialUndelete extends SpecialPage {
 
                $linkRenderer = $this->getLinkRenderer();
                $undelete = $this->getPageTitle();
-               $out->addHTML( "<ul>\n" );
+               $out->addHTML( "<ul id='undeleteResultsList'>\n" );
                foreach ( $result as $row ) {
                        $title = Title::makeTitleSafe( $row->ar_namespace, $row->ar_title );
                        if ( $title !== null ) {
@@ -300,7 +316,7 @@ class SpecialUndelete extends SpecialPage {
                                );
                        }
                        $revs = $this->msg( 'undeleterevisions' )->numParams( $row->count )->parse();
-                       $out->addHTML( "<li>{$item} ({$revs})</li>\n" );
+                       $out->addHTML( "<li class='undeleteResult'>{$item} ({$revs})</li>\n" );
                }
                $result->free();
                $out->addHTML( "</ul>\n" );
index e82279e..fea7e21 100644 (file)
@@ -25,6 +25,7 @@
  */
 
 use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * A special page that displays a list of pages that are not on anyones watchlist.
index b33aa7d..127b530 100644 (file)
@@ -387,7 +387,8 @@ class UserrightsPage extends SpecialPage {
                $user->invalidateCache();
 
                // update groups in external authentication database
-               Hooks::run( 'UserGroupsChanged', [ $user, $add, $remove, $this->getUser(), $reason ] );
+               Hooks::run( 'UserGroupsChanged', [ $user, $add, $remove, $this->getUser(),
+                       $reason, $oldUGMs, $newUGMs ] );
                MediaWiki\Auth\AuthManager::callLegacyAuthPlugin(
                        'updateExternalDBGroups', [ $user, $add, $remove ]
                );
index 5d7fa5d..c1c9ab0 100644 (file)
@@ -23,6 +23,7 @@
 
 use MediaWiki\MediaWikiServices;
 use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * A special page that lists last changes made to the wiki,
@@ -80,6 +81,7 @@ class SpecialWatchlist extends ChangesListSpecialPage {
                if ( ( $config->get( 'EnotifWatchlist' ) || $config->get( 'ShowUpdatedMarker' ) )
                        && $request->getVal( 'reset' )
                        && $request->wasPosted()
+                       && $user->matchEditToken( $request->getVal( 'token' ) )
                ) {
                        $user->clearAllNotifications();
                        $output->redirect( $this->getPageTitle()->getFullURL( $opts->getChangedValues() ) );
@@ -107,16 +109,12 @@ class SpecialWatchlist extends ChangesListSpecialPage {
        /**
         * @inheritdoc
         */
-       protected function registerFiltersFromDefinitions( array $definition ) {
-               foreach ( $definition as $groupName => &$groupDefinition ) {
-                       foreach ( $groupDefinition['filters'] as &$filterDefinition ) {
-                               if ( isset( $filterDefinition['showHideSuffix'] ) ) {
-                                       $filterDefinition['showHide'] = 'wl' . $filterDefinition['showHideSuffix'];
-                               }
-                       }
+       protected function transformFilterDefinition( array $filterDefinition ) {
+               if ( isset( $filterDefinition['showHideSuffix'] ) ) {
+                         $filterDefinition['showHide'] = 'wl' . $filterDefinition['showHideSuffix'];
                }
 
-               parent::registerFiltersFromDefinitions( $definition );
+               return $filterDefinition;
        }
 
        /**
@@ -142,8 +140,11 @@ class SpecialWatchlist extends ChangesListSpecialPage {
                $hideLiu->setDefault( $user->getBoolOption( 'watchlisthideliu' ) );
 
                $reviewStatus = $this->getFilterGroup( 'reviewStatus' );
-               $hidePatrolled = $reviewStatus->getFilter( 'hidepatrolled' );
-               $hidePatrolled->setDefault( $user->getBoolOption( 'watchlisthidepatrolled' ) );
+               if ( $reviewStatus !== null ) {
+                       // Conditional on feature being available and rights
+                       $hidePatrolled = $reviewStatus->getFilter( 'hidepatrolled' );
+                       $hidePatrolled->setDefault( $user->getBoolOption( 'watchlisthidepatrolled' ) );
+               }
 
                $authorship = $this->getFilterGroup( 'authorship' );
                $hideMyself = $authorship->getFilter( 'hidemyself' );
@@ -151,7 +152,10 @@ class SpecialWatchlist extends ChangesListSpecialPage {
 
                $changeType = $this->getFilterGroup( 'changeType' );
                $hideCategorization = $changeType->getFilter( 'hidecategorization' );
-               $hideCategorization->setDefault( $user->getBoolOption( 'watchlisthidecategorization' ) );
+               if ( $hideCategorization !== null ) {
+                       // Conditional on feature being available
+                       $hideCategorization->setDefault( $user->getBoolOption( 'watchlisthidecategorization' ) );
+               }
        }
 
        /**
@@ -165,10 +169,6 @@ class SpecialWatchlist extends ChangesListSpecialPage {
 
                $opts->add( 'days', $user->getOption( 'watchlistdays' ), FormOptions::FLOAT );
                $opts->add( 'extended', $user->getBoolOption( 'extendwatchlist' ) );
-               if ( $this->getRequest()->getVal( 'action' ) == 'submit' ) {
-                       // The user has submitted the form, so we dont need the default values
-                       return $opts;
-               }
 
                return $opts;
        }
@@ -214,6 +214,26 @@ class SpecialWatchlist extends ChangesListSpecialPage {
                        }
                }
 
+               if ( $this->getRequest()->getVal( 'action' ) == 'submit' ) {
+                       $allBooleansFalse = [];
+
+                       // If the user submitted the form, start with a baseline of "all
+                       // booleans are false", then change the ones they checked.  This
+                       // means we ignore the defaults.
+
+                       // This is how we handle the fact that HTML forms don't submit
+                       // unchecked boxes.
+                       foreach ( $this->filterGroups as $filterGroup ) {
+                               if ( $filterGroup instanceof ChangesListBooleanFilterGroup ) {
+                                       foreach ( $filterGroup->getFilters() as $filter ) {
+                                               $allBooleansFalse[$filter->getName()] = false;
+                                       }
+                               }
+                       }
+
+                       $params = $params + $allBooleansFalse;
+               }
+
                // Not the prettiest way to achieve this… FormOptions internally depends on data sanitization
                // methods defined on WebRequest and removing this dependency would cause some code duplication.
                $request = new DerivativeRequest( $this->getRequest(), $params );
@@ -641,6 +661,7 @@ class SpecialWatchlist extends ChangesListSpecialPage {
                                'id' => 'mw-watchlist-resetbutton' ] ) . "\n" .
                        Xml::submitButton( $this->msg( 'enotif_reset' )->text(),
                                [ 'name' => 'mw-watchlist-reset-submit' ] ) . "\n" .
+                       Html::hidden( 'token', $user->getEditToken() ) . "\n" .
                        Html::hidden( 'reset', 'all' ) . "\n";
                        foreach ( $nondefaults as $key => $value ) {
                                $form .= Html::hidden( $key, $value ) . "\n";
index 439b6ab..6f91c46 100644 (file)
@@ -21,6 +21,8 @@
  * @todo Use some variant of Pager or something; the pagination here is lousy.
  */
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * Implements Special:Whatlinkshere
  *
index f853f41..cfcbf65 100644 (file)
@@ -89,7 +89,7 @@ class LoginHelper extends ContextSource {
                }
 
                if ( $type === 'successredirect' ) {
-                       $redirectUrl = $returnToTitle->getFullURL( $returnToQuery, false, $proto );
+                       $redirectUrl = $returnToTitle->getFullUrlForRedirect( $returnToQuery, $proto );
                        $this->getOutput()->redirect( $redirectUrl );
                } else {
                        $this->getOutput()->addReturnTo( $returnToTitle, $returnToQuery, null, $options );
index 5126bad..1133625 100644 (file)
@@ -26,6 +26,7 @@
 use MediaWiki\MediaWikiServices;
 use Wikimedia\Rdbms\ResultWrapper;
 use Wikimedia\Rdbms\FakeResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
 
 class ContribsPager extends ReverseChronologicalPager {
 
index a1f6b84..78e1092 100644 (file)
@@ -129,7 +129,7 @@ class DeletedContribsPager extends IndexPager {
                $condition = [];
 
                $condition['ar_user_text'] = $this->target;
-               $index = 'usertext_timestamp';
+               $index = 'ar_usertext_timestamp';
 
                return [ $index, $condition ];
        }
index 3789dfa..47b059b 100644 (file)
@@ -193,7 +193,8 @@ class ImageListPager extends TablePager {
                }
                $sortable = [ 'img_timestamp', 'img_name', 'img_size' ];
                /* For reference, the indicies we can use for sorting are:
-                * On the image table: img_usertext_timestamp, img_size, img_timestamp
+                * On the image table: img_user_timestamp, img_usertext_timestamp,
+                * img_size, img_timestamp
                 * On oldimage: oi_usertext_timestamp, oi_name_timestamp
                 *
                 * In particular that means we cannot sort by timestamp when not filtering
index 4bf5dff..b781930 100644 (file)
@@ -55,6 +55,16 @@ class NewFilesPager extends ReverseChronologicalPager {
                $fields = [ 'img_name', 'img_user', 'img_timestamp' ];
                $options = [];
 
+               $user = $opts->getValue( 'user' );
+               if ( $user !== '' ) {
+                       $userId = User::idFromName( $user );
+                       if ( $userId ) {
+                               $conds['img_user'] = $userId;
+                       } else {
+                               $conds['img_user_text'] = $user;
+                       }
+               }
+
                if ( !$opts->getValue( 'showbots' ) ) {
                        $groupsWithBotPermission = User::getGroupsWithPermission( 'bot' );
 
index d5f5c28..dbcf568 100644 (file)
@@ -229,7 +229,6 @@ class RemexCompatMunger implements TreeHandler {
         * @param integer $sourceStart
         * @param integer $sourceLength
         */
-
        public function insertElement( $preposition, $refElement, Element $element, $void,
                $sourceStart, $sourceLength
        ) {
@@ -248,9 +247,10 @@ class RemexCompatMunger implements TreeHandler {
                        $newParent = $this->serializer->getParentNode( $parent );
                        $parent = $newParent;
                        $parentData = $parent->snData;
+                       $pElement = $parentData->childPElement;
                        $parentData->childPElement = null;
                        $newRef = $refElement->userData;
-                       // FIXME cannot call endTag() since we don't have an Element
+                       $this->endTag( $pElement, $sourceStart, 0 );
                } elseif ( $under && $parentData->isSplittable
                        && (bool)$parentData->ancestorPNode !== $inline
                ) {
@@ -425,7 +425,13 @@ class RemexCompatMunger implements TreeHandler {
        }
 
        public function endTag( Element $element, $sourceStart, $sourceLength ) {
+               $data = $element->userData->snData;
+               if ( $data->childPElement ) {
+                       $this->endTag( $data->childPElement, $sourceStart, 0 );
+               }
                $this->serializer->endTag( $element, $sourceStart, $sourceLength );
+               $element->userData->snData = null;
+               $element->userData = null;
        }
 
        public function doctype( $name, $public, $system, $quirks, $sourceStart, $sourceLength ) {
index 733c4ff..2c0afdf 100644 (file)
@@ -1359,7 +1359,10 @@ abstract class UploadBase {
                        $filename,
                        [ $this, 'checkSvgScriptCallback' ],
                        true,
-                       [ 'processing_instruction_handler' => 'UploadBase::checkSvgPICallback' ]
+                       [
+                               'processing_instruction_handler' => 'UploadBase::checkSvgPICallback',
+                               'external_dtd_handler' => 'UploadBase::checkSvgExternalDTD',
+                       ]
                );
                if ( $check->wellFormed !== true ) {
                        // Invalid xml (T60553)
@@ -1391,6 +1394,34 @@ abstract class UploadBase {
                return false;
        }
 
+       /**
+        * Verify that DTD urls referenced are only the standard dtds
+        *
+        * Browsers seem to ignore external dtds. However just to be on the
+        * safe side, only allow dtds from the svg standard.
+        *
+        * @param string $type PUBLIC or SYSTEM
+        * @param string $publicId The well-known public identifier for the dtd
+        * @param string $systemId The url for the external dtd
+        */
+       public static function checkSvgExternalDTD( $type, $publicId, $systemId ) {
+               // This doesn't include the XHTML+MathML+SVG doctype since we don't
+               // allow XHTML anyways.
+               $allowedDTDs = [
+                       'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd',
+                       'http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd',
+                       'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-basic.dtd',
+                       'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-tiny.dtd'
+               ];
+               if ( $type !== 'PUBLIC'
+                       || !in_array( $systemId, $allowedDTDs )
+                       || strpos( $publicId, "-//W3C//" ) !== 0
+               ) {
+                       return [ 'upload-scripted-dtd' ];
+               }
+               return false;
+       }
+
        /**
         * @todo Replace this with a whitelist filter!
         * @param string $element
index 865f630..2b13dd8 100644 (file)
@@ -225,7 +225,7 @@ class UploadFromUrl extends UploadBase {
                        // Well... that's not good!
                        wfDebugLog(
                                'fileupload',
-                               'Short write ' . $this->nbytes . '/' . strlen( $buffer ) .
+                               'Short write ' . $nbytes . '/' . strlen( $buffer ) .
                                        ' bytes, aborting with ' . $this->mFileSize . ' uploaded so far'
                        );
                        fclose( $this->mTmpHandle );
index 0acdb55..ef4537f 100644 (file)
@@ -1745,11 +1745,12 @@ class User implements IDBAccessObject {
                                        $this->blockTrigger = 'cookie-block';
                                        return $tmpBlock;
                                } 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 );
+                                       // If the block is not valid, remove the cookie.
+                                       Block::clearCookie( $this->getRequest()->response() );
                                }
+                       } else {
+                               // If the block doesn't exist, remove the cookie.
+                               Block::clearCookie( $this->getRequest()->response() );
                        }
                }
                return false;
@@ -3215,7 +3216,7 @@ class User implements IDBAccessObject {
 
        /**
         * Get the permissions this user has.
-        * @return array Array of String permission names
+        * @return string[] permission names
         */
        public function getRights() {
                if ( is_null( $this->mRights ) ) {
@@ -5265,6 +5266,13 @@ class User implements IDBAccessObject {
                                $this->mOptionOverrides = [];
                                $data = [];
                                foreach ( $res as $row ) {
+                                       // Convert '0' to 0. PHP's boolean conversion considers them both
+                                       // false, but e.g. JavaScript considers the former as true.
+                                       // @todo: T54542 Somehow determine the desired type (string/int/bool)
+                                       //  and convert all values here.
+                                       if ( $row->up_value === '0' ) {
+                                               $row->up_value = 0;
+                                       }
                                        $data[$row->up_property] = $row->up_value;
                                }
                        }
index 59ca31c..81a4083 100644 (file)
@@ -20,6 +20,8 @@
  * @file
  */
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * Represents a "user group membership" -- a specific instance of a user belonging
  * to a group. For example, the fact that user Mary belongs to the sysop group is a
index d801fa0..4df73f7 100644 (file)
@@ -20,6 +20,8 @@
  * @file
  */
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * Cut-down copy of User interface for local-interwiki-database
  * user rights manipulation.
index 43bccba..e107fb1 100644 (file)
@@ -1,4 +1,7 @@
 <?php
+
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * Allows iterating a large number of rows in batches transparently.
  * By default when iterated over returns the full query result as an
index a6e47c8..70afb91 100644 (file)
@@ -20,6 +20,7 @@
  * @file
  * @ingroup Maintenance
  */
+use Wikimedia\Rdbms\IDatabase;
 use \MediaWiki\MediaWikiServices;
 
 class BatchRowWriter {
index b1b8c73..1911c79 100644 (file)
@@ -131,7 +131,7 @@ class InterwikiSearchResultSetWidget implements SearchResultSetWidget {
                        : "";
 
                if ( isset( $this->customCaptions[$iwPrefix] ) ) {
-                       /* customCaptions composed by loadCustomCaptions() with pre-escaped content.*/
+                       /* customCaptions composed by loadCustomCaptions() with pre-escaped content. */
                        $caption = $this->customCaptions[$iwPrefix];
                } else {
                        $interwiki = $this->iwLookup->fetch( $iwPrefix );
index 228c5c4..f7771d1 100644 (file)
@@ -20,7 +20,6 @@
                "resources/src/mediawiki.toolbar",
                "resources/src/mediawiki.widgets",
                "resources/src/jquery/jquery.accessKeyLabel.js",
-               "resources/src/jquery/jquery.arrowSteps.js",
                "resources/src/jquery/jquery.autoEllipsis.js",
                "resources/src/jquery/jquery.badge.js",
                "resources/src/jquery/jquery.byteLength.js",
index 7721015..6286a2b 100644 (file)
@@ -865,12 +865,9 @@ class LanguageConverter {
                $this->mTables = false;
                $cache = ObjectCache::getInstance( $wgLanguageConverterCacheType );
                if ( $fromCache ) {
-                       wfProfileIn( __METHOD__ . '-cache' );
                        $this->mTables = $cache->get( $this->mCacheKey );
-                       wfProfileOut( __METHOD__ . '-cache' );
                }
                if ( !$this->mTables || !array_key_exists( self::CACHE_VERSION_KEY, $this->mTables ) ) {
-                       wfProfileIn( __METHOD__ . '-recache' );
                        // not in cache, or we need a fresh reload.
                        // We will first load the default tables
                        // then update them using things in MediaWiki:Conversiontable/*
@@ -884,7 +881,6 @@ class LanguageConverter {
                        $this->mTables[self::CACHE_VERSION_KEY] = true;
 
                        $cache->set( $this->mCacheKey, $this->mTables, 43200 );
-                       wfProfileOut( __METHOD__ . '-recache' );
                }
        }
 
index b413ef9..bd42a12 100644 (file)
@@ -33,7 +33,7 @@ class LanguageAz extends Language {
         * @return mixed|string
         */
        public function ucfirst( $string ) {
-               if ( $string[0] == 'i' ) {
+               if ( substr( $string, 0, 1 ) === 'i' ) {
                        return 'İ' . substr( $string, 1 );
                }
                return parent::ucfirst( $string );
index 3605e8d..3a50987 100644 (file)
@@ -391,7 +391,7 @@ class LanguageKk extends LanguageKk_cyrl {
         * @return string
         */
        public function ucfirst( $string ) {
-               if ( $string[0] == 'i' ) {
+               if ( substr( $string, 0, 1 ) === 'i' ) {
                        $variant = $this->getPreferredVariant();
                        if ( $variant == 'kk-latn' || $variant == 'kk-tr' ) {
                                return 'İ' . substr( $string, 1 );
@@ -408,7 +408,7 @@ class LanguageKk extends LanguageKk_cyrl {
         * @return string
         */
        function lcfirst( $string ) {
-               if ( $string[0] == 'I' ) {
+               if ( substr( $string, 0, 1 ) === 'I' ) {
                        $variant = $this->getPreferredVariant();
                        if ( $variant == 'kk-latn' || $variant == 'kk-tr' ) {
                                return 'ı' . substr( $string, 1 );
index 1c350d0..39e02e6 100644 (file)
@@ -71,6 +71,7 @@ class Names {
                'as' => 'অসমীয়া', # Assamese
                'ase' => 'American sign language', # American sign language
                'ast' => 'asturianu', # Asturian
+               'atj' => 'Atikamekw', # Atikamekw
                'av' => 'авар', # Avar
                'avk' => 'Kotava', # Kotava
                'awa' => 'अवधी', # Awadhi
index 3a9db73..97936dc 100644 (file)
@@ -62,9 +62,9 @@
        "tog-ccmeonemails": "Stuur my 'n kopie van die e-pos wat ek aan ander stuur",
        "tog-diffonly": "Moenie 'n bladsy se inhoud onder die wysigingsverskil wys nie",
        "tog-showhiddencats": "Wys versteekte kategorië",
-       "tog-norollbackdiff": "Laat verskille weg na terugrol",
+       "tog-norollbackdiff": "Moenie verskille wys as teruggerol word nie",
        "tog-useeditwarning": "Waarsku my as ek 'n gewysigde bladsy verlaat voordat dit gestoor is",
-       "tog-prefershttps": "Gebruik altyd 'n beveiligde verbinding wanneer aangemeld is",
+       "tog-prefershttps": "Gebruik altyd 'n beveiligde verbinding terwyl aangemeld is",
        "underline-always": "Altyd",
        "underline-never": "Nooit",
        "underline-default": "Omslag of webblaaier se verstekwaarde",
        "newwindow": "(verskyn in nuwe venster)",
        "cancel": "Kanselleer",
        "moredotdotdot": "Meer…",
-       "morenotlisted": "Die lys is nie volledig nie.",
+       "morenotlisted": "Dié lys is dalk onvolledig.",
        "mypage": "Gebruikersblad",
        "mytalk": "Bespreking",
        "anontalk": "Bespreking",
        "searcharticle": "Wys",
        "history": "Bladsygeskiedenis",
        "history_short": "Geskiedenis",
+       "history_small": "geskiedenis",
        "updatedmarker": "opgedateer sedert my laaste besoek",
        "printableversion": "Drukbare weergawe",
        "permalink": "Permanente skakel",
        "createacct-reason": "Rede",
        "createacct-reason-ph": "Hoekom u nog 'n rekening skep",
        "createacct-submit": "Skep u rekening",
-       "createacct-another-submit": "Skep nog 'n rekening",
+       "createacct-another-submit": "Skep 'n rekening",
+       "createacct-continue-submit": "Gaan voort om 'n rekening te skep",
+       "createacct-another-continue-submit": "Gaan voort om 'n rekening te skep",
        "createacct-benefit-heading": "{{SITENAME}} word deur mense soos u geskep.",
        "createacct-benefit-body1": "{{PLURAL:$1|wysiging|wysigings}}",
        "createacct-benefit-body2": "{{PLURAL:$1|bladsy|bladsye}}",
        "nocookieslogin": "{{SITENAME}} gebruik koekies vir die aanmeld van gebruikers.\nU blaaier laat nie koekies toe nie.\nSkakel dit asseblief aan en probeer weer.",
        "nocookiesfornew": "Die gebruiker is nie geskep nie omdat die oorsprong nie bevestig kon word nie.\nMaak seker dat u koekies aangeskakel het, herlaai die bladsy en probeer dan weer.",
        "noname": "Ongeldige gebruikersnaam.",
-       "loginsuccesstitle": "Suksesvolle aanmelding",
+       "loginsuccesstitle": "Aangemeld",
        "loginsuccess": "U is nou by {{SITENAME}} as \"$1\" ingeteken.",
-       "nosuchuser": "Die gebruiker \"$1\" bestaan nie.\nGebruikersname is gevoelig vir hoofletters.\nMaak seker dit is reg gespel of [[Special:CreateAccount|skep 'n nuwe rekening]].",
+       "nosuchuser": "Die gebruikernaam \"$1\" bestaan nie.\nGebruikername is gevoelig vir hoofletters.\nMaak seker dit is reg gespel of [[Special:CreateAccount|skep 'n nuwe rekening]].",
        "nosuchusershort": "Daar is geen gebruikersnaam \"$1\" nie. Maak seker dit is reg gespel.",
        "nouserspecified": "U moet 'n gebruikersnaam spesifiseer.",
        "login-userblocked": "Hierdie gebruiker is geblokkeer.\nIntekening word verbied.",
        "searchprofile-advanced-tooltip": "Soek in spesifieke naamruimtes",
        "search-result-size": "$1 ({{PLURAL:$2|1 woord|$2 woorde}})",
        "search-result-category-size": "{{PLURAL:$1|1 kategorielid|$1 kategorielede}} ({{PLURAL:$2|1 subkategorie|$2 subkategorieë}}, {{PLURAL:$3|1 lêer|$3 lêers}})",
-       "search-redirect": "(aanstuur $1)",
+       "search-redirect": "(aangestuur vanaf $1)",
        "search-section": "(afdeling $1)",
        "search-category": "(kategorie $1)",
        "search-file-match": "(stem ooreen met die inhoud van die leêr)",
        "prefs-watchlist-token": "Dophoulys-sleutel:",
        "prefs-misc": "Allerlei",
        "prefs-resetpass": "Verander wagwoord",
-       "prefs-changeemail": "Wysig E-posadres",
+       "prefs-changeemail": "Wysig of verwyder e-posadres",
        "prefs-setemail": "Stel 'n e-posadres",
        "prefs-email": "E-posopsies",
        "prefs-rendering": "Voorkoms",
        "saveprefs": "Stoor voorkeure",
-       "restoreprefs": "Herstel voorkeure",
+       "restoreprefs": "Herstel alle verstekvoorkeure (in alle afdelings)",
        "prefs-editing": "Wysigings",
        "searchresultshead": "Soekresultate",
-       "stub-threshold": "Drempel vir merk as <a href=\"#\" class=\"stub\">saadjie</a> (grepe):",
+       "stub-threshold": "Drempel vir formatering van saadjies ($1):",
        "stub-threshold-sample-link": "voorbeeld",
        "stub-threshold-disabled": "Afgeskakel",
        "recentchangesdays": "Aantal dae wat in onlangse wysigings vertoon word:",
        "youremail": "E-posadres:",
        "username": "{{GENDER:$1|Gebruikersnaam}}:",
        "prefs-memberingroups": "{{GENDER:$2|Lid}} van {{PLURAL:$1|groep|groepe}}:",
+       "group-membership-link-with-expiry": "$1 (tot $2)",
        "prefs-registration": "Registrasiedatum:",
        "yourrealname": "Regte naam:",
        "yourlanguage": "Taal:",
        "prefs-help-signature": "Kommentaar op besprekingsbladsye moet met \"<nowiki>~~~~</nowiki>\" onderteken word.\nDie tildes word in u handtekening omgeskakel en die datum en tyd word insluit.",
        "badsig": "Ongeldige handtekening; gaan HTML na.",
        "badsiglength": "U handtekening is te lank.\nDit mag nie meer as $1 {{PLURAL:$1|karakter|karakters}} bevat nie.",
-       "yourgender": "Geslag:",
-       "gender-unknown": "Ek wil nie sê nie",
+       "yourgender": "Hoe wil u beskryf word?",
+       "gender-unknown": "Die sagteware sal sover mootlik geslagneutrale woorde gebruik om na u te verwys",
        "gender-male": "Hy bewerk wikiblaaie",
        "gender-female": "Sy bewerk wikiblaaie",
        "prefs-help-gender": "Opsioneel: dit word gebruik om gebruikers korrek aan te spreek in die sagteware.\nDie inligting is vir ander gebruikers sigbaar.",
        "email": "E-pos",
-       "prefs-help-realname": "Regte naam is opsioneel.\nAs u dit verskaf, sal dit gebruik word om erkenning vir u werk te gee.",
+       "prefs-help-realname": "Regte naam is opsioneel.\nAs u dit verskaf, kan dit gebruik word om erkenning vir u werk te gee.",
        "prefs-help-email": "E-posadres is opsioneel, maar is nodig om u wagwoord aan u te stuur sou u dit vergeet.",
        "prefs-help-email-others": "U kan ook kies om ander toe te laat om u deur u gebruikers- en besprekingsbladsy te kontak sonder om u identiteit te openbaar.",
        "prefs-help-email-required": "E-pos adres word benodig.",
        "recentchanges-legend-heading": "<strong>Sleutel:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (sien ook die [[Special:NewPages|lys van nuwe bladsye]])",
        "recentchanges-submit": "Wys",
+       "rcfilters-filter-registered-label": "Geregistreer",
+       "rcfilters-filter-registered-description": "Aangemelde redigeerders.",
+       "rcfilters-filter-unregistered-label": "Ongeregistreer",
+       "rcfilters-filter-unregistered-description": "Redigeerders wat nie aangemeld is nie.",
+       "rcfilters-filter-user-experience-level-newcomer-label": "Nuwelinge",
+       "rcfilters-filter-user-experience-level-newcomer-description": "Minder as 10 wysigings en 4 dae van aktiwiteit.",
        "rcnotefrom": "Wysigings sedert <strong>$2</strong> (maksimum van <strong>$1</strong> word gewys).",
        "rclistfrom": "Vertoon wysigings vanaf $3 $2",
        "rcshowhideminor": "$1 klein wysigings",
        "apisandbox-submit": "Maak versoek",
        "apisandbox-reset": "Vee uit",
        "apisandbox-retry": "Herprobeer",
-       "apisandbox-examples": "Voorbeeld",
-       "apisandbox-results": "Resultaat",
+       "apisandbox-examples": "Voorbeelde",
+       "apisandbox-results": "Resultate",
        "apisandbox-request-url-label": "Versoek-URL:",
        "apisandbox-request-time": "Versoektyd: $1",
        "booksources": "Boekbronne",
        "exif-compression-3": "CCITT Groep 3 fakskodering",
        "exif-compression-4": "CCITT Groep 4 fakskodering",
        "exif-copyrighted-true": "Onder kopiereg",
-       "exif-copyrighted-false": "Publieke Domein",
+       "exif-copyrighted-false": "Kopieregstatus nie gespesifiseer nie",
        "exif-unknowndate": "Datum onbekend",
        "exif-orientation-1": "Normaal",
        "exif-orientation-2": "Horisontaal gespieël",
        "feedback-submit": "Dien in",
        "feedback-thanks": "Dankie! U terugvoer is op die bladsy \"[$2 $1]\" geplaas.",
        "feedback-thanks-title": "Baie dankie!",
-       "searchsuggest-search": "Soek",
+       "searchsuggest-search": "Deursoek {{SITENAME}}",
        "searchsuggest-containing": "bevat...",
        "api-error-badtoken": "Interne fout: slegte teken.",
        "api-error-emptypage": "Die skep van leë nuwe bladsye word nie toegelaat nie.",
        "expand_templates_generate_xml": "Wys XML-ontledingsboom",
        "expand_templates_generate_rawhtml": "Wys rou HTML",
        "expand_templates_preview": "Voorskou",
+       "pagelanguage": "Verander bladsytaal",
        "pagelang-name": "Bladsy",
        "pagelang-language": "Taal",
        "pagelang-use-default": "Gebruik standaard taal",
        "pagelang-select-lang": "Kies taal",
+       "pagelang-reason": "Rede",
        "pagelang-submit": "Dien in",
+       "pagelang-nonexistent-page": "Die bladsy $1 bestaan nie.",
        "right-pagelang": "Wysig die taal van die bladsy",
        "log-name-pagelang": "Logboek van taalwysigings",
        "log-description-pagelang": "Hierdie is 'n logboek van wysigings van die taal van bladsye.",
        "special-characters-group-thai": "Thai",
        "special-characters-group-lao": "Laosiaans",
        "special-characters-group-khmer": "Khmer",
+       "special-characters-title-endash": "en-strepie",
+       "special-characters-title-emdash": "em-strepie",
        "special-characters-title-minus": "minusteken",
        "mw-widgets-dateinput-no-date": "Geen datum gekies nie",
        "mw-widgets-dateinput-placeholder-day": "JJJJ-MM-DD",
        "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",
+       "mw-widgets-categoryselector-add-category-placeholder": "Voeg 'n kategorie by...",
+       "mw-widgets-usersmultiselect-placeholder": "Voeg nog by...",
        "sessionprovider-generic": "$1-sessies",
        "log-action-filter-all": "Alle",
        "authmanager-email-label": "E-pos",
index d851261..231ab22 100644 (file)
        "post-expand-template-argument-warning": "'''تحذير:''' هذه الصفحة تحتوي على عامل قالب واحد على الأقل له حجم تمدد كبير جدا.\nهذه العوامل تم حذفها.",
        "post-expand-template-argument-category": "تجاوزات معطيات القوالب",
        "parser-template-loop-warning": "تم كشف حلقة قالب: [[$1]]",
+       "template-loop-category": "الصفحات بحلقات قالب",
+       "template-loop-category-desc": "الصفحة تحتوي على حلقة قالب، أي أن القالب يستدعي نفسه.",
        "parser-template-recursion-depth-warning": "تم تجاوز حد عمق فرد القوالب ($1)",
        "language-converter-depth-warning": "تم تخطي حد عمق محول اللغة ($1)",
        "node-count-exceeded-category": "تجاوزات تعداد العقد",
        "page_first": "الأولى",
        "page_last": "الأخيرة",
        "histlegend": "اختيار الفرق: علم على صناديق النسخ للمقارنة واضغط قارن بين النسخ المختارة أو الزر بالأسفل.<br />\nمفتاح: (الحالي) = الفرق مع النسخة الحالية\n(السابق) = الفرق مع النسخة السابقة، ط = تغيير طفيف",
-       "history-fieldset-title": "تصÙ\81Ø­ Ø§Ù\84تارÙ\8aØ®",
+       "history-fieldset-title": "اÙ\84بحث Ø¹Ù\86 Ø§Ù\84Ù\85راجعات",
        "history-show-deleted": "المحذوفة فقط",
        "histfirst": "الأقدم",
        "histlast": "الأحدث",
        "saveusergroups": "احفظ مجموعات {{GENDER:$1|المستخدم|المستخدمة}}",
        "userrights-groupsmember": "عضو في:",
        "userrights-groupsmember-auto": "عضو ضمني في:",
-       "userrights-groups-help": "يمكنك تغيير المجموعات التي ينتمي هذا المستخدم إليها:\n* يعني الصندوق المعلم أن المستخدم في هذه المجموعة.\n* يعني الصندوق غير المعلم أن المستخدم ليس في هذه المجموعة.\n* تعني علامة * عدم إمكانية إزالة المجموعة متى ما أضفتها، أو العكس.\n* تعن علامة # أنه يمكنك فقط تحديد تاريخ الانتهاء لهذه المجموعة؛ لكن لا يمكنك تقديمه بعد تحديده.",
+       "userrights-groups-help": "يمكنك تغيير المجموعات التي ينتمي هذا المستخدم إليها:\n* يعني الصندوق المعلم أن المستخدم ضمن هذه المجموعة.\n* يعني الصندوق غير المعلم أن المستخدم ليس في هذه المجموعة.\n* تعني علامة * عدم إمكانية إزالة المجموعة متى ما أضفتها أو العكس.\n* تعني علامة # أنه يمكنك فقط تحديد تاريخ الانتهاء لعضوية هذه المجموعة؛ لكن لا يمكنك تقديمه بعد تحديده.",
        "userrights-reason": "السبب:",
        "userrights-no-interwiki": "أنت لا تمتلك الصلاحية لتعديل صلاحيات المستخدمين على الويكيات الأخرى.",
        "userrights-nodatabase": "قاعدة البيانات $1 غير موجودة أو ليست محلية.",
        "userrights-expiry-options": "1 يوم:1 day,1 أسبوع:1 week,1 شهر:1 month,3 شهور:3 months,6 شهور:6 months,1 سنة:1 year",
        "userrights-invalid-expiry": "تاريخ انتهاء المجموعة \"$1\" غير صحيح.",
        "userrights-expiry-in-past": "تاريخ انتهاء المجموعة \"$1\" هو في الماضي.",
-       "userrights-cannot-shorten-expiry": "أنت لا يمكنك تقديم تاريخ الانتهاء للمجموعة \"$1\". فقط المستخدمون الذين يمتلكون السماح لإضافة وإزالة هذه المجموعة يمكنهم تقديم تواريخ الانتهاء.",
+       "userrights-cannot-shorten-expiry": "أنت لا يمكنك تقديم تاريخ الانتهاء لعضوية المجموعة \"$1\". فقط المستخدمون الذين يمتلكون السماح لإضافة وإزالة هذه المجموعة يمكنهم تقديم تواريخ الانتهاء.",
        "userrights-conflict": "تضارب في تغيير صلاحيات المستخدم! الرجاء مراجعة تغييراتك مجدّدا وتأكيدها.",
        "group": "المجموعة:",
        "group-user": "مستخدمون",
        "rcfilters-invalid-filter": "مرشح غير صحيح",
        "rcfilters-empty-filter": "لا مرشحات فعالة. كل المساهمات معروضة.",
        "rcfilters-filterlist-title": "مرشحات",
+       "rcfilters-filterlist-whatsthis": "ما هذا؟",
        "rcfilters-filterlist-feedbacklink": "تقديم مراجعات لمرشحات (بيتا) الجديدة",
        "rcfilters-highlightbutton-title": "التعليم على النتائج",
        "rcfilters-highlightmenu-title": "اختر لونًا",
        "rcfilters-highlightmenu-help": "اختر لونا للتعليم على هذه الخاصية",
        "rcfilters-filterlist-noresults": "لم يتم العثور على مرشحات",
+       "rcfilters-noresults-conflict": "لا نتائج تم العثور عليها لأن محددات البحث تعارض بعضها البعض",
+       "rcfilters-state-message-subset": "هذا المرشح ليس له تأثير لأن نتائجه متضمنة في {{PLURAL:$2|المرشح التالي|المرشحات التالية}} الأكثر عمومية (جرب التعليم لتمييزه): $1",
+       "rcfilters-state-message-fullcoverage": "اختيار كل المرشحات في مجموعة له نفس التأثير كاختيار لا شيء، لذا فهذا المرشح ليس له تأثير. المجموعة تتضمن: $1",
        "rcfilters-filtergroup-registration": "تسجيل المستخدم",
        "rcfilters-filter-registered-label": "مسجل",
        "rcfilters-filter-registered-description": "المحررون مسجلو الدخول.",
        "rcfilters-filter-unregistered-label": "غير مسجل",
        "rcfilters-filter-unregistered-description": "المحررون غير مسجلي الدخول.",
-       "rcfilters-filter-unregistered-conflicts-user-experience-level": "Ù\85رشح \"غÙ\8aر Ø§Ù\84Ù\85جÙ\84Ù\8aÙ\86\" ØºÙ\8aر Ù\86شط Ù\84Ø£Ù\86 ØªØ£Ø«Ù\8aرÙ\87 Ù\85Ù\84غÙ\89 Ø¨Ù\88اسطة  {{PLURAL:$2|Ù\85رشح|Ù\85رشحات}} Ø§Ù\84خبرة، و {{PLURAL:$2|الذي يعطي|التي تعطي}} فقط المستخدمين المسجلين: $1",
+       "rcfilters-filter-unregistered-conflicts-user-experience-level": "Ù\87ذا Ø§Ù\84Ù\85رشح Ù\8aتعارض Ù\85ع {{PLURAL:$2|Ù\85رشح Ø§Ù\84خبرة Ø§Ù\84تاÙ\84Ù\8a\85رشحات Ø§Ù\84خبرة Ø§Ù\84تاÙ\84Ù\8aØ©}}، و {{PLURAL:$2|الذي يعطي|التي تعطي}} فقط المستخدمين المسجلين: $1",
        "rcfilters-filtergroup-authorship": "ملكية التعديلات",
        "rcfilters-filter-editsbyself-label": "تعديلاتك الشخصية",
        "rcfilters-filter-editsbyself-description": "التعديلات بواسطتك.",
        "rcfilters-filter-editsbyother-label": "التعديلات بواسطة الآخرين",
        "rcfilters-filter-editsbyother-description": "التعديلات المنشأة بواسطة المستخدمين الآخرين (ليس أنت).",
        "rcfilters-filtergroup-userExpLevel": "مستوى الخبرة (للمستخدمين المسجلين فقط)",
-       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "Ù\87ذا Ø§Ù\84Ù\85رشح ØºÙ\8aر Ù\81عاÙ\84 Ù\84Ø£Ù\86Ù\87 Ù\8aعطÙ\8a Ù\81Ù\82Ø· Ø§Ù\84Ù\85ستخدÙ\85Ù\8aÙ\86 Ø§Ù\84Ù\85سجÙ\84Ù\8aÙ\86Ø\8c Ù\84ذا Ù\81Ù\85رشح \"غÙ\8aر Ø§Ù\84Ù\85سجÙ\84Ù\8aÙ\86\" Ù\8aÙ\84غÙ\8a ØªØ£Ø«Ù\8aرÙ\87.",
-       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "Ù\85رشح \"غÙ\8aر Ø§Ù\84Ù\85سجÙ\84Ù\8aÙ\86\" Ù\81Ù\8a Ø­Ø§Ù\84Ø© ØªØ¹Ø§Ø±Ø¶ Ù\85ع Ù\88احد Ø£Ù\88 Ø£Ù\83ثر Ù\85Ù\86 Ù\85رشحات Ø§Ù\84خبرة. Ù\85رشحات Ø§Ù\84خبرة ØªØ¹Ø·Ù\8a Ø§Ù\84Ù\85ستخدÙ\85Ù\8aÙ\86 Ø§Ù\84Ù\85سجÙ\84Ù\8aÙ\86 Ù\81Ù\82Ø·. Ø§Ù\84Ù\85رشحات Ø§Ù\84Ù\85تعارضة Ù\85عÙ\84Ù\85 Ø¹Ù\84Ù\8aÙ\87ا Ù\83غÙ\8aر Ù\86شطة بالأعلى.",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "Ù\85رشحات Ø§Ù\84خبرة ØªØ¹Ø·Ù\8a Ù\81Ù\82Ø· Ø§Ù\84Ù\85ستخدÙ\85Ù\8aÙ\86 Ø§Ù\84Ù\85سجÙ\84Ù\8aÙ\86Ø\8c Ù\84ذا Ù\81Ù\87ذا Ø§Ù\84Ù\85رشح Ù\8aتعارض Ù\85ع Ù\85رشح \"غÙ\8aر Ø§Ù\84Ù\85سجÙ\84Ù\8aÙ\86\".",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "Ù\85رشح \"غÙ\8aر Ø§Ù\84Ù\85سجÙ\84Ù\8aÙ\86\" Ù\8aتعارض Ù\85ع Ù\88احد Ø£Ù\88 Ø£Ù\83ثر Ù\85Ù\86 Ù\85رشحات Ø§Ù\84خبرةØ\8c Ù\88اÙ\84تÙ\8a ØªØ¹Ø·Ù\8a Ø§Ù\84Ù\85ستخدÙ\85Ù\8aÙ\86 Ø§Ù\84Ù\85سجÙ\84Ù\8aÙ\86 Ù\81Ù\82Ø·. Ø§Ù\84Ù\85رشحات Ø§Ù\84Ù\85تعارضة Ù\85عÙ\84Ù\85 Ø¹Ù\84Ù\8aÙ\87ا Ù\81Ù\8a Ù\85ساحة Ø§Ù\84Ù\85رشحات Ø§Ù\84Ù\86شطةØ\8c بالأعلى.",
        "rcfilters-filter-user-experience-level-newcomer-label": "القادمون الجدد",
        "rcfilters-filter-user-experience-level-newcomer-description": "أقل من 10 تعديلات و4 أيام من النشاط.",
        "rcfilters-filter-user-experience-level-learner-label": "المتعلمون",
        "rcfilters-filter-categorization-description": "سجلات إضافة أو إزالة الصفحات من التصنيفات.",
        "rcfilters-filter-logactions-label": "الأفعال المسجلة",
        "rcfilters-filter-logactions-description": "الأفعال الإدارية، إنشاء الحسابات، حذف الصفحات، عمليات الرفع....",
+       "rcfilters-hideminor-conflicts-typeofchange-global": "مرشح \"التعديلات الطفيفة\" يتعارض مع مرشح واحد أو أكثر من مرشحات نوع التغيير، وذلك لأن بعض أنواع التغيير لا يمكن التعليم عليها ك\"طفيفة.\" المرشحات المتعارضة معلم عليها في مساحة المرشحات النشطة بالأعلى.",
+       "rcfilters-hideminor-conflicts-typeofchange": "بعض أنواع التغييرات لا يمكن التعليم عليها ك\"طفيفة،\" لذا فهذا المرشح يتعارض مع مرشحات نوع التغيير التالية: $1",
+       "rcfilters-typeofchange-conflicts-hideminor": "مرشح نوع التغيير هذا يتعارض مع مرشح \"التعديلات الطفيفة\". بعض أنواع التغييرات لا يمكن التعليم عليها ك\"طفيفة.\"",
        "rcnotefrom": "بالأسفل {{PLURAL:$5|التغيير|التغييرات}} منذ <strong>$2</strong> (إلى <strong>$1</strong> معروضة).",
+       "rclistfromreset": "إعادة ضبط خيار التاريخ",
        "rclistfrom": "أظهر التغييرات بدء من $3 $2",
        "rcshowhideminor": "$1 التعديلات الطفيفة",
        "rcshowhideminor-show": "أظهر",
        "php-uploaddisabledtext": "رفع ملفات PHP معطل. من فضلك تحقق من إعدادات رفع الملفات.",
        "uploadscripted": "هذا الملف يضم كود HTML أو كود آخر يمكن أن يفسره متصفح الوب بطريقة خاطئة.",
        "upload-scripted-pi-callback": "لا يمكن رفع ملف يحتوي على تعليمة معالجة XML-stylesheet",
+       "upload-scripted-dtd": "لا يمكن رفع ملفات SVG التي تحتوي على إعلان DTD غير قياسي.",
        "uploaded-script-svg": "تم العثور على عنصر سكريبت \"$1\" في ملف الSVG المرفوع.",
        "uploaded-hostile-svg": "تم العثور على CSS غير آمن في عنصر الشكل في ملف الSVG المرفوع.",
        "uploaded-event-handler-on-svg": "ضبط سمات معالج الأحداث <code>$1=\"$2\"</code> غير مسموح به في ملفات SVG.",
        "undeleteviewlink": "اعرض",
        "undeleteinvert": "اعكس الاختيار",
        "undeletecomment": "السبب:",
-       "undeletedrevisions": "تم استرجاع {{PLURAL:$1||تعديل واحد|تعديلين|$1 تعديلات|$1 تعديلا|$1 تعديل}}",
-       "undeletedrevisions-files": "أسترجعت {{PLURAL:$1||مراجعة واحدة|مراجعتان|$1 مراجعات|$1 مراجعة}}  و{{PLURAL:$2||ملف واحد|ملفان|$2 ملفات|$2 ملفًا|$2 ملف}}",
-       "undeletedfiles": "أسترجع {{PLURAL:$1||ملف واحد|ملفان|$1 ملفات|$1 ملفًا|$1 ملف}}",
        "cannotundelete": "بعض أو كل عملية الاسترجاع فشلت:\n$1",
        "undeletedpage": "'''تم استرجاع $1'''\n\nراجع [[Special:Log/delete|سجل الحذف]] لمعاينة عمليات الحذف والاسترجاعات الحديثة.",
        "undelete-header": "انظر الصفحات المحذوفة حديثا في [[Special:Log/delete|سجل الحذف]].",
        "markedaspatrollederror": "لا يمكن التعليم بالمراجعة",
        "markedaspatrollederrortext": "يجب عليك اختيار المراجعة التي تريد أن تشير أنها مراجعة",
        "markedaspatrollederror-noautopatrol": "لا يجوز لك تعليم تغييراتك الشخصية بعلامة المراجعة.",
-       "markedaspatrollednotify": "هذا التغيير لـ $1  تم تعليمه كمراقب.",
+       "markedaspatrollednotify": "هذا التغيير لـ $1  تم تعليمه كمراجَع.",
        "markedaspatrollederrornotify": "لم ينجح وسم هذه النسخة بأنها مراجعة",
        "patrol-log-page": "سجل الخفر",
        "patrol-log-header": "هذا سجل بالمراجعات المراجعة.",
        "newimages-summary": "هذه الصفحة الخاصة تعرض آخر الملفات المرفوعة.",
        "newimages-legend": "المرشح",
        "newimages-label": "اسم الملف (أو جزء منه):",
+       "newimages-user": "عنوان الأيبي أو اسم المستخدم",
        "newimages-showbots": "أظهر التحميلات بواسطة البوتات",
        "newimages-hidepatrolled": "أخف المرفوعات المنظورة",
        "noimages": "لا شيء للعرض.",
        "special-characters-group-thai": "تايلندية",
        "special-characters-group-lao": "لاوية",
        "special-characters-group-khmer": "خميرية",
+       "special-characters-group-canadianaboriginal": "كندي أصلي",
        "special-characters-title-endash": "واصلة قصيرة",
        "special-characters-title-emdash": "واصلة طويلة",
        "special-characters-title-minus": "علامة الطرح",
        "restrictionsfield-label": "نطاقات الأيبي المسموح بها:",
        "restrictionsfield-help": "عنوان أيبي أو نطاق CIDR واحد لكل سطر. لتفعيل كل شيء، استخدم:\n<pre>0.0.0.0/0\n::/0</pre>",
        "revid": "المراجعة $1",
-       "pageid": "معرف الصفحة $1"
+       "pageid": "معرف الصفحة $1",
+       "rawhtml-notallowed": "لا يمكن استخدام وسوم &lt;html&gt; خارج الصفحات العادية.",
+       "gotointerwiki": "ترك {{SITENAME}}",
+       "gotointerwiki-invalid": "العنوان المحدد كان غير صحيح.",
+       "gotointerwiki-external": "أنت على وشك ترك {{SITENAME}} لزيارة [[$2]] والذي هو موقع منفصل.\n\n[$1 اضغط هنا للاستمرار إلى $1].",
+       "undelete-cantedit": "أنت لا يمكنك استرجاع هذه الصفحة حيث أنه لا يمكنك تعديل هذه الصفحة.",
+       "undelete-cantcreate": "أنت لا يمكنك استرجاع هذه الصفحة حيث أنه لا توجد صفحة بهذا الاسم وأنت غير مسموح لك بإنشاء هذه الصفحة."
 }
index 0120e9b..9de4469 100644 (file)
@@ -10,7 +10,8 @@
                        "Ramsis II",
                        "아라",
                        "Oldstoneage",
-                       "Macofe"
+                       "Macofe",
+                       "Abdelrhaman Eid"
                ]
        },
        "tog-underline": "حط خط تحت اللينكات:",
        "externaldberror": "يا إما فى حاجة غلط فى الدخول على قاعدة البيانات الخارجية أو انت مش مسموح لك تعمل تحديث لحسابك الخارجي.",
        "login": "دخول",
        "nav-login-createaccount": "تسجيل دخول / فتح حساب",
-       "userlogin": "دخول / فتح حساب",
-       "userloginnocreate": "دخول",
        "logout": "خروج",
        "userlogout": "خروج",
        "notloggedin": "انت مش مسجل دخولك",
        "userlogin-noaccount": "معندكش حساب؟",
        "userlogin-joinproject": "انضم ل {{SITENAME}}",
-       "nologin": "معندكش حساب؟ '''$1'''.",
-       "nologinlink": "افتح حساب",
        "createaccount": "افتح حساب",
-       "gotaccount": "عندك حساب؟ '''$1'''.",
-       "gotaccountlink": "دخول",
-       "userlogin-resetlink": "نسيت تفاصيل الدخول؟",
        "userlogin-helplink2": "مساعده ف الدخول",
        "createacct-email-ph": "أكتب عنوان الإيميل بتاعك",
        "createaccountmail": "استخدم باسورد مؤقته و إبعتها ع الايميل المحدد ده",
-       "createaccountreason": "السبب:",
        "createacct-reason": "سبب:",
        "createacct-submit": "افتح حسابك",
        "createacct-benefit-body1": "$1 {{PLURAL:$1|تعديل|تعديلات}}",
        "logentry-newusers-create": "تم فتح حساب {{GENDER:$2|اليوزر|اليوزره}} $1",
        "logentry-upload-upload": " {{GENDER:$2|رفع|اترفعت}} $1 $3",
        "rightsnone": "(فاضى)",
-       "revdelete-summary": "ملخص التعديل",
        "searchsuggest-search": "تدوير",
        "searchsuggest-containing": "جوّاه...",
        "expandtemplates": "تكبير القوالب",
index 49ac8bd..23d0b1d 100644 (file)
        "post-expand-template-argument-warning": "<strong>Avisu:</strong> Esta páxina contien polo menos un parámetru de plantía que tien un tamañu d'espansión demasiao llargu.\nEstos parámetros s'omitieron.",
        "post-expand-template-argument-category": "Páxines con parámetros de plantía omitíos",
        "parser-template-loop-warning": "Deteutóse un bucle de plantíes: [[$1]]",
+       "template-loop-category": "Páxines con bucles de plantíes",
+       "template-loop-category-desc": "Esta páxina contien un bucle de plantía, esto ye, una plantía que se llama ella mesma de mou recursivu.",
        "parser-template-recursion-depth-warning": "Se pasó la llende de fondura recursiva de les plantíes ($1)",
        "language-converter-depth-warning": "Se pasó la llende de fondura del convertidor de llingües ($1)",
        "node-count-exceeded-category": "Páxines onde se pasó la cuenta de noyos",
        "page_first": "primera",
        "page_last": "cabera",
        "histlegend": "Seleición de diferencies: marca los botones de les versiones que quies comparar y calca <i>enter</i> o al botón d'abaxo.<br />\nLleenda: '''({{int:cur}})''' = diferencies cola versión actual, '''({{int:last}})''' = diferencies cola versión anterior, '''{{int:minoreditletter}}''' = edición menor.",
-       "history-fieldset-title": "Navegar pel historial",
-       "history-show-deleted": "Sólo desaniciaes",
+       "history-fieldset-title": "Buscar revisiones",
+       "history-show-deleted": "Sólo desaniciaes por revisión",
        "histfirst": "lo más antiguo",
        "histlast": "lo más nuevo",
        "historysize": "({{PLURAL:$1|1 byte|$1 bytes}})",
        "prefs-help-prefershttps": "Esta preferencia aplicaráse nel siguiente aniciu de sesión.",
        "prefswarning-warning": "Ficisti cambios nes tos preferencies qu'inda nun se guardaron.\nSi abandones esta páxina ensin calcar \"$1\" les preferencies nun s'anovarán.",
        "prefs-tabs-navigation-hint": "Gabitu: pue usar les tecles de flecha izquierda y drecha pa navegar peles llingüetes de la llista.",
-       "userrights": "Xestión de permisos d'usuariu",
+       "userrights": "Permisos d'usuariu",
        "userrights-lookup-user": "Seleiciona un usuariu",
        "userrights-user-editname": "Escribe un nome d'usuariu:",
        "editusergroup": "Cargar los grupos d'usuariu",
        "saveusergroups": "Guardar los grupos {{GENDER:$1|del usuariu|de la usuaria}}",
        "userrights-groupsmember": "Miembru de:",
        "userrights-groupsmember-auto": "Miembru implícitu de:",
-       "userrights-groups-help": "Pues camudar los grupos a los que pertenez esti usuariu.\n* Un caxellu marcáu significa que l'usuariu ta nesi grupu.\n* Un caxellu non marcáu significa que l'usuariu nun ta nesi grupu.\n* Un * indica que nun pues desaniciar el grupu una vegada tea inxeríu, o viceversa.\n* Un # indica que namái puede atrasase la fecha de caducidá d'esti grupu; nun puede adelantase.",
+       "userrights-groups-help": "Pues camudar los grupos a los que pertenez esti usuariu.\n* Un caxellu marcáu significa que l'usuariu ta nesi grupu.\n* Un caxellu non marcáu significa que l'usuariu nun ta nesi grupu.\n* Un * indica que nun pues desaniciar el grupu una vegada tea inxeríu, o viceversa.\n* Un # indica que namái puede atrasase la fecha de caducidá de la pertenencia a esti grupu; nun puede adelantase.",
        "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-expiry-options": "1 día:1 day,1 selmana:1 week,1 mes:1 month,3 meses:3 months,6 meses:6 months,1 añu:1 year",
        "userrights-invalid-expiry": "La hora de caducidá del grupu «$1» nun ye válida.",
        "userrights-expiry-in-past": "La hora de caducidá del grupu «$1» ta nel pasáu",
-       "userrights-cannot-shorten-expiry": "Nun puedes adelantar la caducidá del grupu «$1». Sólo los usuarios con permisu p'amestar y desaniciar esti grupu pueden adelantar les dates de caducidá.",
+       "userrights-cannot-shorten-expiry": "Nun puedes adelantar la caducidá de la pertenencia al grupu «$1». Sólo los usuarios con permisu p'amestar y desaniciar esti grupu pueden adelantar les dates de caducidá.",
        "userrights-conflict": "¡Conflictu de cambiu de permisos d'usuariu! Por favor, revise y confirme los cambios.",
        "group": "Grupu:",
        "group-user": "Usuarios",
        "rcfilters-invalid-filter": "Filtru inválidu",
        "rcfilters-empty-filter": "Nun hai filtros activos. Amuésense toles contribuciones.",
        "rcfilters-filterlist-title": "Filtros",
+       "rcfilters-filterlist-whatsthis": "¿Qué ye esto?",
        "rcfilters-filterlist-feedbacklink": "Comentar sobro los nuevos filtros (beta)",
        "rcfilters-highlightbutton-title": "Resaltar resultaos",
        "rcfilters-highlightmenu-title": "Seleiciona un color",
+       "rcfilters-highlightmenu-help": "Seleiciona un color pa resaltar esta propiedá",
        "rcfilters-filterlist-noresults": "Nun s'alcontraron filtros",
+       "rcfilters-noresults-conflict": "Nun s'alcontraron resultaos porque los criterios de gueta tán en conflictu",
+       "rcfilters-state-message-subset": "Esti filtru nun fai efeutu porque los resultaos inclúyense ente los {{PLURAL:$2|del siguiente filtru más ampliu|de los siguientes filtros más amplios}} (tenta resaltalu pa estremalu): $1",
+       "rcfilters-state-message-fullcoverage": "Seleicionar tolos filtros d'un grupu ye igual que nun seleicionar nengunu, de manera qu'esti filtru nun tien efeutu. El grupu incluye: $1",
        "rcfilters-filtergroup-registration": "Rexistru del usuariu",
        "rcfilters-filter-registered-label": "Rexistraos",
        "rcfilters-filter-registered-description": "Editores coneutaos.",
        "rcfilters-filter-unregistered-label": "Non rexistraos",
        "rcfilters-filter-unregistered-description": "Editores ensin coneutar.",
+       "rcfilters-filter-unregistered-conflicts-user-experience-level": "Esti filtru fai conflictu {{PLURAL:$2|col siguiente filtru|colos siguientes filtros}} Experience, qu'{{PLURAL:$2|alcuentra|alcuentren}} sólo usuarios rexistraos: $1",
        "rcfilters-filtergroup-authorship": "Editar autoría",
        "rcfilters-filter-editsbyself-label": "Les tos propies ediciones",
        "rcfilters-filter-editsbyself-description": "Ediciones de to",
        "rcfilters-filter-editsbyother-label": "Ediciones d'otros",
        "rcfilters-filter-editsbyother-description": "Ediciones creaes por otros usuarios (non por ti).",
        "rcfilters-filtergroup-userExpLevel": "Nivel d'esperiencia (solo pa usuarios rexistraos)",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "Los filtros Experience alcuentren sólo usuarios rexistraos, de manera qu'esti filtru entra en conflictu col filtru «Sin rexistrar».",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "El filtru «Ensin rexistrar» tien un conflictu con un filtru Experience o más, qu'alcuentren sólo usuarios rexistraos. Los filtros que tienen un conflictu márquense nel área de Filtros activos, más arriba.",
        "rcfilters-filter-user-experience-level-newcomer-label": "Recién llegaos",
        "rcfilters-filter-user-experience-level-newcomer-description": "Menos de 10 ediciones y 4 díes d'actividá.",
        "rcfilters-filter-user-experience-level-learner-label": "Aprendices",
        "rcfilters-filter-bots-description": "Ediciones feches con ferramientes automátiques.",
        "rcfilters-filter-humans-label": "Ser humanu (non bot)",
        "rcfilters-filter-humans-description": "Ediciones feches por editores humanos.",
+       "rcfilters-filtergroup-reviewstatus": "Estáu de revisión",
+       "rcfilters-filter-patrolled-label": "Patrullaes",
+       "rcfilters-filter-patrolled-description": "Ediciones marcaes como patrullaes.",
+       "rcfilters-filter-unpatrolled-label": "Sin patrullar",
+       "rcfilters-filter-unpatrolled-description": "Ediciones sin marcar como patrullaes.",
        "rcfilters-filtergroup-significance": "Significación",
        "rcfilters-filter-minor-label": "Ediciones menores",
        "rcfilters-filter-minor-description": "Ediciones que l'autor etiquetó como menores.",
        "rcfilters-filter-categorization-description": "Rexistros de les páxines que s'añaden o borren de categoríes.",
        "rcfilters-filter-logactions-label": "Aiciones rexistraes",
        "rcfilters-filter-logactions-description": "Aiciones alministratives, creación de cuentes, desanicios de páxines, xubíes de ficheros...",
+       "rcfilters-hideminor-conflicts-typeofchange-global": "El filtru «Ediciones menores» fai conflictu con un filtru «Tipu de cambiu» o más, porque dellos tipos de cambiu nun pueden designase como «menores». Los filtros que faen conflictu tan marcaos nel área de Filtros Activos, más arriba.",
+       "rcfilters-hideminor-conflicts-typeofchange": "Dellos tipos de cambiu nun pueden designase como «menores», de manera qu'esti filtru fai conflictu colos siguientes filtros «Tipu de cambiu»: $1",
+       "rcfilters-typeofchange-conflicts-hideminor": "Esti filtru de «Tipu de cambiu» fai conflictu col filtru «Ediciones menores». Dellos tipos de cambiu nun pueden designase como «menores».",
        "rcnotefrom": "Abaxo {{PLURAL:$5|tá'l cambiu|tan los cambios}} dende'l <strong>$3</strong>, a les <strong>$4</strong> (s'amuesen un máximu de <strong>$1</strong>).",
+       "rclistfromreset": "Reaniciar la seleición de data",
        "rclistfrom": "Amosar los nuevos cambios dende'l $3 a les $2",
        "rcshowhideminor": "$1 ediciones menores",
        "rcshowhideminor-show": "Amosar",
        "undeleteviewlink": "ver",
        "undeleteinvert": "Invertir seleición",
        "undeletecomment": "Motivu:",
-       "undeletedrevisions": "{{PLURAL:$1|1 revisión restaurada|$1 revisiones restauraes}}",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 revisión|$1 revisiones}} y {{PLURAL:$2|1 archivu|$2 archivos}} restauraos",
-       "undeletedfiles": "{{PLURAL:$1|1 archivu restauráu|$1 archivos restauraos}}",
        "cannotundelete": "Falló total o parcialmente la restauración:\n$1",
        "undeletedpage": "'''Restauróse $1'''\n\nConsulta'l [[Special:Log/delete|rexistru d'esborraos]] pa ver los esborraos y restauraciones de recién.",
        "undelete-header": "Mira nel [[Special:Log/delete|rexistru d'esborraos]] les páxines esborraes recién.",
        "newimages-summary": "Esta páxina especial amuesa los caberos archivos xubíos.",
        "newimages-legend": "Peñera",
        "newimages-label": "Nome d'archivu (o una parte d'él):",
+       "newimages-user": "Direición IP o nome d'usuariu",
        "newimages-showbots": "Ver les xubíes de los bots",
        "newimages-hidepatrolled": "Despintar les entraes patrullaes",
        "noimages": "Nun hai nada que ver.",
        "special-characters-group-thai": "Tailandés",
        "special-characters-group-lao": "Laosianu",
        "special-characters-group-khmer": "Khmer",
+       "special-characters-group-canadianaboriginal": "Aborixe canadiense",
        "special-characters-title-endash": "guión curtiu",
        "special-characters-title-emdash": "guión llargu",
        "special-characters-title-minus": "signu menos",
        "restrictionsfield-label": "Rangos d'IP permitíos:",
        "restrictionsfield-help": "Una única direición IP o rangu CIDR per llinia. P'activar toos, utiliza:<pre>0.0.0.0/0\n::/0</pre>",
        "revid": "revisión $1",
-       "pageid": "ID de páxina $1"
+       "pageid": "ID de páxina $1",
+       "rawhtml-notallowed": "Les etiquetes &lt;html&gt; nun pueden usase fuera de les páxines normales."
 }
diff --git a/languages/i18n/atj.json b/languages/i18n/atj.json
new file mode 100644 (file)
index 0000000..882903f
--- /dev/null
@@ -0,0 +1,535 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Amqui",
+                       "Benoit Rochon",
+                       "Jean-paul echaquan",
+                       "Jeannette Coocoo",
+                       "Nehirowisiw",
+                       "Ninmeka",
+                       "Thibaut120094"
+               ]
+       },
+       "sunday": "manactakaniwon",
+       "monday": "ockorkananiwon",
+       "tuesday": "nicw kicikaw",
+       "wednesday": "nicto kicikaw",
+       "thursday": "new kicikaw",
+       "friday": "tcipaiatikw kicikaw",
+       "saturday": "mari kicikaw",
+       "sun": "manactakaniwon",
+       "mon": "ockorkananiwon",
+       "tue": "Nicw kicikaw",
+       "wed": "nicto kicikaw",
+       "thu": "new kicikaw",
+       "fri": "tcipaiatikw kicikaw",
+       "sat": "mari kicikaw",
+       "january": "Kenositc pisimw",
+       "february": "Akokatcic pisimw",
+       "march": "Nikikw pisimw",
+       "april": "Ka wasikototc pisimw",
+       "may_long": "Wapikon pisimw",
+       "june": "Otehimin pisimw",
+       "july": "Mikomini pisimw",
+       "august": "Otatakon pisimw",
+       "september": "Kakone pisimw",
+       "october": "Namekosi pisimw",
+       "november": "Atikamekw pisimw",
+       "december": "Pitcipipon pisimw",
+       "january-gen": "Kenositc pisimw",
+       "february-gen": "Akokatcic pisimw",
+       "march-gen": "Nikikw pisimw",
+       "april-gen": "Ka wasikototc pisimw",
+       "may-gen": "Wapikon pisimw",
+       "june-gen": "Otehimin pisimw",
+       "july-gen": "Mikomini pisimw",
+       "august-gen": "Otatakon pisimw",
+       "september-gen": "Kakone pisimw",
+       "october-gen": "Namekosi pisimw",
+       "november-gen": "Atikamekw pisimw",
+       "december-gen": "Pitcipipon pisimw",
+       "jan": "Kenositc pisimw",
+       "feb": "Akokatcic pisimw",
+       "mar": "Nikikw pisimw",
+       "apr": "Ka wasikototc pisimw",
+       "may": "Wapikon pisimw",
+       "jun": "Otehimin pisimw",
+       "jul": "Mikomini pisimw",
+       "aug": "Otatakon pisimw",
+       "sep": "Kakone pisimw",
+       "oct": "Namekosi pisimw",
+       "nov": "Atikamekw pisimw",
+       "dec": "Pitcipipon pisimw",
+       "january-date": "Kenositc pisimw $1",
+       "february-date": "Akokatcic pisimw $1",
+       "march-date": "Nikikw pisimw $1",
+       "april-date": "Ka wasikototc pisimw $1",
+       "may-date": "Wapikon pisimw $1",
+       "june-date": "Otehimin pisimw $1",
+       "july-date": "Mikomini pisimw $1",
+       "august-date": "Otatakon pisimw $1",
+       "september-date": "Kakone pisimw $1",
+       "october-date": "Namekosi pisimw $1",
+       "november-date": "Atikamekw pisimw $1",
+       "december-date": "Pitcipipon pisimw $1",
+       "pagecategories": "{{PLURAL:$1|Ka ici arimotcikatek|Ka ici arimotcikateki}}",
+       "category_header": "Masinhikana ka ici arimotcikateki \"$1\"",
+       "hidden-categories": "{{PLURAL:$1|Ka katcictek|Ka katcicteki}}",
+       "listingcontinuesabbrev": "minawatc",
+       "about": "Taci we otciparik",
+       "newwindow": "(cepita kotak ocki osapwakan)",
+       "cancel": "Ponipita",
+       "mypage": "Masinhikan",
+       "mytalk": "Ka ici arimowaniok",
+       "anontalk": "Ka ici arimowaniok",
+       "navigation": "Matcecikinikan",
+       "and": "&#32;kaie",
+       "qbbrowse": "Nantowepaha",
+       "qbedit": "Meckotcita",
+       "namespaces": "Ka ici masinasotcik",
+       "variants": "Pitoc",
+       "navigation-heading": "Matcecikinikana",
+       "errorpagetitle": "Oniparin",
+       "returnto": "Nte ica paskickwemakanik $1",
+       "tagline": "Epe otcipirik {{SITENAME}}",
+       "help": "Witcihici",
+       "search": "Nantokaskeritcikatek",
+       "searchbutton": "Nantokaskeritcikatek",
+       "go": "Go",
+       "searcharticle": "Tapowata",
+       "history": "Ka ki pe icinakok owe masinhikan",
+       "history_short": "Isparik",
+       "history_small": "isparik",
+       "printableversion": "Wi orowipitamone",
+       "permalink": "Matakan pamikicikwepitcikanik",
+       "print": "Orowipitaman",
+       "view": "Tapwatcike",
+       "view-foreign": "Nta ici ntowapata$1",
+       "edit": "Meckotcita",
+       "create": "Ocita",
+       "create-local": "Arimota ke acotcictek",
+       "editthispage": "Mecikotona owe",
+       "delete": "Wepina",
+       "newpage": "Ocki matcecikinakanik",
+       "talkpagelinktext": "ka ici arimowaniok",
+       "personaltools": "Kit irapatcitcikan",
+       "talk": "Ka ici arimowaniok",
+       "views": "Ke icinakok",
+       "toolbox": "Irapitcitcikan",
+       "projectpage": "Kitci wapataman nehe masinihikan ocki otamirowinik otci",
+       "otherlanguages": "Kotakhi aiarimowewina",
+       "redirectedfrom": "(Taci e kiweckwemokok $1)",
+       "lastmodifiedat": "Pamitcitc ka meckotcitakiniwok ni apitc $1, ka tatopihikanihak $2.",
+       "jumpto": "Ica:",
+       "jumptonavigation": "matcetcicihikan",
+       "jumptosearch": "nantokaskeritcikatek",
+       "aboutsite": "Taci we otciparik {{SITENAME}}",
+       "aboutpage": "Project:Enko nehe",
+       "currentevents": "Mekwata",
+       "currentevents-url": "Project:Mekwata",
+       "disclaimers": "Ke ekwamanictcikatek",
+       "disclaimerpage": "Project:Witamakaniwon orocowewin",
+       "edithelp": "Witcihewin e matcetcicihaman",
+       "helppage-top-gethelp": "Witcihici",
+       "mainpage": "Otitikowin",
+       "mainpage-description": "Otitikowin",
+       "portal": "Kaskina namo awik",
+       "portal-url": "Project:Kaskina namo awik",
+       "privacy": "Kekwan ke ki ici nitcictaman",
+       "privacypage": "Project:Kekwan ke ki ici nitcictaman",
+       "ok": "OK",
+       "retrievedfrom": "Neta pe otcipirin \"$1\"",
+       "editsection": "meckotcita",
+       "editold": "meckotcita",
+       "editlink": "meckotcita",
+       "viewsourcelink": "Nte ici nta kanawapata e otciparik",
+       "editsectionhint": "Meckotcita ota: $1",
+       "toc": "Tekaci ecinakok",
+       "showtoc": "Wapata",
+       "hidetoc": "Kata",
+       "confirmable-yes": "Ehe",
+       "confirmable-no": "Nama",
+       "site-atom-feed": "Flux Atom de $1",
+       "page-atom-feed": "\"$1\" Atom feed",
+       "red-link-title": "$1 (nama takon kekwcic)",
+       "nstab-main": "Masinhikan",
+       "nstab-user": "{{GENDER:{{ROOTPAGENAME}}|Ka masinahiketc|Ka masinahiketc}}",
+       "nstab-special": "Ka ici wectakaniok",
+       "nstab-project": "nohwe ma",
+       "nstab-image": "Masinhikan",
+       "nstab-template": "Tapapitcikan",
+       "nstab-category": "Ka ici arimotcikatek",
+       "mainpage-nstab": "Otitikowin",
+       "error": "Oniparin",
+       "databaseerror-error": "Oniparin: $1",
+       "badtitle": "nama mia icinikatew",
+       "badtitletext": "Nama takon nohwe e icinikatek paskickwemikan ,cikoctew,kekotc nama mia ki otci icinikatcikatew e itectamakaniwok nte arimwewinik kekotc nte otamirowinik.\nPotc osam nipira aitisinihikana actetikena nama tca ki actakaniwona tan e icinikatcikateki kekwan.",
+       "viewsource": "Nte ici nta kanawapata e otciparik",
+       "yourname": "Icinikasowin:",
+       "userlogin-yourname": "Icinikasowin",
+       "userlogin-yourname-ph": "Pitakesinaha kit icinikasowin",
+       "yourpassword": "Pitakesinahotiso:",
+       "userlogin-yourpassword": "Pitakesinahotiso",
+       "userlogin-yourpassword-ph": "Pitakesinihikan",
+       "createacct-yourpassword-ph": "Acta pitakesinihikan",
+       "createacct-yourpasswordagain": "Naskamowicta pitakesinihikan",
+       "createacct-yourpasswordagain-ph": "Minawatc acta pitakesinihikan",
+       "login": "Posi",
+       "logout": "Piskeapikenakan",
+       "userlogout": "Piskeapikenakan",
+       "userlogin-noaccount": " Nama takon ki mockinesinihikan?",
+       "userlogin-joinproject": "Pe natcipicta {{ohwe itipiwin}}",
+       "createaccount": "Masinahotiso",
+       "userlogin-resetpassword-link": "Ki onikan kipitakesinihikan?",
+       "userlogin-helplink2": "Witcihewin kata pitakeapikecinaniwok",
+       "createacct-emailrequired": "Pamikicikwepitcikan matcetcicihikan",
+       "createacct-emailoptional": "Pamikicikwepitcikan matcetcicihikan (kir kotc)",
+       "createacct-email-ph": "Pitakesinaha ki pamikicikwepitcikan matcetcicihikan",
+       "createacct-submit": "Masinahotiso",
+       "createacct-benefit-heading": "{{SITENAME}} Iskwewok,iriniwok ka orisinihiketcik mitowi kir.",
+       "createacct-benefit-body2": "{{PLURAL:$1|masinhikan|masinahikana}}",
+       "loginlanguagelabel": "arimwewin:$1",
+       "pt-login": "Posi",
+       "pt-login-button": "Posi",
+       "pt-createaccount": "Masinahotiso",
+       "pt-userlogout": "Piskeapikenakan",
+       "botpasswords-label-cancel": "Ponipita",
+       "botpasswords-label-delete": "Wepina",
+       "resetpass-submit-cancel": "Ponipita",
+       "passwordreset": "Ka ocehikaniin itewin koski masinaha",
+       "passwordreset-username": "Icinikasowin:",
+       "passwordreset-email": "Pamikicikwepitcikan matcetcicihikan:",
+       "bold_sample": "Atisokesinahikan e makatewasinatek",
+       "bold_tip": "Atisokesinahikan e makatewasinatek",
+       "italic_sample": "Atisokesinahikan ka kwectek",
+       "italic_tip": "Atisokesinahikan ka kwectek",
+       "link_sample": "Ka icinkatek takapikenikan",
+       "link_tip": "Pitc itapikesinikan",
+       "extlink_sample": "http://www.example.com ka icinkatek takapikenikan",
+       "extlink_tip": "Masinhikana ka ici tapitik kotakik masinhikanik",
+       "headline_sample": "Atisokesinahikan ke aicinikatek",
+       "nowiki_sample": "Acta atisokesinahikan aka moci ka ki otci nihipitcikatek ota",
+       "nowiki_tip": "aka pamerita e itasinihakw wiki",
+       "image_tip": "E pitakesinahikatek masinahikaniwoc",
+       "media_tip": "Ka ici tapitik onimiskimasinhikan",
+       "sig_tip": "Masinohotiso acit e tato konekisitc pisimw",
+       "summary": "Nosem:",
+       "minoredit": "Apicic meckotciparin",
+       "watchthis": "Wi nosinetahine ohe masinhikan",
+       "savearticle": "Kinokepitcikanik acta",
+       "showpreview": "Tcockapita",
+       "showdiff": "Kanawapata ka meckotcipitcikateki",
+       "loginreqlink": "posi",
+       "editing": "Meckotcita $1",
+       "templatesused": "{{PLURAL:$1|tapapitcikan ka apatak |tapapitcikan ka apatak}} nta paskickwemakanik:",
+       "template-protected": "(nakatweritcikatew)",
+       "template-semiprotected": "(apita nakatoweritakon)",
+       "moveddeleted-notice": "Paskickwemakan ka ki wepinikatek.\nOhwe wapatcikan nitc ici nokon  paskickwemakanik ka ki wepinikateki acit ka ki atcipitcikateki .",
+       "content-model-javascript": "JavaScript",
+       "viewpagelogs": "Kinawapta kekwan kaki isparik ota masinhikanik",
+       "revisionasof": "Kiwe wapata $1",
+       "previousrevision": "← Nictam ka ki masinatek",
+       "nextrevision": "Tec aci ka ki otamirowitcikatek",
+       "currentrevisionlink": "Mekwatc ka otamirowitcikatek",
+       "cur": "E otapekitikw",
+       "last": "pitoc",
+       "history-feed-title": "Kotakihi e itatcitcikatekai",
+       "rev-showdeleted": "wapata",
+       "revdelete-show-file-submit": "Ehe",
+       "pagehist": "Ka ki pe icinakok owe masinhikan",
+       "history-title": "Kotakihi e itatcitcikatekai $1",
+       "lineno": "E tosinatek $1 :",
+       "editundo": "nama ntwatc",
+       "searchresults": "Kaki nta kiskeritakok",
+       "searchresults-title": "Kaki nta kiskeritakok \"$1\"",
+       "shown-title": "Akoskoha $1 {{PLURAL:$1|result|results}}  tatwa e matce paskickwemikein",
+       "searchprofile-articles": "Masinhikana ka aicteki",
+       "searchprofile-images": "Mitcetowina",
+       "searchprofile-everything": "Kaskina",
+       "searchprofile-advanced": "Awocamec nantona",
+       "searchprofile-articles-tooltip": "Nantowapita $1",
+       "searchprofile-images-tooltip": "ka nantopitcikatek nakwe masinhikan",
+       "searchprofile-everything-tooltip": "Nantona nta kitciwe natosinahikanik (acit nte paskickwemakanik taci e ici aiarimotcikatek)",
+       "searchprofile-advanced-tooltip": "Nantona taci e ici actek  ka mihikok",
+       "search-result-size": "$1 ({{PLURAL:$2|1 itewin e masinatek|$2 itewina e masinateki}})",
+       "search-redirect": "(Taci e kiweckwemokok $1)",
+       "search-suggest": "Ohwe kotcita e itasinatek:$1",
+       "searchall": "kaskina",
+       "powersearch-legend": "Awocamec nantona",
+       "powersearch-toggleall": "Kaskina",
+       "preferences": "Kirowe",
+       "mypreferences": "Kirowe",
+       "saveprefs": "Kinokepitcikanik",
+       "searchresultshead": "Nantokaskeritcikatek",
+       "stub-threshold-disabled": "Manisinaha",
+       "prefs-searchoptions": "Nantokaskeritcikatek",
+       "youremail": "Matcetcicihikan:",
+       "email": "Matcetcicihikan",
+       "group-user": "Ka mitatc",
+       "right-writeapi": "Ohwe apitcita A.P.I meckoti aitotaman wikik",
+       "newuserlogpage": "E ici masinasotcik ka pitakesinohotosotcik",
+       "action-edit": "mecikotona owe",
+       "enhancedrc-history": "isparik",
+       "recentchanges": "Ka ki meckotcitakanioki",
+       "recentchanges-legend": " Ka meckotcitain matcenikana",
+       "recentchanges-summary": "Paskickwemikan ke ici nosanetain ka ki ocki meckotcisinihikatekai wikik.",
+       "recentchanges-label-newpage": "Ocki paskickwemikan ki ocitamakan",
+       "recentchanges-label-minor": "Apicic meckotciparin",
+       "recentchanges-label-bot": "Icike ki meckotciparin",
+       "recentchanges-label-unpatrolled": "Nama moci koski tapwatcikatew ka ki meckotcipirik",
+       "recentchanges-label-plusminus": " Irikik e tacitcik bytes meckotcipirin e irikwak",
+       "recentchanges-legend-heading": "<strong>itekesinihikan:</strong>",
+       "recentchanges-submit": "Wapata",
+       "rclistfrom": "Nokota ka ki mameckotcipirik nta e otci kitcipirik $2$3",
+       "rcshowhideminor": "$1 memantcic meckotcipirina",
+       "rcshowhideminor-show": "Wapata",
+       "rcshowhideminor-hide": "Kata",
+       "rcshowhidebots": "$1 meckotciparini",
+       "rcshowhidebots-show": "Wapata",
+       "rcshowhidebots-hide": "Kata",
+       "rcshowhideliu": "$1 ka notcitatcik e ici masinohotisotcik",
+       "rcshowhideliu-show": "Wapata",
+       "rcshowhideliu-hide": "Kata",
+       "rcshowhideanons": "$1 nama kiskeritakosiw ka ki masinahaki",
+       "rcshowhideanons-show": "Wapata",
+       "rcshowhideanons-hide": "Kata",
+       "rcshowhidepatr-show": "Wapata",
+       "rcshowhidepatr-hide": "Kata",
+       "rcshowhidemine": "$1 ka meckotcipitaman",
+       "rcshowhidemine-show": "Wapata",
+       "rcshowhidemine-hide": "Kata",
+       "rcshowhidecategorization-show": "Wapata",
+       "rcshowhidecategorization-hide": "Kata",
+       "rclinks": "Nokota nehi $1 ka ki mamitcit mameckotcipitcikatekai $2 nac nta  mamitcitc e kicikakai<br />$3.",
+       "diff": "pitoc",
+       "hist": "e itatisokatek",
+       "hide": "Kata",
+       "show": "Wapata",
+       "minoreditletter": "a",
+       "newpageletter": "O",
+       "boteditletter": "p",
+       "rc-change-size-new": "$1 {{PLURAL:$1|irik|irikw}} ke askowak",
+       "recentchangeslinked": "Nosineta masinhikana e mamowapiketik",
+       "recentchangeslinked-toolbox": "Nosineta masinhikana e mamowapiketik",
+       "recentchangeslinked-title": "E nosinehikatek paskickwemikana ka acotcictek\"$1\"",
+       "recentchangeslinked-page": "Icinikatamowin Ickwemakinikan:",
+       "upload": "Natcipota masinhikan",
+       "filedesc": "Nosem",
+       "fileuploadsummary": "Nosem:",
+       "filesource": "Ite wetciparik:",
+       "upload-dialog-button-cancel": "Ponipita",
+       "upload-dialog-button-save": "Kinokepitcikanik",
+       "upload-form-label-infoform-description": "E witcikemakak",
+       "upload-form-label-infoform-categories": "Nakwe tipanictasinihikan",
+       "upload-form-label-infoform-date": "Tatokonakisitc",
+       "license-header": "orocowatcikan",
+       "listfiles-delete": "wepina",
+       "imgfile": "masinhikan",
+       "listfiles": "Ka ici tapitik onimiskimasinhikan",
+       "listfiles_thumb": "Masinasonic",
+       "listfiles_date": "Tatokonakisitc",
+       "listfiles_user": "Ka mitatc",
+       "listfiles_description": "E witcikemakak",
+       "listfiles-latestversion-yes": "Ehe",
+       "listfiles-latestversion-no": "Nama",
+       "file-anchor-link": "Masinahikaniwoc",
+       "filehist": "E itatisokemakak masinahikaniwoc",
+       "filehist-help": "Ota ici nta makona e tatokonikisitc acitc e tato tipahikaneak kitci wapataman apitc ka masinatek.",
+       "filehist-current": "mekwatc",
+       "filehist-datetime": "Tatokonakisitc acitc tato tipahikaneak",
+       "filehist-thumb": "Masinasonic",
+       "filehist-user": "Ka mitatc",
+       "filehist-dimensions": "E iskwaki",
+       "filehist-comment": "E iteritaman",
+       "imagelinks": "Ke irapatak masinahikaniwoc",
+       "nolinkstoimage": "Nama tekaci apatan masinahikaniwoc.",
+       "upload-disallowed-here": "Nama actew  kata meckotanaman.",
+       "filedelete": "Wepina $1",
+       "filedelete-submit": "Wepina",
+       "randompage": "Nakowepitaman",
+       "randomincategory-category": "Ka ici arimotcikatek:",
+       "randomincategory-submit": "Tapowata",
+       "statistics-pages": "Masinahikana",
+       "pageswithprop-submit": "Tapowata",
+       "brokenredirects-edit": "meckotcita",
+       "brokenredirects-delete": "wepina",
+       "withoutinterwiki-submit": "Wapata",
+       "nbytes": "$1 {{PLURAL:$1|irik}}",
+       "prefixindex-submit": "Wapata",
+       "protectedpages-page": "Masinhikan",
+       "newpages": "Ocki matcecikinakanik",
+       "newpages-submit": "Wapata",
+       "newpages-username": "Icinikasowin:",
+       "booksources": "E otciparik",
+       "booksources-search-legend": "Nantowapata nta kotakahi wapatcikana",
+       "booksources-search": "Nanto kiskeritcikatek",
+       "log": "Pamikickwepitcikana masinihikana",
+       "logeventslist-submit": "Wapata",
+       "checkbox-all": "Kaskina",
+       "allpages": "Kaskina paskickwemikana",
+       "allarticles": "Kaskina paskickwemikana",
+       "allpagessubmit": "Tapowata",
+       "categories": "Nakwe tipanictasinihikan",
+       "categories-submit": "Wapata",
+       "sp-deletedcontributions-contribs": "Wi kipitanikeine",
+       "linksearch-ok": "Nantokaskeritcikatek",
+       "listusers-submit": "Wapata",
+       "listgrouprights-namespaceprotection-namespace": "Ka ici masinasotcik",
+       "emailusername": "Icinikasowin:",
+       "watchlist": "Ka masinateki",
+       "mywatchlist": "Ka masinateki",
+       "watch": "Nanakatcita",
+       "watchlist-hide": "Kata",
+       "watchlist-submit": "Wapata",
+       "wlshowhideanons": "nama kiskeritakosiw ka ki masinahak",
+       "enotif_anon_editor": "nama kiskeritakosiw ka ki masinahak $1",
+       "delete-confirm": "Wepina \"$1\"",
+       "delete-legend": "Wepina",
+       "historyaction-submit": "Wapata",
+       "dellogpage": " Nesitc ka wepinikatek kanaweritcikan",
+       "rollbacklink": "e maninikatek",
+       "protectlogpage": "Nanakatisiwina wapatcikan",
+       "restriction-edit": "Meckotcita",
+       "undeleteviewlink": "tapwatcike",
+       "undelete-search-submit": "Nantokaskeritcikatek",
+       "undelete-show-file-submit": "Ehe",
+       "namespace": "Ka ici masinasotcik:",
+       "invert": "koweckisinaha nohwe",
+       "namespace_association": "Taci e mamowisinasonaniwok",
+       "blanknamespace": "(Ka ici ocitakiniwok)",
+       "mycontris": "Wi kipitanikeine",
+       "anoncontribs": "Wi kipitanikeine",
+       "uctop": "(mekwatc)",
+       "month": "Anotc pisimw ka akotcinitc (nac nte nictam):",
+       "sp-contributions-talk": "ka ici arimowaniok",
+       "sp-contributions-submit": "Nantokaskeritcikatek",
+       "whatlinkshere": "Kaskina ickwemikina ka witci acteki",
+       "whatlinkshere-title": "Masinhikan nte mia ka ici tapitik \"$1\"",
+       "whatlinkshere-page": "Masinhikan:",
+       "linkshere": "Masinhikan ka ici tapitik <strong>[[:$1]]</strong>:",
+       "isredirect": "masinhikan ke kweskiticohemikok",
+       "isimage": "e ici tapitik masinahikaniwoc",
+       "whatlinkshere-links": "← ka patiki",
+       "whatlinkshere-hideredirs": "$1 itapihikina",
+       "whatlinkshere-hidetrans": "$1 pitcititawina",
+       "whatlinkshere-hidelinks": "$1 ka patiki",
+       "whatlinkshere-filters": "cikopesinikan",
+       "whatlinkshere-submit": "Tapowata",
+       "ipblocklist-submit": "Nantokaskeritcikatek",
+       "blocklink": "nokipita",
+       "contribslink": "wi kipitanikeine",
+       "movesubpagetalktext": "",
+       "export": "Matcetacaha masinhikana",
+       "allmessages-filter-all": "Kaskina",
+       "allmessages-filter-submit": "Tapowata",
+       "thumbnail-more": "Micata",
+       "tooltip-pt-userpage": "{{GENDER:|Ki masinahikan|Ki masinahikan}}",
+       "tooltip-pt-login": "Arimatc kika witen e icikasoin: nama tatakatc kitci kiskeritakosiin.",
+       "tooltip-pt-logout": "Piskeapikenakan",
+       "tooltip-pt-createaccount": "A arimatc kika ocitan kitci cenaman: nama aric tatakatc otcitakotc.",
+       "tooltip-ca-talk": "Kecpin wi aimihate awik aniherie otci",
+       "tooltip-ca-edit": "Mecikotona owe",
+       "tooltip-ca-addsection": "Kitcipirin ocki aimihitosinihikan",
+       "tooltip-ca-viewsource": "Nakataweritakon paskickwemikan\n Taci e otcipirik",
+       "tooltip-ca-history": "Nictam kaki itasinahikatek",
+       "tooltip-ca-move": "Orinkata owe masinhikan",
+       "tooltip-ca-watch": "E ici nosinehaman ici acotcicta paskickwemakan",
+       "tooltip-search": "Nantokaskeritcikatek {{SITENAME}}",
+       "tooltip-search-go": "Ekota neta icakw kepitc tanokwen itewin",
+       "tooltip-search-fulltext": "Nantona paskickwemakana atisokesinahikanik",
+       "tooltip-p-logo": "Nictam ka nokok",
+       "tooltip-n-mainpage": "Nictam ka nokok",
+       "tooltip-n-mainpage-description": "Nictam ka nokok",
+       "tooltip-n-portal": "Anihe otci ka tacikatek mia keki totaman tan nte ke otinaman ke kictapatak",
+       "tooltip-n-currentevents": "Ke ici miskaman ka wi nta kiseritaman",
+       "tooltip-n-recentchanges": "Ka ki mecikitonikatek",
+       "tooltip-n-randompage": "Kaskina kekowan",
+       "tooltip-n-help": "Witcihiewin",
+       "tooltip-t-whatlinkshere": "Ka masinateti ite e ici itohikemakak",
+       "tooltip-t-recentchangeslinked": "Ka masinateki anihi kaki atcitakaniwok",
+       "tooltip-feed-atom": "Atom itapihikan ohwe otci paskickwemikan",
+       "tooltip-t-contributions": "Ka masinasotcik ka witcihiwetcik{{GENDER:$1|ka ntotcitatc}}",
+       "tooltip-t-upload": "Matceticiha masinhikan",
+       "tooltip-t-specialpages": "Kotahaki masinhikana",
+       "tooltip-t-print": "Matci keki orowipitaman kitci masinatekipan",
+       "tooltip-t-permalink": "Taci mia e otcitik",
+       "tooltip-ca-nstab-main": "Ki nawapta ka masinateki",
+       "tooltip-ca-nstab-user": "Kitci wapitaman nehe masinhikan ka apitak",
+       "tooltip-ca-nstab-special": "Ohowe kitcickwemakinikan,nama actew kitci meckotcitaparik.",
+       "tooltip-ca-nstab-project": "Kitci wapataman nehe masinihikan ocki otamirowinik otci",
+       "tooltip-ca-nstab-image": "Kitci wapitaman nehe masinhikan",
+       "tooltip-ca-nstab-template": "kanawapata orictawisinihikan",
+       "tooltip-ca-nstab-category": "Kitci wapitaman nehe mia ka ici arimotcikatek",
+       "tooltip-save": "Kinokepita ka meckotcisinihaman",
+       "tooltip-preview": "Mikwetc pitaman e kanawapataman kaki meckotcitain, e pwamici actain pamikicikwepitcikanik.",
+       "tooltip-diff": "Nokota nohwe ka ki meckotcisinihaham  masinihikanik",
+       "tooltip-rollback": "\"Nakaha\" nikanikatew kotc peikwa e makohotc nohwe makonakan kaskina ka ki meckotcisinihikateki nta paskickwemakanik nohwe ka ki orisinihiketc mamitcit",
+       "tooltip-undo": "\"Nama ntowatc\"nihictamikan nictam meckotcisinihikan minawatc cepirihomikon taci e ici meckotcisinihikaniwok ke ici kanawapataman.Matci kaie ki ka acotcitan kekwan espirik  nta nosem masinihikanik.",
+       "tooltip-summary": "Acta e arimotaman masinihikan apicic",
+       "simpleantispam-label": "Ntokiskeritcike piciriwe masinihikan \n\nNte nota <strong>nama kekwan</strong> masinaha ota!",
+       "pageinfo-toolboxlink": "Tipatcimo masinahikan",
+       "pageinfo-contentpage-yes": "Ehe",
+       "pageinfo-protect-cascading-yes": "Ehe",
+       "confirm-markpatrolled-button": "OK",
+       "nextdiff": "Tec meckotcisinihikan",
+       "show-big-image": "E otciparik masinahikaniwoc",
+       "show-big-image-preview": "E irikweckwemikisitc$1",
+       "show-big-image-size": "$1 x $2 pixels",
+       "ilsubmit": "Nantokaskeritcikatek",
+       "monday-at": "ockorkananiwon $1",
+       "wednesday-at": "nicto kicikaw $1",
+       "thursday-at": "new kicikaw $1",
+       "friday-at": "tcipaiatikw kicikaw $1",
+       "saturday-at": "mari kicikaw $1",
+       "sunday-at": "manactakaniwon $1",
+       "metadata": "E ici tipatcitcikatek",
+       "metadata-fields": "Nohwe e aitotwakaniwitc masinasowin nta kata ici actew paskickwemakanik ka ici tipatcimonaniwok ickwa atciwonikateke nta kitci tipatcimoniwocik. Minawatc kotakahi kata katcictakaniwona.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
+       "exif-orientation": "Itactamictew",
+       "exif-datetime": "Apitc ka meckotcitakaniwok",
+       "exif-make": "Ka ki ocitatatc masinapiskihikaniw",
+       "exif-model": "E icinakok masinapiskohewin",
+       "exif-software": "Tipatcimocikimiwesinikan ka totcikatek",
+       "exif-colorspace": "Icipekihikanik",
+       "exif-datetimeoriginal": "E tato piponikak nictam ka masinohaniwok",
+       "exif-datetimedigitized": "e tato konekisit pisimw ka capwapiskipitcikatek",
+       "exif-source": "Ite wetciparik",
+       "exif-iimcategory": "Ka ici arimotcikatek",
+       "exif-orientation-1": "Ekote mia",
+       "exif-contrast-0": "Ekote mia",
+       "exif-saturation-0": "Ekote mia",
+       "exif-sharpness-0": "Ekote mia",
+       "exif-dc-date": "Tatokonakisitc",
+       "namespacesall": "kaskina",
+       "monthsall": "kaskina",
+       "confirm_purge_button": "OK",
+       "confirm-watch-button": "OK",
+       "confirm-unwatch-button": "OK",
+       "confirm-rollback-button": "OK",
+       "quotation-marks": "\"$1\"",
+       "imgmultigo": "Tapowata!",
+       "img-lang-go": "Tapowata",
+       "table_pager_limit_submit": "Tapowata",
+       "version-ext-colheader-description": "E witcikemakak",
+       "version-libraries-description": "E witcikemakak",
+       "redirect-submit": "Tapowata",
+       "fileduplicatesearch-submit": "Nantokaskeritcikatek",
+       "specialpages": "Ka ici wectakaniok",
+       "tags-source-header": "Ite wetciparik",
+       "tags-active-yes": "Ehe",
+       "tags-active-no": "Nama",
+       "tags-edit": "meckotcita",
+       "tags-delete": "wepina",
+       "tags-create-submit": "Ocita",
+       "compare-page1": "Masinhikan 1",
+       "compare-page2": "Masinhikan 2",
+       "htmlform-no": "Nama",
+       "htmlform-yes": "Ehe",
+       "htmlform-cloner-delete": "Manina",
+       "feedback-cancel": "Ponipita",
+       "searchsuggest-search": "Nantona {{SITENAME}}",
+       "expand_templates_ok": "OK",
+       "pagelang-name": "Masinhikan",
+       "log-action-filter-all": "Kaskina",
+       "log-action-filter-block-block": "Nokipita",
+       "authmanager-email-label": "Matcetcicihikan"
+}
index fa43219..3a9d7c4 100644 (file)
        "login": "گیریش",
        "login-security": "کیملیگینیزی تائید ائدین",
        "nav-login-createaccount": "گیریش / حساب یارات",
-       "userlogin": "گیریش / حساب یارات",
-       "userloginnocreate": "گیریش",
        "logout": "چیخیش",
        "userlogout": "چیخیش",
        "notloggedin": "گیرمه‌میسینیز",
        "userlogin-noaccount": "حسابینیز یوخدورمو؟",
        "userlogin-joinproject": "{{SITENAME}}-ه قوشولون",
-       "nologin": "حسابینیز یوخدومو؟ $1.",
-       "nologinlink": "حساب یارات",
        "createaccount": "حساب یارات",
-       "gotaccount": "اؤنجه‌دن حسابینیز وارمی؟ $1.",
-       "gotaccountlink": "گیریش",
-       "userlogin-resetlink": "گیریش بیلگیلرینیزی اونوتموسونوز؟",
        "userlogin-resetpassword-link": "رمزینیزی اونوتموسوز مو؟",
        "userlogin-helplink2": "گیریش ایله کؤمک",
        "userlogin-loggedin": "سیر حال حاضیردا {{GENDER:$1|$1}} عونوانیندا گیریش ائدیب سیز.\nآشاغیداکی فورمودان بیر آیری ایشلدن عونوانیندا گیریش اوچون ایشلدین.",
        "createacct-another-email-ph": "ایمیل آدرسینیزی یازین",
        "createaccountmail": "بیر گئچیجی راست‌گله رمز ایشلت و اونو آشاغیدا بللندیرن ایمیل آدرسینه گؤندر",
        "createacct-realname": "دوغرو آد (ایستگه باغلی)",
-       "createaccountreason": "نَدَن‌لیک:",
        "createacct-reason": "سبب",
        "createacct-reason-ph": "ندن سیز باشقا حساب یارادیرسینیز",
        "createacct-reason-help": "حساب یاراتماق لیستینده گؤستریلن مساژ",
        "savearticle": "صفحه‌نی ذخیره ائت",
        "savechanges": "دَییشیکلیکلری ذخیره ائت",
        "publishpage": "صفحه‌نی یاییملا",
-       "publishchanges": "دَییشیک‌لیک‌لری یاییملا",
+       "publishchanges": "دَییشیک‌لیکلری یای",
        "preview": "اؤن‌گؤستریش",
        "showpreview": "سیناق گؤستریش",
        "showdiff": "دَییشیکلیکلری گؤستر",
        "log-name-managetags": "اِتیکت ایداره گئچمیشی",
        "log-name-tag": "اِتیکت ژورنالی",
        "rightsnone": "(هئچ)",
-       "revdelete-summary": "دَییشدیرمه قیساسی",
        "feedback-adding": "صحیفه‌یه گئری-بیلدیریم آرتیریلیر...",
        "feedback-back": "دالی",
        "feedback-bugcheck": "گؤزل! فقط لوطفاً باخین او [$1 تانینمیش خطالار]دان اولماسین.",
index 5470783..1e5d794 100644 (file)
        "login": "Танылыу",
        "login-security": "Үҙ шәхесегеҙҙе раҫлағыҙ",
        "nav-login-createaccount": "Танылыу йәки теркәлеү",
-       "userlogin": "Танылыу йәки теркәлеү",
-       "userloginnocreate": "Танылыу",
        "logout": "Тамамлау",
        "userlogout": "Тамамлау",
        "notloggedin": "Танылмағанһығыҙ",
        "userlogin-noaccount": "Иҫәп яҙмағыҙ юҡмы?",
        "userlogin-joinproject": "Проектҡа ҡушылырға",
-       "nologin": "Һеҙ теркәлмәгәнһегеҙме әле? '''$1'''.",
-       "nologinlink": "Иҫәп яҙыуын булдырырға",
        "createaccount": "Яңы ҡатнашыусыны теркәү",
-       "gotaccount": "Әгәр Һеҙ теркәлеү үткән булһағыҙ? '''$1'''.",
-       "gotaccountlink": "Танылыу",
-       "userlogin-resetlink": "Танылыу мәғлүмәттәрен оноттоғоҙмо?",
        "userlogin-resetpassword-link": "Серһүҙҙе оноттоғоҙмо?",
        "userlogin-helplink2": "Танылыу буйынса ярҙам",
        "userlogin-loggedin": " Һеҙ {{GENDER:$1|$1}} булараҡ индегеҙ инде. Башҡа файҙаланыусы булып инер өсөн аҫтағы ҡалыпты ҡулланығыҙ.",
        "createaccountmail": "Осраҡлы рәүештә хасил ителгән ваҡытлыса серһүҙҙе файҙаланырға һәм уны миңә ошо электрон почтаһы адресына ебәрергә",
        "createaccountmail-help": "Серһүҙен һорамайынса, башҡа кешегә иҫәп яҙмаһын төҙөү өсөн ҡулланыла ала.",
        "createacct-realname": "Ысын исемегеҙ (мотлаҡ түгел)",
-       "createaccountreason": "Сәбәп:",
        "createacct-reason": "Сәбәп",
        "createacct-reason-ph": "Икенсе иҫәп яҙмаһы һеҙгә ни өсөн кәрәк?",
        "createacct-reason-help": "Иҫәп яҙмаһын төҙөү журналында күренгән хәбәр",
        "watchthis": "Күҙәтеү исемлегенә",
        "savearticle": "Яҙҙырып ҡуйырға",
        "savechanges": "Яҙҙырып ҡуйырға",
-       "publishpage": "Ð\91иÑ\82Ñ\82е Ð±Ð°Ò«Ñ\82Ñ\8bÑ\80ырға",
+       "publishpage": "ЯÒ\99Ò\99Ñ\8bÑ\80Ñ\8bп Ò¡Ñ\83йырға",
        "publishchanges": "Яҙҙырып ҡуйырға",
        "preview": "Ҡарап сығыу",
        "showpreview": "Ҡарап сығырға",
        "userrights-nodatabase": "$1 базаһы юҡ йәки урындағы (локаль) база түгел.",
        "userrights-changeable-col": "Һеҙ үҙгәртә алған төркөмдәр",
        "userrights-unchangeable-col": "Һеҙ үҙгәртә алмаған төркөмдәр",
+       "userrights-expiry-options": "1 көн:1 day,1 аҙна:1 week,1 ай:1 mopnth, 3 ай:3 months,6 ай:6 months,1 йыл:1 year",
        "userrights-conflict": "Ҡатнашыусының хоҡуҡтарын үҙгәртеү яраманы! Зинһар, үҙгәрештәрҙе тикшерегеҙ һәм яңынан индерегеҙ.",
        "group": "Төркөм:",
        "group-user": "Ҡулланыусылар",
        "right-createtalk": "Фекер алышыу битен яһау",
        "right-createaccount": "Ҡатнашыусыларҙың яңы иҫәп яҙыуҙарын булдырыу",
        "right-autocreateaccount": "Ҡатнашыусының тышҡы иҫәп яҙмаһы менән инергә",
-       "right-minoredit": "Ò®ҙгәртеүҙәрҙе \"Әҙ үҙгәрештәр\" тип билдәләү",
+       "right-minoredit": "Ò¯ҙгәртеүҙәрҙе \"Әҙ үҙгәрештәр\" тип билдәләү",
        "right-move": "Биттәрҙең исемен үҙгәртеү",
        "right-move-subpages": "Ҡушымталары менән бергә биттәрҙең исемен алыштырыу",
        "right-move-rootuserpages": "Ҡулланыусыларҙың төп биттәренең исемен үҙгәртеү",
        "rcshowhidemine": "минең үҙгәртеүҙәремде $1",
        "rcshowhidemine-show": "Күрһәтергә",
        "rcshowhidemine-hide": "Йәшерергә",
-       "rcshowhidecategorization": "$1 биттәрҙе категориялаштырыу",
+       "rcshowhidecategorization": "Биттәр категориялаштырыуын $1",
        "rcshowhidecategorization-show": "Күрһәтергә",
        "rcshowhidecategorization-hide": "Йәшерелгән",
        "rclinks": "Һуңғы $2 көн эсендәге һуңғы $1 үҙгәртеүҙе күрһәтергә<br />$3",
        "notargettext": "Һеҙ был ғәмәл өсөн кәрәкле битте йәки ҡатнашыусыны күрһәтмәгәнһегеҙ.",
        "nopagetitle": "Бындай бит юҡ",
        "nopagetext": "Һеҙ күрһәткән бит юҡ.",
-       "pager-newer-n": "$1{{PLURAL:$1|1=1 яңыраҡ|$1 яңыраҡ}}",
+       "pager-newer-n": "{{PLURAL:$1|1=1 яңыраҡ|$1 яңыраҡ}}",
        "pager-older-n": "{{PLURAL:$1|1=1 иҫкерәк|$1 иҫкерәк}}",
        "suppress": "Йәшереү",
        "querypage-disabled": "Был махсус бит һөҙөмтәлелекте арттырыу өсөн ябылған.",
        "listusers-blocked": "(бикләнгән)",
        "activeusers": "Әүҙем ҡатнашыусылар исемлеге",
        "activeusers-intro": "Был — һуңғы $1 {{PLURAL:$1|көн}} эсендә ниҙер башҡарған ҡатнашыусылар исемлеге.",
-       "activeusers-count": "Ò»Ñ\83Ò£Ò\93Ñ\8b $3 {{PLURAL:$3|1=көн}} Ñ\8dÑ\81ендÓ\99ге Ò»Ñ\83Ò£Ò\93Ñ\8b ÐºÓ©Ð½Ð´Ó\99 $1 {{PLURAL:$1|үҙгәртеү}}",
+       "activeusers-count": "ÒºÑ\83Ò£Ò\93Ñ\8b {{PLURAL:$3|$3 ÐºÓ©Ð½Ð´Ó\99}} $1 {{PLURAL:$1|үҙгәртеү}}",
        "activeusers-from": "Ошондай хәрефтәрҙән башланған ҡатнашыусыларҙы күрһәтергә:",
        "activeusers-noresult": "Ҡатнашыусылар табылманы",
        "activeusers-submit": "Әүҙем ҡулланыусыларҙы күрһәтергә",
        "wlshowhideanons": "Аноним ҡулланыусылар",
        "wlshowhidepatr": "Тикшерелгән төҙәтеүҙәр",
        "wlshowhidemine": "Минең үҙгәртеүҙәр",
-       "wlshowhidecategorization": "Ð\91иттәрҙе категориялаштырыу",
+       "wlshowhidecategorization": "биттәрҙе категориялаштырыу",
        "watchlist-options": "Күҙәтеү исемлеге көйләүҙәре",
        "watching": "Күҙәтеү исемлегенә өҫтәү...",
        "unwatching": "Күҙәтеү исемлегенән сығарыу...",
        "undeleteviewlink": "ҡарарға",
        "undeleteinvert": "Һайланғандарҙы әйләндерергә",
        "undeletecomment": "Сәбәп:",
-       "undeletedrevisions": "$1 {{PLURAL:$1|өлгө}} тергеҙелде",
-       "undeletedrevisions-files": "{{PLURAL:$1|1=өлгө}} һәм {{PLURAL:$2|файл}} тергеҙелде",
-       "undeletedfiles": "{{PLURAL:$1|файл}} тергеҙелде",
        "cannotundelete": "Юйыуҙы кире алып булманы:\n$1",
        "undeletedpage": "'''$1 бите тергеҙелде'''\n\nҺуңғы юйыуҙарҙы һәм тергеҙеүҙәрҙе ҡарау өсөн, [[Special:Log/delete|юйыу яҙмалары журналын]] ҡарағыҙ.",
        "undelete-header": "Һуңғы юйылған биттәрҙе [[Special:Log/delete|юйыу яҙмалары журналында]] ҡарағыҙ.",
        "confirmemail": "Электрон почта адресын раҫлау",
        "confirmemail_noemail": "Һеҙҙең [[Special:Preferences|көйләүҙәрегеҙҙә]] дөрөҫ электрон почта адресы юҡ.",
        "confirmemail_text": "{{SITENAME}} проекты электрон почта мөмкинлектәрен ҡулланыр алдынан электрон почта адресының раҫланыуын талап итә.\nЭлектрон адресты раҫлау хаты һеҙҙең почтағыҙға ебәрелһен өсөн, түбәндәге төймәгә баҫығыҙ.\nХатта махсус биткә һылтанма буласаҡ, был һылтанманы браузерығыҙҙа асҡандан һуң, һеҙҙең электрон почта адресығыҙ раҫланған, тип һаналасаҡ.",
-       "confirmemail_pending": "ЭлекÑ\82Ñ\80он Ð¿Ð¾Ñ\87Ñ\82а Ð°Ð´Ñ\80еÑ\81Ñ\8bн Ñ\80аҫлаÑ\83 Ñ\85аÑ\82Ñ\8b Ò»ÐµÒ\99гÓ\99 ÐµÐ±Ó\99Ñ\80елгÓ\99н Ð¸Ð½Ðµ Ð¸Ð½Ð´Ðµ.\nÓ\98гÓ\99Ñ\80 Ò»ÐµÒ\99 Ð¸Ò«Ó\99п Ñ\8fÒ\99маһÑ\8bн Ñ\8fÒ£Ñ\8bÑ\80аҡ Ð±Ñ\83лдÑ\8bÑ\80һаÒ\93Ñ\8bÒ\99, Ò»ÐµÒ\99гÓ\99 Ð±Ñ\8bл Ñ\85аÑ\82Ñ\82Ñ\8b Ñ\8fÒ£Ñ\8bнан Ò»Ð¾Ñ\80аÑ\80 Ð°Ð»Ð´Ñ\8bнан, Ñ\85аÑ\82 ÐºÐ¸Ð»Ð³Ó\99нÑ\81е, Ð±ÐµÑ\80 Ð½Ð¸Ñ\81Ó\99 Ð¼Ð¸Ð½Ñ\83Ñ\82 ÐºÓ©Ñ\82Ó©Ñ\80гÓ\99 ÐºÓ\99Ñ\80Ó\99к.",
+       "confirmemail_pending": "ЭлекÑ\82Ñ\80он Ð¿Ð¾Ñ\87Ñ\82а Ð°Ð´Ñ\80еÑ\81Ñ\8bн Ñ\80аҫлаÑ\83 Ñ\85аÑ\82Ñ\8b Ò»ÐµÒ\99гÓ\99 ÐµÐ±Ó\99Ñ\80елгÓ\99йне.\nÓ\98гÓ\99Ñ\80 Ò»ÐµÒ\99 Ð¸Ò«Ó\99п Ñ\8fÒ\99маһÑ\8bн Ñ\8fÒ£Ñ\8bÑ\80аҡ Ð±Ñ\83лдÑ\8bÑ\80һаÒ\93Ñ\8bÒ\99, Ñ\80аҫлаÑ\83 Ñ\85аÑ\82Ñ\8bн Ò¡Ð°Ð±Ð°Ñ\82Ñ\82ан Ò»Ð¾Ñ\80аÑ\80 Ð°Ð»Ð´Ñ\8bнан, Ñ\8dлеккеһе ÐºÐ¸Ð»Ð³Ó\99нен Ð±ÐµÑ\80 Ð°Ò\99 ÐºÓ©Ñ\82өгөÒ\99.",
        "confirmemail_send": "Электрон почта адресын раҫлау хатын ебәрергә",
        "confirmemail_sent": "Электрон почта адресын раҫлау хаты ебәрелде.",
        "confirmemail_oncreate": "Электрон почта адресын раҫлау хаты һеҙ күрһәткән адрес буйынса ебәрелде.\nХатта күрһәтелгән һылтанма системала танылыу талап итмәй, ләкин элетрон почта мөмкинлектәрен вики проектта ҡулланыр өсөн, һеҙгә танылырға кәрәк.",
        "logentry-tag-update-revision": "$1 {{GENDER:$2||яңыртты}}  $4 өлгөһөнөң тамғаларын $3 битендә ({{PLURAL:$7|өҫтәне}} $6; {{PLURAL:$9|юйылған}} $8)",
        "logentry-tag-update-logentry": "$1 {{GENDER:$2||а}}журналда билдәләнгән яҙмаларҙы яңыртты $5 биттәр $3 (өҫтәлгән{{PLURAL:$7|а|ы}} $6; юйылған{{PLURAL:$9|а|ы}} $8)",
        "rightsnone": "(юҡ)",
-       "revdelete-summary": "үҙгәртеүҙәр тасуирламаһы",
        "feedback-adding": "Биткә кире белдереү өҫтәлә",
        "feedback-back": "Артҡа",
        "feedback-bugcheck": "Шәп! Тик [$1 билдәле хаталар] исемлегендә оҡшаш белдереүҙең булмауына иғтибар итегеҙ.",
index 3808477..fd6f1e0 100644 (file)
@@ -17,7 +17,9 @@
                        "Matthias Klostermayr",
                        "Macofe",
                        "George Animal",
-                       "Lokal Profil"
+                       "Lokal Profil",
+                       "Joe Watzmo",
+                       "WhatamIdoing"
                ]
        },
        "tog-underline": "Links unterstreichen:",
        "returnto": "Zruck za da Seitn $1.",
        "tagline": "Aus {{SITENAME}}",
        "help": "Huif",
-       "search": "Suach",
+       "search": "Suach Boarisch oda Deutsch",
        "searchbutton": "Suacha",
        "go": "Ausfyrn",
        "searcharticle": "Artikl",
        "externaldberror": "Entweder es ligt a Feeler bai da externen Authentifiziarung vur oder du derfst dai externs Benytzerkonto ned aktualisirn.",
        "login": "Eilogga",
        "nav-login-createaccount": "Eilogga / Konto olegn",
-       "userlogin": "Eilogga / Konto olegn",
-       "userloginnocreate": "Åmöden",
        "logout": "Obmöden",
        "userlogout": "Auslogga",
        "notloggedin": "Ned ågmödt",
-       "nologin": "Du host koa Nutzakonto? $1.",
-       "nologinlink": "A neichs Nutzakonto olegn",
        "createaccount": "Nutzakonto olegn",
-       "gotaccount": "Hosd scho a Nutzakonto? '''$1'''.",
-       "gotaccountlink": "Eilogga",
-       "userlogin-resetlink": "Hosd de Datn zan Eilogga vagessn?",
        "createaccountmail": "per E-Mail",
-       "createaccountreason": "Grund",
        "badretype": "De zwoa Posswerter stimmer ned ywereih.",
        "userexists": "Der Benutzernaum do is schoh vageem. Bittscheh nimm an aundern her.",
        "loginerror": "Feeler bei da Åmödung",
        "minoredit": "Nua Kloanigkeidn san vaendat worn",
        "watchthis": "De Seitn beobochtn",
        "savearticle": "Seitn speichan",
+       "publishpage": "Seitn vaeffentlichn",
+       "publishchanges": "Endarunga vaeffentlichn",
        "preview": "Vorschau",
        "showpreview": "Vorschau zoagn",
        "showdiff": "Endarunga zoagn",
        "searchprofile-articles-tooltip": "Suacha in $1",
        "searchprofile-images-tooltip": "Noch Datein suacha",
        "searchprofile-everything-tooltip": "In gsamtn Inhoid duachsuacha (inkl. Dischkriaseitn)",
-       "searchprofile-advanced-tooltip": "Suach in weidna Namasramm",
+       "searchprofile-advanced-tooltip": "Suach in weidana Namasramm",
        "search-result-size": "$1 ({{PLURAL:$2|1 Wort|$2 Weata}})",
        "search-result-category-size": "{{PLURAL:$1|1 Seitn|$1 Seitn}} ({{PLURAL:$2|1 Untakategorie|$2 Untakategorina}}, {{PLURAL:$3|1 Datei|$3 Datein}})",
        "search-redirect": "(Weidaloatung vo „$1“)",
        "searchrelated": "vawandt",
        "searchall": "olle",
        "search-nonefound": "Fia dei Suachofrog gibts koa Ergebnis",
-       "powersearch-legend": "Daweiterde Suach",
-       "powersearch-ns": "Suach in Nåmensraim:",
+       "powersearch-legend": "Daweitade Suach",
+       "powersearch-ns": "Suach in Namasraum:",
        "search-external": "Externe Suach",
        "preferences": "Eihstellungen",
        "mypreferences": "Mei Preferenz",
        "prefs-editing": "Beorweiten",
-       "rows": "Zeiln:",
-       "columns": "Spoiten",
        "searchresultshead": "Suachen",
        "savedprefs": "Deine Eihstellungen san gspeicherd worn.",
        "timezonelegend": "Zaidzone:",
        "nolicense": "koah Vurauswoi",
        "license-nopreview": "(es gibt koah Vurschau)",
        "upload_source_file": " (a Daatei auf deim Computer)",
-       "listfiles_search_for": "Suach noch da Daatei:",
+       "listfiles_search_for": "Suach noch Datei:",
        "imgfile": "Daatei",
        "listfiles": "Daateilisten",
        "listfiles_thumb": "Vurschaubüdel",
        "undeletebtn": "Wiederherstön",
        "undeletelink": "oschaugn / wiadaheastejn",
        "undeleteviewlink": "oschaugn",
-       "undeletedfiles": "$1 {{PLURAL:$1|Datei|Dateien}} san wieda hergstellt worn",
-       "undelete-search-box": "Suach noch gléschde Seiten",
+       "undelete-search-box": "Suach noch gleschde Artiken",
        "undelete-search-submit": "Suach",
        "undelete-show-file-submit": "Jo",
        "namespace": "Namasramm:",
        "unblocked-id": "Sperr-ID $1 is fraigeem worn",
        "blocklist": "Gspeade Nutza",
        "ipblocklist": "Gsperrte Nutza",
-       "ipblocklist-legend": "Suach noch am gsperrden Benytzer",
+       "ipblocklist-legend": "Suach noch an gsperrdn Nutza",
        "createaccountblock": "'s erstön voh Benutzerkóntós is gsperrd",
        "emailblock": "E-Póst vaschicker is gsperrd",
        "blocklink": "Sperrn",
        "htmlform-selectorother-other": "Åndre",
        "logentry-move-move_redir": "$1 hod de Seitn $3 af $4 {{GENDER:$2|verschom}} und hod dabei a Weidaloatung ibaschriem",
        "logentry-move-move_redir-noredirect": "$1 hod de Seitn $3 af $4 {{GENDER:$2|verschom}} und dabei a Weidaloatung ibaschriem, ohne a neiche ozlegn",
-       "revdelete-summary": "Zåmmfossungskommentar",
        "searchsuggest-search": "Suach",
        "searchsuggest-containing": "Voitextsuach noch ..."
 }
index a1625b8..3d6f8e3 100644 (file)
        "post-expand-template-argument-warning": "<strong>Увага</strong>: гэтая старонка ўтрымлівае прынамсі адзін парамэтар шаблёну, які мае занадта вялікі выгляд у разгорнутым выглядзе.\nГэтыя парамэтры былі прапушчаныя.",
        "post-expand-template-argument-category": "Старонкі, у якіх прапушчаныя парамэтры шаблёнаў",
        "parser-template-loop-warning": "Выяўлены цыкль у шаблёнах: [[$1]]",
+       "template-loop-category": "Старонкі з цыклямі шаблёнаў",
+       "template-loop-category-desc": "Старонка ўтрымлівае цыкль шаблёну, г. зн., шаблён уключае сам сябе рэкурсіўна.",
        "parser-template-recursion-depth-warning": "Перавышаны ліміт глыбіні рэкурсіі шаблёну ($1)",
        "language-converter-depth-warning": "Перавышанае абмежаваньне глыбіні канвэртару варыянтаў мовы ($1)",
        "node-count-exceeded-category": "Старонкі зь перавышанай колькасьцю вузлоў",
        "page_first": "першая",
        "page_last": "апошняя",
        "histlegend": "Параўнаньне: пазначце кропкамі дзьве вэрсіі для параўнаньня і націсьніце «ўвод» альбо кнопку ўнізе.<br />\nТлумачэньне: <strong>({{int:cur}})</strong> = адрозьненьні ад цяперашняй вэрсіі, <strong>({{int:last}})</strong> = адрозьненьні ад папярэдняй вэрсіі, <strong>{{int:minoreditletter}}</strong> = дробная праўка.",
-       "history-fieldset-title": "Пошук у гісторыі",
+       "history-fieldset-title": "Пошук вэрсіяў",
        "history-show-deleted": "Толькі выдаленыя",
        "histfirst": "найстарэйшыя",
        "histlast": "найноўшыя",
        "revdelete-success": "Бачнасьць вэрсіі абноўленая.",
        "revdelete-failure": "Немагчыма абнавіць бачнасьць вэрсіі:\n$1",
        "logdelete-success": "Бачнасьць падзеі ўсталяваная.",
-       "logdelete-failure": "'''Немагчыма ўстанавіць бачнасьць у журнале:'''\n$1",
-       "revdel-restore": "Ð\97ьмяніць бачнасьць",
+       "logdelete-failure": "Немагчыма ўсталяваць бачнасьць журнала:\n$1",
+       "revdel-restore": "зьмяніць бачнасьць",
        "pagehist": "Гісторыя старонкі",
        "deletedhist": "Выдаленая гісторыя",
        "revdelete-hide-current": "Памылка хаваньня запісу ад $2 $1: гэта цяперашняя вэрсія.\nЗапіс ня можа быць схаваны.",
        "revdelete-show-no-access": "Памылка паказу запісу ад $2 $1: гэты запіс быў пазначаны як «абмежаваны».\nВы ня маеце да яго доступу.",
        "revdelete-modify-no-access": "Памылка зьмены запісу ад $2 $1: гэты запіс быў пазначаны як «абмежаваны».\nВы ня маеце да яго доступу.",
        "revdelete-modify-missing": "Памылка мадыфікацыі запісу з ідэнтыфікатарам $1: запіс не існуе ў базе зьвестак!",
-       "revdelete-no-change": "'''Папярэджаньне:''' запіс ад $2 $1 ужо мае запатрабаваныя налады бачнасьці.",
+       "revdelete-no-change": "<strong>Папярэджаньне:</strong> запіс ад $2 $1 ужо мае запытаныя налады бачнасьці.",
        "revdelete-concurrent-change": "Памылка зьмены запісу ад $2 $1: яго статус быў зьменены кімсьці іншым, пакуль Вы спрабавалі яго зьмяніць.\nКалі ласка, праверце журналы.",
        "revdelete-only-restricted": "Памылка хаваньня запісаў элемэнтаў $2, $1: Вы ня можаце схаваць запісы ад прагляду адміністратарамі бяз выбару адной зь іншых наладаў хаваньня.",
        "revdelete-reason-dropdown": "* Агульныя прычыны выдаленьня\n** Парушэньне аўтарскіх правоў\n** Інфармацыя, якая парушае прыватнасьць\n** Недапушчальнае імя ўдзельніка\n** Патэнцыйна паклёпніцкія зьвесткі",
        "revdelete-reasonotherlist": "Іншая прычына",
        "revdelete-edit-reasonlist": "Рэдагаваць прычыны выдаленьня",
        "revdelete-offender": "Аўтар вэрсіі:",
-       "suppressionlog": "Ð\96Ñ\83Ñ\80нал Ñ\81Ñ\85аванÑ\8cнÑ\8fÑ\9e",
-       "suppressionlogtext": "Ð\9dÑ\96жÑ\8dй Ð¿Ð°Ð´Ð°Ð´Ð·ÐµÐ½Ñ\8b Ñ\81Ñ\8cпÑ\96Ñ\81 Ð²Ñ\8bдаленÑ\8cнÑ\8fÑ\9e Ñ\96 Ð±Ð»Ñ\8fкаванÑ\8cнÑ\8fÑ\9e, Ñ\81Ñ\85аванÑ\8bÑ\85 Ð½Ð°Ð²Ð°Ñ\82 Ð°Ð´ Ð°Ð´Ð¼Ñ\96нÑ\96Ñ\81Ñ\82Ñ\80аÑ\82аÑ\80аÑ\9e.\nÐ\93лÑ\8fдзÑ\96Ñ\86е [[Special:BlockList|Ñ\81Ñ\8cпÑ\96Ñ\81 Ð±Ð»Ñ\8fкаванÑ\8cнÑ\8fÑ\9e]], ÐºÐ°Ð± Ð¿Ð°Ð³Ð»Ñ\8fдзець сьпіс цяперашніх блякаваньняў.",
+       "suppressionlog": "Журнал хаваньняў",
+       "suppressionlogtext": "Ð\9dÑ\96жÑ\8dй Ð¿Ð°Ð´Ð°Ð´Ð·ÐµÐ½Ñ\8b Ñ\81Ñ\8cпÑ\96Ñ\81 Ð²Ñ\8bдаленÑ\8cнÑ\8fÑ\9e Ñ\96 Ð±Ð»Ñ\8fкаванÑ\8cнÑ\8fÑ\9e, Ñ\81Ñ\85аванÑ\8bÑ\85 Ð°Ð´ Ð°Ð´Ð¼Ñ\96нÑ\96Ñ\81Ñ\82Ñ\80аÑ\82аÑ\80аÑ\9e.\nÐ\93лÑ\8fдзÑ\96Ñ\86е [[Special:BlockList|Ñ\81Ñ\8cпÑ\96Ñ\81 Ð±Ð»Ñ\8fкаванÑ\8cнÑ\8fÑ\9e]], ÐºÐ°Ð± Ñ\83баÑ\87Ñ\8bць сьпіс цяперашніх блякаваньняў.",
        "mergehistory": "Аб’яднаць гісторыі старонак",
        "mergehistory-header": "Гэтая старонка дазваляе аб'яднаць гісторыю рэдагаваньняў адной старонкі з гісторыяй іншай, новай старонкі.\nУпэўніцеся, што гэтыя зьмены не парушаць пасьлядоўнасьць гісторыі старонкі.",
        "mergehistory-box": "Аб’яднаць гісторыі рэдагаваньняў дзьвюх старонак:",
        "saveusergroups": "Захаваць групы {{GENDER:$1|ўдзельнікаў і ўдзельніц}}",
        "userrights-groupsmember": "Уваходзіць у:",
        "userrights-groupsmember-auto": "Няяўны чалец:",
-       "userrights-groups-help": "Тут можна зьмяняць групы, да якіх належыць гэты ўдзельнік:\n* Адзначанае поле побач з назвай групы пазначае прыналежнасьць удзельніка да групы.\n* Пустое поле азначае, што ўдзельнік не належыць да групы.\n* Знак * азначае, што вы ня зможаце выдаліць удзельніка з групы, калі дададзіце яго да яе, і наадварот.\n* Знак # азначае, што вы можаце толькі зьменшыць час сканчэньня тэрміну дзеяньня гэтай групы, вы ня можаце павялічыць яго.",
+       "userrights-groups-help": "Тут можна зьмяняць групы, да якіх належыць гэты ўдзельнік:\n* Адзначанае поле побач з назвай групы пазначае прыналежнасьць удзельніка да групы.\n* Пустое поле азначае, што ўдзельнік не належыць да групы.\n* Знак * азначае, што вы ня зможаце выдаліць удзельніка з групы, калі дададзіце яго да яе, і наадварот.\n* Знак # азначае, што вы можаце толькі зьменшыць час сканчэньня тэрміну дзеяньня сяброўства ў гэтай групе, вы ня можаце павялічыць яго.",
        "userrights-reason": "Прычына:",
        "userrights-no-interwiki": "Вы ня маеце дазволу зьмяняць правы ўдзельнікаў іншых вікаў.",
        "userrights-nodatabase": "Базы зьвестак $1 не існуе альбо яна не зьяўляецца лякальнай.",
        "userrights-expiry-options": "1 дзень:1 day,1 тыдзень:1 week,1 месяц:1 month,3 месяцы:3 months,6 месяцаў:6 months,1 год:1 year",
        "userrights-invalid-expiry": "Тэрмін заканчэньня для групы «$1» зьяўляецца няслушным.",
        "userrights-expiry-in-past": "Час заканчэньня для групы «$1» знаходзіцца ў мінулым.",
-       "userrights-cannot-shorten-expiry": "Вы ня можаце падоўжыць час дзеяньня групы «$1». Толькі ўдзельнікі з правамі на дадаваньне і выдаленьне гэтай групы могуць падаўжаць час дзеяньня.",
+       "userrights-cannot-shorten-expiry": "Вы ня можаце падоўжыць час сяброўства ў групе «$1». Толькі ўдзельнікі з правамі на дадаваньне і выдаленьне гэтай групы могуць падаўжаць час сяброўства.",
        "userrights-conflict": "Канфлікт пры зьмене правоў удзельнікаў! Калі ласка, праверце і захавайце вашыя зьмены.",
        "group": "Група:",
        "group-user": "Удзельнікі",
        "rcfilters-invalid-filter": "Няслушны фільтар",
        "rcfilters-empty-filter": "Няма актыўных фільтраў. Паказаны ўвесь унёсак.",
        "rcfilters-filterlist-title": "Фільтры",
+       "rcfilters-filterlist-whatsthis": "Што гэта?",
        "rcfilters-filterlist-feedbacklink": "Пакінуць водгук пра новыя (бэта) фільтры",
        "rcfilters-highlightbutton-title": "Вылучыць вынікі",
        "rcfilters-highlightmenu-title": "Абярыце колер",
        "rcfilters-highlightmenu-help": "Абярыце колер для вылучэньня гэтай уласьцівасьці",
        "rcfilters-filterlist-noresults": "Фільтры ня знойдзеныя",
+       "rcfilters-noresults-conflict": "Няма вынікаў, бо крытэры пошуку супярэчаць адзін аднаму",
+       "rcfilters-state-message-subset": "Гэты фільтар ня мае эфэкту, бо яго вынікі ўключаныя ў вынікі больш {{PLURAL:$2|шырокага фільтру|шырокіх фільтраў}} (паспрабуйце вылучэньне, каб вызначыць яго): $1",
+       "rcfilters-state-message-fullcoverage": "Выбар усіх фільтраў у групе — тое ж самае, што і выбар ніводнага, адпаведна, гэты фільтар ня мае эфэкту. Група ўключае: $1",
        "rcfilters-filtergroup-registration": "Рэгістрацыя ўдзельнікаў",
        "rcfilters-filter-registered-label": "Зарэгістраваныя",
        "rcfilters-filter-registered-description": "Рэдактары, якія ўвайшлі ў сыстэму.",
        "rcfilters-filter-unregistered-label": "Незарэгістраваныя",
        "rcfilters-filter-unregistered-description": "Рэдактары, якія не ўвайшлі ў сыстэму",
-       "rcfilters-filter-unregistered-conflicts-user-experience-level": "ФÑ\96лÑ\8cÑ\82аÑ\80 Â«Ð\9dезаÑ\80Ñ\8dгÑ\96Ñ\81Ñ\82Ñ\80аванÑ\8b» Ð½ÐµÐ°ÐºÑ\82Ñ\8bÑ\9eнÑ\8b, Ð±Ð¾ Ñ\8fго Ñ\8dÑ\84Ñ\8dкÑ\82 Ð°Ð´Ð¼ÐµÐ½ÐµÐ½Ñ\8b {{PLURAL:$2|1=наступным фільтрам|наступнымі фільтрамі}} дасьведчаных удзельнікаў, {{PLURAL:$2|1=які знаходзіць|якія знаходзяць}} толькі зарэгістраваных удзельнікаў: $1",
+       "rcfilters-filter-unregistered-conflicts-user-experience-level": "Ð\93Ñ\8dÑ\82Ñ\8b Ñ\84Ñ\96лÑ\8cÑ\82аÑ\80 ÐºÐ°Ð½Ñ\84лÑ\96кÑ\82Ñ\83е Ð· {{PLURAL:$2|1=наступным фільтрам|наступнымі фільтрамі}} дасьведчаных удзельнікаў, {{PLURAL:$2|1=які знаходзіць|якія знаходзяць}} толькі зарэгістраваных удзельнікаў: $1",
        "rcfilters-filtergroup-authorship": "Рэдагаваць аўтарства",
        "rcfilters-filter-editsbyself-label": "Вашыя праўкі",
        "rcfilters-filter-editsbyself-description": "Праўкі, зробленыя вамі",
        "rcfilters-filter-editsbyother-label": "Праўкі іншых удзельнікаў",
        "rcfilters-filter-editsbyother-description": "Праўкі, зробленыя іншымі ўдзельнікамі (ня вамі).",
        "rcfilters-filtergroup-userExpLevel": "Узровень досьведу (толькі для зарэгістраваных удзельнікаў)",
-       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "Ð\93Ñ\8dÑ\82Ñ\8b Ñ\84Ñ\96лÑ\8cÑ\82аÑ\80 Ð½Ðµ Ð°ÐºÑ\82Ñ\8bÑ\9eнÑ\8b, Ð±Ð¾ Ñ\91н Ð·Ð½Ð°Ñ\85одзÑ\96Ñ\86Ñ\8c Ñ\82олÑ\8cкÑ\96 Ð·Ð°Ñ\80Ñ\8dгÑ\96Ñ\81Ñ\82Ñ\80аванÑ\8bÑ\85 Ñ\83дзелÑ\8cнÑ\96каÑ\9e, Ñ\82акÑ\96м Ñ\87Ñ\8bнам Ñ\84Ñ\96лÑ\8cÑ\82аÑ\80 Â«Ð\9dезаÑ\80Ñ\8dгÑ\96Ñ\81Ñ\82Ñ\80аванÑ\8bÑ\8f» ÐºÐ°Ñ\81Ñ\83е Ñ\8fго Ñ\8dÑ\84Ñ\8dкÑ\82.",
-       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "Фільтар «Незарэгістраваныя» канфліктуе з адным ці некалькімі фільтрамі ўзроўню досьведу. Фільтры ўзроўню досьведу шукаюць толькі зарэгістраваных удзельнікаў. Канфліктныя фільтры пазначаныя вышэй як неактыўныя.",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "Ð\93Ñ\8dÑ\82Ñ\8b Ñ\84Ñ\96лÑ\8cÑ\82аÑ\80 Ð´Ð¾Ñ\81Ñ\8cведÑ\83 Ð·Ð½Ð°Ñ\85одзÑ\96Ñ\86Ñ\8c Ñ\82олÑ\8cкÑ\96 Ð·Ð°Ñ\80Ñ\8dгÑ\96Ñ\81Ñ\82Ñ\80аванÑ\8bÑ\85 Ñ\83дзелÑ\8cнÑ\96каÑ\9e, Ñ\82акÑ\96м Ñ\87Ñ\8bнам Ñ\84Ñ\96лÑ\8cÑ\82аÑ\80 ÐºÐ°Ð½Ñ\84лÑ\96кÑ\82Ñ\83е Ð·Ñ\8c Ñ\84Ñ\96лÑ\8cÑ\82Ñ\80ам Â«Ð\9dезаÑ\80Ñ\8dгÑ\96Ñ\81Ñ\82Ñ\80аванÑ\8bÑ\8f».",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "Фільтар «Незарэгістраваныя» канфліктуе з адным ці некалькімі фільтрамі ўзроўню досьведу, якія шукаюць толькі зарэгістраваных удзельнікаў. Канфліктныя фільтры пазначаныя ў разьдзеле актыўных фільтраў вышэй.",
        "rcfilters-filter-user-experience-level-newcomer-label": "Навічкі",
        "rcfilters-filter-user-experience-level-newcomer-description": "Менш за 10 правак і 4 дні актыўнасьці.",
        "rcfilters-filter-user-experience-level-learner-label": "Вучні",
        "rcfilters-filter-categorization-description": "Запісы пра дадаваньне і выдаленьне старонак з катэгорыяў.",
        "rcfilters-filter-logactions-label": "Журнальныя дзеяньні",
        "rcfilters-filter-logactions-description": "Адміністрацыйныя дзеяньні, стварэньні рахункаў, выдаленьні старонак, загрузкі…",
+       "rcfilters-hideminor-conflicts-typeofchange-global": "Фільтар «Дробныя праўкі» канфліктуе з адным ці некалькімі фільтрамі «Тыпаў зьменаў», бо некаторыя тыпы зьменаў ня могуць быць вызначаныя як «дробныя». Канфліктныя фільтры пазначаныя ў разьдзеле актыўных фільтраў вышэй.",
+       "rcfilters-hideminor-conflicts-typeofchange": "Некаторыя тыпы зьменаў ня могуць быць вызначаныя як «дробныя», таму гэты фільтар канфліктуе з наступнымі фільтрамі «Тыпаў зьменаў»: $1",
+       "rcfilters-typeofchange-conflicts-hideminor": "Гэты фільтар тыпаў зьменаў канфліктуе зь фільтрам «Дробныя праўкі». Некаторыя тыпы зьменаў ня могуць быць вызначаныя як «дробныя».",
        "rcnotefrom": "Ніжэй {{PLURAL:$5|знаходзіцца зьмена|знаходзяцца зьмены}} з <strong>$4 $3</strong> (да <strong>$1</strong> на старонку).",
+       "rclistfromreset": "Скінуць выбар даты",
        "rclistfrom": "Паказаць зьмены з $2 $3",
        "rcshowhideminor": "$1 дробныя праўкі",
        "rcshowhideminor-show": "Паказаць",
        "php-uploaddisabledtext": "Загрузка файлаў была адключаная ў парамэтрах канфігурацыі PHP. Калі ласка, праверце значэньне парамэтра «file_uploads».",
        "uploadscripted": "Гэты файл утрымлівае HTML-код альбо скрыпт, які можа памылкова апрацоўвацца браўзэрам.",
        "upload-scripted-pi-callback": "Немагчыма загрузіць файл, які ўтрымлівае інструкцыі апрацоўкі табліцы стыляў XML.",
+       "upload-scripted-dtd": "Немагчыма загрузіць SVG-файлы, якія ўтрымліваюць нестандартнае DTD-абвяшчэньне.",
        "uploaded-script-svg": "У загружаным SVG-файле знойдзены небясьпечны элемэнт з падтрымкай сцэнароў «$1».",
        "uploaded-hostile-svg": "Знойдзены небясьпечны CSS у элемэнце стылю загружанага SVG-файла.",
        "uploaded-event-handler-on-svg": "Усталёўваць атрыбуты апрацоўніка падзеяў <code>$1=\"$2\"</code> не дазволена для SVG-файлаў.",
        "undeleteviewlink": "паказаць",
        "undeleteinvert": "Адваротны выбар",
        "undeletecomment": "Прычына:",
-       "undeletedrevisions": "{{PLURAL:$1|адноўленая $1 вэрсія|адноўленыя $1 вэрсіі|адноўленыя $1 вэрсіяў}}",
-       "undeletedrevisions-files": "адноўленыя $1 {{PLURAL:$1|вэрсія|вэрсіі|вэрсіяў}} і $2 {{PLURAL:$2|файл|файлы|файлаў}}",
-       "undeletedfiles": "{{PLURAL:$1|адноўлены $1 файл|адноўленыя $1 файлы|адноўленыя $1 файлаў}}",
        "cannotundelete": "Некаторыя або ўсе аднаўленьні не былі выкананыя:\n$1",
        "undeletedpage": "'''Старонка $1 была адноўленая'''\n\nГлядзіце [[Special:Log/delete|журнал выдаленьняў]] для прагляду апошніх выдаленьняў і аднаўненьняў.",
        "undelete-header": "Глядзіце [[Special:Log/delete|журнал выдаленьняў]] для прагляду апошніх выдаленьняў.",
        "newimages-summary": "Гэтая спэцыяльная старонка паказвае нядаўна загружаныя файлы.",
        "newimages-legend": "Фільтар",
        "newimages-label": "Назва файла (альбо яе частка):",
+       "newimages-user": "IP-адрас ці імя ўдзельніка",
        "newimages-showbots": "Паказаць загружаныя робатамі",
        "newimages-hidepatrolled": "Схаваць патруляваныя загрузкі",
        "noimages": "Выявы адсутнічаюць.",
        "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-restore": "$1 {{GENDER:$2|аднавіў|аднавіла}} старонку $3 ($4)",
+       "logentry-delete-restore-nocount": "$1 {{GENDER:$2|аднавіў|аднавіла}} старонку $3",
+       "restore-count-revisions": "$1 {{PLURAL:$1|вэрсія|вэрсіі|вэрсіяў}}",
        "logentry-delete-event": "$1 {{GENDER:$2|зьмяніў|зьмяніла}} бачнасьць $5 {{PLURAL:$5|1=падзеі ў журнале|падзеяў у журнале}} на $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|зьмяніў|зьмяніла}} бачнасьць $5 {{PLURAL:$5|вэрсіі|вэрсіяў}} старонкі $3: $4",
        "logentry-delete-event-legacy": "$1 {{GENDER:$2|зьмяніў|зьмяніла}} бачнасьць падзеяў у журнале на $3",
        "authmanager-authplugin-create-fail": "Дадатак аўтэнтыфікацыі адмовіў у стварэньні рахунку.",
        "authmanager-authplugin-setpass-denied": "Дадатак аўтэнтыфікацыі не дазваляе зьмяняць паролі.",
        "authmanager-authplugin-setpass-bad-domain": "Няслушны дамэн.",
+       "authmanager-autocreate-noperm": "Аўтаматычнае стварэньне рахункаў не дазволенае.",
+       "authmanager-autocreate-exception": "Аўтаматычнае стварэньне рахункаў часова адключанае праз папярэднія памылкі.",
+       "authmanager-userdoesnotexist": "Рахунак «$1» не зарэгістраваны.",
+       "authmanager-userlogin-remembermypassword-help": "Ці трэба запамінаць пароль больш за працягласьць сэсіі.",
+       "authmanager-username-help": "Імя ўдзельніка для аўтэнтыфікацыі.",
+       "authmanager-password-help": "Пароль для аўтэнтыфікацыі.",
+       "authmanager-domain-help": "Дамэн для вонкавай аўтэнтыфікацыі.",
+       "authmanager-retype-help": "Пароль яшчэ раз для пацьверджаньня.",
+       "authmanager-email-label": "Электронная пошта",
+       "authmanager-email-help": "Адрас электроннай пошты",
        "authmanager-realname-label": "Сапраўднае імя",
+       "authmanager-realname-help": "Сапраўднае імя ўдзельніка",
+       "authmanager-provider-password": "Аўтэнтыфікацыя на аснове паролю",
+       "authmanager-provider-password-domain": "Аўтэнтыфікацыя на аснове паролю і дамэну",
        "authmanager-provider-temporarypassword": "Часовы пароль",
        "changecredentials": "Зьмена ўліковых зьвестак",
        "removecredentials": "Выдаленьне ўліковых зьвестак",
index de9737f..d076f51 100644 (file)
        "search-interwiki-caption": "Сумежныя праекты",
        "search-interwiki-default": "Вынікі з $1:",
        "search-interwiki-more": "(яшчэ)",
+       "search-interwiki-more-results": "больш вынікаў",
        "search-relatedarticle": "Дачыняюцца*",
        "searchrelated": "маюць дачыненне",
        "searchall": "усе",
        "default-skin-not-found-no-skins": "Упс! Прадвызначаная вокладка для вашай вікі (<code>$wgDefaultSkin</code>), <code>$1</code>, недаступна.\n\nВы не ўстанавілі вокладкі.\n\n; Калі вы толькі што ўстанавілі ці абнавілі MediaWiki:\n: Магчыма, вы ўстанавілі з git, ці наўпрост з зыходнага коду, выкарыстаўшы іншы метад. Гэта нармальна. MediaWiki 1.24 і навейшыя не ўключаюць вокладкі ў асноўнае сховішча. Паспрабуйце ўстанавіць некалькі вокладак з [https://www.mediawiki.org/wiki/Category:All_skins каталога вокладак mediawiki.org], такім чынам:\n:* Узяўшы [https://www.mediawiki.org/wiki/Download tarball-інсталятар], які ўтрымлівае некалькі вокладак і прыставак. Вы можаце скапіяваць і ўставіць каталог <code>skins/</code> адтуль.\n:* Зрабіўшы клон аднаго з сховішчаў <code>mediawiki/skins/*</code> праз git у каталог <code>skins/</code> вашай інсталяцыі MediaWiki.\n: Калі вы распрацоўшчык MediaWiki, гэта не павінна адбіцца на вашым git-сховішчы. Гл. [https://www.mediawiki.org/wiki/Manual:Skin_configuration Інструкцыя: Настройка вокладак] дзеля інфармацыі па ўключэнні вокладак і выбары прадвызначэння.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (уключана)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 (<strong>выключана</strong>)",
+       "mediastatistics-table-extensions": "Магчымыя прыстаўкі",
        "mediastatistics-table-count": "Колькасць файлаў",
        "mediastatistics-table-totalbytes": "Агульны памер",
        "mediastatistics-header-unknown": "Невядомыя",
index 21dd334..3216686 100644 (file)
        "november-date": "$1 ноември",
        "december-date": "$1 декември",
        "period-am": "Преди обед",
-       "period-pm": "След обед",
+       "period-pm": "Следобед",
        "pagecategories": "{{PLURAL:$1|Категория|Категории}}",
        "category_header": "Страници в категория „$1“",
        "subcategories": "Подкатегории",
        "talk": "Беседа",
        "views": "Прегледи",
        "toolbox": "Инструменти",
+       "tool-link-userrights": "Промяна на {{GENDER:$1|потребителските}} групи",
+       "tool-link-userrights-readonly": "Преглед на {{GENDER:$1|потребителските}} групи",
        "tool-link-emailuser": "Писмо до {{GENDER:$1|потребителя}}",
        "userpage": "Потребителска страница",
        "projectpage": "Проектна страница",
        "cannotcreateaccount-title": "Невъзможно е да бъде създадена потребителска сметка",
        "yourdomainname": "Домейн:",
        "password-change-forbidden": "Не можете да променяте пароли в това уики.",
-       "externaldberror": "Ð\98ли Ðµ Ñ\81Ñ\82анала грешка в базата от данни при външното удостоверяване, или не ви е позволено да обновявате външната си сметка.",
+       "externaldberror": "Ð\92Ñ\8aзникна грешка в базата от данни при външното удостоверяване, или не ви е позволено да обновявате външната си сметка.",
        "login": "Влизане",
        "login-security": "Потвърдете идентичността си",
        "nav-login-createaccount": "Регистриране или влизане",
        "userlogin-resetpassword-link": "Забравена парола?",
        "userlogin-helplink2": "Помощ за влизане",
        "userlogin-loggedin": "Вече сте влезли в системата като {{GENDER:$1|$1}}.\nЧрез формуляра по-долу можете да влезете като друг потребител.",
+       "userlogin-reauth": "Трябва да влезете отново, за да потвърдите, че сте {{GENDER:$1|$1}}.",
        "userlogin-createanother": "Създаване на друга сметка",
        "createacct-emailrequired": "Адрес за електронна поща",
        "createacct-emailoptional": "Адрес за електронна поща (незадължително)",
        "accountcreated": "Потребителската сметка беше създадена",
        "accountcreatedtext": "Потребителската сметка [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|беседа]]) беше създадена.",
        "createaccount-title": "Създаване на сметка за {{SITENAME}}",
-       "createaccount-text": "Някой е създал сметка за $2 в {{SITENAME}} ($4) и е посочил този адрес за електронна поща. Паролата за „$2“ е „$3“. Необходимо е да влезете в системата и да смените паролата си.\n\nМожете да пренебрегнете това съобщение, ако сметката е създадена по грешка.",
+       "createaccount-text": "Ð\9dÑ\8fкой Ðµ Ñ\81Ñ\8aздал Ñ\81меÑ\82ка Ð·Ð° $2 Ð² {{SITENAME}} ($4) Ð¸ Ðµ Ð¿Ð¾Ñ\81оÑ\87ил Ñ\82ози Ð°Ð´Ñ\80еÑ\81 Ð·Ð° ÐµÐ»ÐµÐºÑ\82Ñ\80онна Ð¿Ð¾Ñ\89а. Ð\9fаÑ\80олаÑ\82а Ð·Ð° â\80\9e$2â\80\9c Ðµ â\80\9e$3â\80\9c. Ð\9dеобÑ\85одимо Ðµ Ð´Ð° Ð²Ð»ÐµÐ·ÐµÑ\82е Ð² Ñ\81иÑ\81Ñ\82емаÑ\82а Ð¸ Ð´Ð° Ñ\81мениÑ\82е Ð¿Ð°Ñ\80олаÑ\82а Ñ\81и.\n\nÐ\9cожеÑ\82е Ð´Ð° Ð¿Ñ\80енебÑ\80егнеÑ\82е Ñ\82ова Ñ\81Ñ\8aобÑ\89ение, Ð°ÐºÐ¾ Ñ\81меÑ\82каÑ\82а Ðµ Ñ\81Ñ\8aздадена Ð¿Ð¾ Ð¿Ð¾Ð³Ñ\80еÑ\88ка.",
        "login-throttled": "Направили сте твърде много опити да въведете паролата за тази сметка.\nНеобходимо е да изчакате $1 преди да опитате отново.",
        "login-abort-generic": "Влизането беше неуспешно - Прекратено",
        "login-migrated-generic": "Вашата сметка е бил преместена и потребителското Ви име вече не съществува в това уики.",
        "loginlanguagelabel": "Език: $1",
        "suspicious-userlogout": "Заявката ви за излизане от системата беше отхвърлена, тъй като изглежда е била изпратена погрешка от браузъра или кеширащото прокси.",
-       "createacct-another-realname-tip": "Ð\98Ñ\81Ñ\82инÑ\81коÑ\82о Ð¸Ð¼Ðµ Ðµ Ð½ÐµÐ·Ð°Ð´Ñ\8aлжиÑ\82елно.\nÐ\92 Ñ\81лÑ\83Ñ\87ай, Ñ\87е Ð±Ñ\8aде Ð¸Ð·Ð±Ñ\80або Ð´Ð° Ñ\81е Ð¿Ð¾Ð¿Ñ\8aлни, ще бъде използвано за да му се приписват приносите в уикито.",
+       "createacct-another-realname-tip": "Ð\98Ñ\81Ñ\82инÑ\81коÑ\82о Ð¸Ð¼Ðµ Ðµ Ð½ÐµÐ·Ð°Ð´Ñ\8aлжиÑ\82елно.\nÐ\92 Ñ\81лÑ\83Ñ\87ай, Ñ\87е Ð±Ñ\8aде Ð¸Ð·Ð±Ñ\80ано Ð´Ð° Ñ\81е Ð¿Ð¾Ð¿Ñ\8aлни, Ñ\82о ще бъде използвано за да му се приписват приносите в уикито.",
        "pt-login": "Влизане",
        "pt-login-button": "Влизане",
        "pt-createaccount": "Създаване на сметка",
        "resetpass_submit": "Избиране на парола и влизане",
        "changepassword-success": "Паролата беше променена успешно!",
        "changepassword-throttled": "Направили сте твърде много опити да въведете паролата за тази сметка.\nНеобходимо е да изчакате $1 преди да опитате отново.",
+       "botpasswords": "Пароли за ботове",
        "botpasswords-createnew": "Създаване на нова бот парола",
        "botpasswords-editexisting": "Редактиране на съществуваща бот парола",
        "botpasswords-label-appid": "Име на бота:",
        "botpasswords-deleted-body": "Паролата на бот „$1“ на потребител „$2“ е премахната.",
        "resetpass_forbidden": "Не е разрешена смяна на паролата",
        "resetpass_forbidden-reason": "Паролите не могат да се променят: $1",
-       "resetpass-no-info": "Ð\97а Ð´Ð° Ð´Ð¾Ñ\81Ñ\82Ñ\8aпваÑ\82е тази страница директно, необходимо е да влезете в системата.",
+       "resetpass-no-info": "Ð\97а Ð´Ð° Ð¸Ð¼Ð°Ñ\82е Ð´Ð¾Ñ\81Ñ\82Ñ\8aп Ð´Ð¾ тази страница директно, необходимо е да влезете в системата.",
        "resetpass-submit-loggedin": "Промяна на паролата",
        "resetpass-submit-cancel": "Отказ",
        "resetpass-wrong-oldpass": "Невалидна временна или текуща парола.\nВъзможно е вече да сте сменили паролата си или да сте поискали нова временна парола.",
        "passwordreset-invalidemail": "Неправилен email адрес",
        "changeemail": "Промяна или премахване на адреса за е-поща",
        "changeemail-header": "Попълнете формуляра, за да промените адреса на електронната си поща. Ако искате да премахнете адреса на електронната си поща, при попълване на формуляра оставете полето за новия адрес празно.",
-       "changeemail-no-info": "Ð\97а Ð´Ð° Ð´Ð¾Ñ\81Ñ\82Ñ\8aпваÑ\82е Ñ\82ази Ñ\81Ñ\82Ñ\80аниÑ\86а Ð´Ð¸Ñ\80екÑ\82но, Ð½ÐµÐ¾Ð±Ñ\85одимо Ðµ да влезете в системата.",
+       "changeemail-no-info": "Ð\97а Ð´Ð° Ð¸Ð¼Ð°Ñ\82е Ð´Ð¾Ñ\81Ñ\82Ñ\8aп Ð´Ð¾ Ñ\82ази Ñ\81Ñ\82Ñ\80аниÑ\86а Ð´Ð¸Ñ\80екÑ\82но, Ðµ Ð½ÐµÐ¾Ð±Ñ\85одимо да влезете в системата.",
        "changeemail-oldemail": "Текущ адрес за е-поща:",
        "changeemail-newemail": "Нов адрес за е-поща:",
        "changeemail-none": "(няма)",
        "changeemail-throttled": "Направили сте твърде много опити за влизане в системата. \nМоля, изчакайте $1 преди следващия опит.",
        "changeemail-nochange": "Моля, въведете различен нов адрес на електронна поща.",
        "resettokens": "Изчистване на маркерите",
+       "resettokens-text": "Можете да изчистите маркерите, които позволяват достъп до някои лични данни, свързани с вашия акаунт тук.\n\nТрябва да го направите, ако случайно сте ги споделили с някого или ако профилът ви е бил изложен на риск.",
        "resettokens-no-tokens": "Няма маркери за изчистване.",
        "resettokens-tokens": "Маркери:",
        "resettokens-token-label": "$1 (текуща стойност: $2)",
        "newarticletext": "Последвахте препратка към страница, която все още не съществува.\nЗа да я създадете, просто започнете да пишете в долната текстова кутия\n(вижте [$1 помощната страница] за повече информация).",
        "anontalkpagetext": "----\n<em>Това е дискусионната страница на анонимен потребител, който все още няма регистрирана сметка или не я използва</em>\nЗатова се налага да използваме IP-адрес, за да го идентифицираме.\nТакъв адрес може да се споделя от няколко потребители.\nАко сте анонимен потребител и мислите, че тези неуместни коментари са отправени към вас, [[Special:CreateAccount|регистрирайте се]] или [[Special:UserLogin|влезте в системата]], за да избегнете евентуално бъдещо объркване с други анонимни потребители.",
        "noarticletext": "Понастоящем няма текст на тази страница. Можете да [[Special:Search/{{PAGENAME}}|потърсите за заглавието на страницата]] в други страници, да <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} потърсите в съответните дневници] или [{{fullurl:{{FULLPAGENAME}}|action=edit}} да я създадете]</span>.",
-       "noarticletext-nopermission": "ТекÑ\83Ñ\89о в тази страница няма текст.\nМожете да [[Special:Search/{{PAGENAME}}|потърсите заглавието на тази страница ]] в други страници или да <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} потърсите в съответните дневници]</span>, но нямате права да създадете тази страница.",
+       "noarticletext-nopermission": "Ð\9fонаÑ\81Ñ\82оÑ\8fÑ\89ем в тази страница няма текст.\nМожете да [[Special:Search/{{PAGENAME}}|потърсите заглавието на тази страница ]] в други страници или да <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} потърсите в съответните дневници]</span>, но нямате права да създадете тази страница.",
        "missing-revision": "Версия #$1 на страницата „{{FULLPAGENAME}}“ не съществува.\n\nТова обикновено се дължи на препратка от историята на страницата, която е била изтрита.\nПодробности могат да бъдат открити в [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} дневника на изтриванията].",
        "userpage-userdoesnotexist": "Няма регистрирана потребителска сметка за „<nowiki>$1</nowiki>“. Изисква се потвърждение, че желаете да създадете/редактирате тази страница?",
        "userpage-userdoesnotexist-view": "Не е регистрирана потребителска сметка на име „$1“.",
        "continue-editing": "Продължаване към полето за редактиране",
        "previewconflict": "Този предварителен преглед отразява текста в горната текстова кутия така, както би се показал, ако съхраните.",
        "session_fail_preview": "За съжаление редакцията ви не успя да бъде обработена поради загуба на данните за текущата сесия.\n\nМоже би сте излезли от системата. <strong>Моля, уверете се, че сте влезли в профила си и опитайте отново.</strong>\nАко все още не работи, опитайте да [[Special:UserLogout|излезете]] и да влезете отново, също така проверете дали браузърът ви позволява бисквитки от този сайт.",
-       "session_fail_preview_html": "Ð\97а Ñ\81Ñ\8aжаление Ñ\80едакÑ\86иÑ\8fÑ\82а Ð²Ð¸ Ð½Ðµ Ð±ÐµÑ\88е Ð·Ð°Ð¿Ð¸Ñ\81ана Ð¿Ð¾Ñ\80ади Ð¸Ð·Ñ\82иÑ\87анеÑ\82о Ð½Ð° Ñ\81еÑ\81иÑ\8fÑ\82а Ð²Ð¸.\n\n<em>Тъй като {{SITENAME}} приема обикновен HTML, предварителният преглед е скрит като предпазна мярка срещу атаки чрез JavaScript.</em>\n\n<strong>Ако това е обикновен опит за редактиране, моля опитайте отново.</strong>\nАко все още не сработва, пробвайте да [[Special:UserLogout|излезете]] и влезете отново, и се уверете, че браузъра ви приема бисквитки от този сайт.",
+       "session_fail_preview_html": "Ð\97а Ñ\81Ñ\8aжаление Ñ\80едакÑ\86иÑ\8fÑ\82а Ð²Ð¸ Ð½Ðµ Ð±ÐµÑ\88е Ð·Ð°Ð¿Ð¸Ñ\81ана Ð¿Ð¾Ñ\80ади Ð·Ð°Ð³Ñ\83ба Ð½Ð° Ð´Ð°Ð½Ð½Ð¸Ñ\82е Ð·Ð° Ñ\82екÑ\83Ñ\89аÑ\82а Ñ\81еÑ\81иÑ\8f.\n\n<em>Тъй като {{SITENAME}} приема обикновен HTML, предварителният преглед е скрит като предпазна мярка срещу атаки чрез JavaScript.</em>\n\n<strong>Ако това е обикновен опит за редактиране, моля опитайте отново.</strong>\nАко все още не сработва, пробвайте да [[Special:UserLogout|излезете]] и влезете отново, и се уверете, че браузъра ви приема бисквитки от този сайт.",
        "token_suffix_mismatch": "'''Редакцията ви беше отхвърлена, защото браузърът ви е развалил пунктуационните знаци в редакционната отметка. Евентуалното съхранение би унищожило съдържанието на страницата. Понякога това се случва при използването на грешно работещи анонимни междинни сървъри.'''",
        "edit_form_incomplete": "'''Някои части от формуляра за редактиране не достигнаха до сървъра; проверете дали редакциите ви са непокътнати и опитайте отново.'''",
        "editing": "Редактиране на „$1“",
        "yourtext": "Вашият текст",
        "storedversion": "Съхранена версия",
        "nonunicodebrowser": "'''ВНИМАНИЕ: Браузърът ви не поддържа Уникод. За да можете спокойно да редактирате страници, всички знаци, невключени в ASCII-таблицата, ще бъдат заменени с шестнадесетични кодове.'''",
-       "editingold": "'''ВНИМАНИЕ: Редактирате остаряла версия на страницата.\nАко съхраните, всякакви промени, направени след тази версия, ще бъдат изгубени.'''",
+       "editingold": "'''Ð\92Ð\9dÐ\98Ð\9cÐ\90Ð\9dÐ\98Ð\95: Ð ÐµÐ´Ð°ÐºÑ\82иÑ\80аÑ\82е Ð¾Ñ\81Ñ\82аÑ\80Ñ\8fла Ð²ÐµÑ\80Ñ\81иÑ\8f Ð½Ð° Ñ\81Ñ\82Ñ\80аниÑ\86аÑ\82а.\nÐ\90ко Ñ\8f Ñ\81Ñ\8aÑ\85Ñ\80аниÑ\82е, Ð²Ñ\81Ñ\8fкакви Ð¿Ñ\80омени, Ð½Ð°Ð¿Ñ\80авени Ñ\81лед Ñ\82ази Ð²ÐµÑ\80Ñ\81иÑ\8f, Ñ\89е Ð±Ñ\8aдаÑ\82 Ð¸Ð·Ð³Ñ\83бени.'''",
        "yourdiff": "Разлики",
        "copyrightwarning": "Обърнете внимание, че всички приноси към {{SITENAME}} се публикуват при условията на $2 (за подробности вижте $1).\nАко не сте съгласни вашата писмена работа да бъде променяна и разпространявана без ограничения, не я публикувайте.<br />\n\nСъщо потвърждавате, че '''вие''' сте написали материала или сте използвали '''свободни ресурси''' — <em>обществено достояние</em> или друг свободен източник.\nАко сте ползвали чужди материали, за които имате разрешение, непременно посочете източника.\n\n<div style=\"font-variant:small-caps\">'''Не публикувайте произведения с авторски права без разрешение!'''</div>",
        "copyrightwarning2": "Обърнете внимание, че всички приноси към {{SITENAME}} могат да бъдат редактирани, променяни или премахвани от останалите сътрудници.\nАко не сте съгласни вашата писмена работа да бъде променяна без ограничения, не я публикувайте.<br />\nСъщо потвърждавате, че '''вие''' сте написали материала или сте използвали '''свободни ресурси''' — <em>обществено достояние</em> или друг свободен източник (за подробности вижте $1).\nАко сте ползвали чужди материали, за които имате разрешение, непременно посочете източника.\n\n<div style=\"font-variant:small-caps\">'''Не публикувайте произведения с авторски права без разрешение!'''</div>",
        "invalid-content-data": "Невалидни данни за съдържание",
        "content-not-allowed-here": "\nНа страницата [[$2]] не е позволено използването на $1",
        "editwarning-warning": "Ако излезете от тази страница, може да загубите всички несъхранени промени, които сте направили. \nАко сте влезли в системата, можете да изключите това предупреждение чрез менюто \"Редактиране\" в личните ви настройки.",
+       "editpage-invalidcontentmodel-title": "Форматът на съдържанието не се поддържа",
        "editpage-notsupportedcontentformat-title": "Форматът на съдържанието не се поддържа",
        "content-model-wikitext": "уикитекст",
        "content-model-text": "обикновен текст",
        "language-converter-depth-warning": "Надвишени са възможностите за автоматичен превод ($1)",
        "node-count-exceeded-category": "Страници, където е превишен възел-граф",
        "node-count-exceeded-category-desc": "Страницата превишава максималния възел-граф.",
-       "node-count-exceeded-warning": "Страница превиши броя на възлите",
+       "node-count-exceeded-warning": "Страницата превиши броя на възлите",
        "expansion-depth-exceeded-category": "Страници, в които е превишена дълбочината на разгръщане",
        "expansion-depth-exceeded-category-desc": "Страницата превишава максимално допустимата дълбочина на разгръщане.",
        "expansion-depth-exceeded-warning": "Страницата е превишила разрешената дълбочина на разгръщане",
        "page_first": "първа",
        "page_last": "последна",
        "histlegend": "<em>Разлики:</em> Изберете версиите, които желаете да сравните, чрез превключвателите срещу тях и натиснете &lt;Enter&gt; или бутона за сравнение.<br />\n<em>Легенда:</em> (<strong>тек</strong>) = разлика с текущата версия, (<strong>пред</strong>) = разлика с предишната версия, <strong>м</strong>&nbsp;=&nbsp;малка промяна",
-       "history-fieldset-title": "ТÑ\8aÑ\80Ñ\81ене Ð² Ð¸Ñ\81Ñ\82оÑ\80иÑ\8fÑ\82а",
-       "history-show-deleted": "Само Ð¸Ð·Ñ\82Ñ\80иÑ\82иÑ\82е",
+       "history-fieldset-title": "ТÑ\8aÑ\80Ñ\81ене Ð½Ð° Ð²ÐµÑ\80Ñ\81ии",
+       "history-show-deleted": "Само Ð·Ð° Ð¸Ð·Ñ\82Ñ\80иване Ð½Ð° Ð²ÐµÑ\80Ñ\81ии",
        "histfirst": "най-стари",
        "histlast": "най-нови",
        "historysize": "({{PLURAL:$1|1 байт|$1 байта}})",
        "rev-deleted-event": "(записът е изтрит)",
        "rev-deleted-user-contribs": "[потребителското име или IP адрес са премахнати - редакцията е скрита от приносите]",
        "rev-deleted-text-permission": "Тази версия на страницата е била '''изтрита'''.\nДопълнителна информация може да се съдържа в [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} Дневника на изтриванията].",
+       "rev-suppressed-text-permission": "Тази редация на страницата е била <strong>прикрита</strong>.\nДопълнителна информация може да се съдържа в [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} дневника на прикриванията].",
        "rev-deleted-text-unhide": "Тази версия на страницата е била '''изтрита'''.\nДопълнителна информация може се съдържа в [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} Дневника на изтриванията].\nКато администратор на сайта вие можете да [$1 прегледате тази редакция], ако желаете да продължите.",
        "rev-suppressed-text-unhide": "Тази версия на страницата е била '''прикрита'''.\nДопълнителна информация може да се съдържа в [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} Дневника на прикриванията].\nМожете да [$1 прегледате версията], ако желаете да продължите.",
        "rev-deleted-text-view": "Тази редация на страницата е била '''изтрита'''.\nКато администратор на сайта, вие можете да я прегледате.\nДопълнителна информация може да се съдържа в [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} Дневника на изтриванията].",
        "revdelete-show-file-confirm": "Необходимо е потвърждение, че желаете да прегледате изтритата версия на файла „<nowiki>$1</nowiki>“ от $2 $3.",
        "revdelete-show-file-submit": "Да",
        "revdelete-selected-text": "{{PLURAL:$1|Избрана версия|Избрани версии}} от [[:$2]]:",
+       "revdelete-selected-file": "{{PLURAL:$1|Избрана версия|Избрани версии}} на файл от [[:$2]]:",
        "logdelete-selected": "{{PLURAL:$1|Избрано събитие|Избрани събития}}:",
        "revdelete-text-text": "Изтритите редакции ще продължат да се виждат в историята на страницата, но части от съдържанието ще бъдат публично недостъпни.",
        "revdelete-text-file": "Изтритите файлови редакции ще продължат да се виждат в историята на страницата, но части от съдържанието им ще бъдат публично недостъпни.",
        "mergehistory-empty": "Няма редакции, които могат да бъдат слети.",
        "mergehistory-done": "$3 {{PLURAL:$3|версия|версии}} от $1 {{PLURAL:$3|беше успешно слята|бяха успешно слети}} с редакционната история на [[:$2]].",
        "mergehistory-fail": "Невъзможно е да се извърши сливане на редакционните истории; проверете страницата и времевите параметри.",
+       "mergehistory-fail-bad-timestamp": "Времевата отметка е невалидна.",
        "mergehistory-fail-invalid-source": "Изходната страница е невалидна.",
        "mergehistory-fail-invalid-dest": "Целевата страница е невалидна.",
        "mergehistory-fail-permission": "Нямате права за обединяване на историята.",
        "search-section": "(раздел $1)",
        "search-category": "(категория $1)",
        "search-suggest": "Вероятно имахте предвид: $1",
+       "search-rewritten": "Показани са резултати за $1. Вместо това търсете $2.",
        "search-interwiki-caption": "Сродни проекти",
        "search-interwiki-default": "Резултати от $1:",
        "search-interwiki-more": "(още)",
        "showingresultsinrange": "Показване на до {{PLURAL:$1|<strong>1</strong> резултат|<strong>$1</strong> резултата}} в диапазона от #<strong>$2</strong> до #<strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|Резултат <strong>$1</strong> от <strong>$3</strong>|Резултати <strong>$1 - $2</strong> от <strong>$3</strong>}}",
        "search-nonefound": "Няма резултати, които да отговарят на заявката.",
+       "search-nonefound-thiswiki": "Няма резултати, които да отговарят на заявката на този сайт.",
        "powersearch-legend": "Разширено търсене",
        "powersearch-ns": "Търсене в именни пространства:",
        "powersearch-togglelabel": "Избор:",
        "search-external": "Външно търсене",
        "searchdisabled": "Търсенето в {{SITENAME}} е временно изключено. Междувременно можете да търсите чрез Google. Обърнете внимание, че съхранените при тях страници най-вероятно са остарели.",
        "search-error": "Възникна грешка при търсене: $1",
+       "search-warning": "По време на търсенето беше генерирано предупреждение: $1",
        "preferences": "Настройки",
        "mypreferences": "Настройки",
        "prefs-edits": "Брой редакции:",
        "prefs-tokenwatchlist": "Маркер",
        "prefs-diffs": "Разлики",
        "prefs-help-prefershttps": "Това предпочитание ще бъде активирано при следващото влизане.",
-       "userrights": "УпÑ\80авление Ð½Ð° Ð¿Ð¾Ñ\82Ñ\80ебиÑ\82елÑ\81киÑ\82е права",
+       "userrights": "Ð\9fоÑ\82Ñ\80ебиÑ\82елÑ\81ки права",
        "userrights-lookup-user": "Изберете потребител",
        "userrights-user-editname": "Потребителско име:",
        "editusergroup": "Зареждане на потребителските групи",
        "editinguser": "Промяна на потребителските права на {{GENDER:$1|потребител }} <strong>[[User:$1|$1]]</strong> $2",
+       "viewinguserrights": "Преглед на потребителските права на {{GENDER:$1|потребител}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Редактиране на {{GENDER:$1|потребителските}} групи",
        "userrights-viewusergroup": "Преглед на {{GENDER:$1|потребителските}} групи",
        "saveusergroups": "Съхраняване на {{GENDER:$1|потребителските}} групи",
        "userrights-groupsmember": "Член на:",
-       "userrights-groupsmember-auto": "Ð\9fодÑ\80азбиÑ\80аÑ\89 Ñ\81е Ñ\87лен на:",
+       "userrights-groupsmember-auto": "Член Ð¿Ð¾ Ð¿Ð¾Ð´Ñ\80азбиÑ\80ане на:",
        "userrights-groups-help": "Може да променяте групите, в които е потребителят:\n* Поставена отметка означава, че потребителят е член на групата.\n* Поле без отметка означава, че потребителят не е член на групата.\n* Знакът * показва, че не можете да премахнете групата, след като е вече добавена (или обратно).",
        "userrights-reason": "Причина:",
        "userrights-no-interwiki": "Нямате права да редактирате потребителските групи на други уикита.",
        "userrights-unchangeable-col": "Групи, които не можете да променяте",
        "userrights-expiry-current": "Изтича на $1",
        "userrights-expiry": "Изтича на:",
+       "userrights-expiry-existing": "Оставащо време: $2, $3",
        "userrights-expiry-othertime": "Друго време:",
        "userrights-expiry-options": "1 ден:1 day,1 седмица:1 week,1 месец:1 month,3 месеца:3 months,6 месеца:6 months,1 година:1 year",
        "group": "Потребителска група:",
        "right-undelete": "Възстановяване на страници",
        "right-suppressrevision": "Преглед и възстановяване на версии, скрити от администраторите",
        "right-viewsuppressed": "Преглеждане на версии, скрити от който и да е потребител",
-       "right-suppressionlog": "Ð\9fÑ\80еглеждане Ð½Ð° Ñ\82айните дневници",
+       "right-suppressionlog": "Ð\9fÑ\80еглеждане Ð½Ð° Ñ\81кÑ\80иÑ\82ите дневници",
        "right-block": "Спиране на достъпа до редактиране",
        "right-blockemail": "Блокиране на потребители да изпращат писма по е-поща",
        "right-hideuser": "Блокиране и скриване на потребителско име",
        "right-unblockself": "Собствено отблокиране",
        "right-protect": "Променяне на нивото на защита и редактиране на каскадно-защитените страници",
        "right-editprotected": "Редактиране на страници защитени като „{{int:protect-level-sysop}}“",
+       "right-editsemiprotected": "Редактиране на страници защитени като „{{int:protect-level-autoconfirmed}}“",
+       "right-editcontentmodel": "Редактиране на модела на съдържанието на страница",
        "right-editinterface": "Редактиране на потребителския интерфейс",
        "right-editusercssjs": "редактиране на CSS и JS файловете на други потребители",
        "right-editusercss": "Редактиране на CSS файловете на други потребители",
        "grant-createaccount": "Създаване на сметки",
        "grant-createeditmovepage": "Създаване, редактиране и преместване на страници",
        "grant-delete": "Изтриване на страници, редакции и записи в дневника",
-       "grant-editinterface": "РедакÑ\82иÑ\80ане Ð½Ð° Ð¿Ñ\80оÑ\81Ñ\82Ñ\80анÑ\81Ñ\82воÑ\82о Ð½Ð°Ñ\80иÑ\87а Ð\9cедиÑ\8fУики Ð¸ CSS/JavaScript Ñ\83Ñ\87аÑ\81Ñ\82ник",
+       "grant-editinterface": "РедакÑ\82иÑ\80ане Ð½Ð° Ð\9cедиÑ\8fУики Ð¿Ñ\80оÑ\81Ñ\82Ñ\80анÑ\81Ñ\82воÑ\82о Ð¸ Ð¿Ð¾Ñ\82Ñ\80ебиÑ\82елÑ\81киÑ\8f CSS/JavaScript",
        "grant-editmycssjs": "Редактиране на личния CSS/JavaScript",
        "grant-editmyoptions": "Редактиране на вашите потребителски настройки",
        "grant-editmywatchlist": "Редактиране на списъка ви за наблюдение",
        "grant-highvolume": "Голям обем за редактиране",
        "grant-oversight": "Скриване на участниците и версия страници",
        "grant-patrol": "Патрулират промени страници",
-       "grant-privateinfo": "Ð\94оÑ\81Ñ\82Ñ\8aп Ð´Ð¾ Ð»Ð¸Ñ\87ни Ð¸Ð½Ñ\84оÑ\80маÑ\86ии",
-       "grant-protect": "Ð\97аÑ\89иÑ\82а Ð½Ð° Ð½ÐµÐ·Ð°Ñ\88Ñ\82иÑ\82ени страници",
-       "grant-rollback": "Ð\9eÑ\82каÑ\82Ñ\8bваÑ\82Ñ\8c Ð¿Ñ\80омени страници",
+       "grant-privateinfo": "Ð\94оÑ\81Ñ\82Ñ\8aп Ð´Ð¾ Ð»Ð¸Ñ\87на Ð¸Ð½Ñ\84оÑ\80маÑ\86иÑ\8f",
+       "grant-protect": "Ð\97аÑ\89иÑ\82а Ð¸ Ð¿Ñ\80емаÑ\85ване Ð½Ð° Ð·Ð°Ñ\89иÑ\82а Ð½Ð° страници",
+       "grant-rollback": "Ð\92Ñ\80Ñ\8aÑ\89ане Ð½Ð° Ð¿Ñ\80омени Ð¿Ð¾ страници",
        "grant-sendemail": "Изпращане на имейл до други потребители",
        "grant-uploadeditmovefile": "Качване, заменяне и прехвърляне на файлове",
        "grant-uploadfile": "Качване на нови файлове",
        "newuserlogpage": "Дневник на регистрациите",
        "newuserlogpagetext": "В този дневник се записват регистрациите на потребители.",
        "rightslog": "Дневник на потребителските права",
-       "rightslogtext": "Това е дневник на промените на потребителски права.",
+       "rightslogtext": "Това е дневник на промените на потребителските права.",
        "action-read": "четене на страницата",
        "action-edit": "редактиране на тази страница",
        "action-createpage": "създаване на страници",
        "action-userrights-interwiki": "редактиране на потребителските права на потребители от други уикита",
        "action-siteadmin": "заключване и отключване на базата от данни",
        "action-sendemail": "изпращане на е-писма",
+       "action-editmyoptions": "редактиране на собствените настройки",
        "action-editmywatchlist": "редактиране на списъка ви за наблюдение",
        "action-viewmywatchlist": "преглед на списъка ви за наблюдение",
        "action-viewmyprivateinfo": "преглеждане на личните данни",
        "action-editmyprivateinfo": "редактиране на личната си информация",
+       "action-editcontentmodel": "редактиране на модела на съдържанието на страница",
        "action-managechangetags": "създаване и (де)активиране на етикети",
        "action-applychangetags": "прилагане на етикетите заедно с промените ви",
        "action-purge": "почисти кеша на тази страница",
        "recentchanges-legend-heading": "<strong>Легенда:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (вижте също [[Special:NewPages|списъка с нови страници]])",
        "recentchanges-submit": "Покажи",
+       "rcfilters-restore-default-filters": "Възстановяване на филтри по подразбиране",
        "rcfilters-clear-all-filters": "Изчистване на всички филтри",
        "rcfilters-filterlist-title": "Филтри",
+       "rcfilters-filterlist-whatsthis": "Какво е това?",
+       "rcfilters-highlightmenu-title": "Изберете цвят",
        "rcfilters-filterlist-noresults": "Не са намерени филтри",
        "rcfilters-filtergroup-registration": "Регистрация на потребители",
+       "rcfilters-filter-registered-label": "Регистрация",
        "rcfilters-filter-unregistered-label": "Нерегистрирани",
        "rcfilters-filter-editsbyself-label": "Ваши собствени редакции",
        "rcfilters-filter-editsbyself-description": "Ваши редакции.",
        "rcfilters-filter-editsbyother-label": "Чужди редакции",
        "rcfilters-filter-user-experience-level-newcomer-label": "Новодошли",
+       "rcfilters-filter-user-experience-level-experienced-label": "Опитни потребители",
+       "rcfilters-filtergroup-automated": "Автоматизирани приноси",
        "rcfilters-filter-bots-label": "Бот",
+       "rcfilters-filter-bots-description": "Редакции, направени с помощта на автоматизирани инструменти.",
        "rcfilters-filter-humans-label": "Човек (не бот)",
+       "rcfilters-filter-humans-description": "Редакции, направени от редактори.",
+       "rcfilters-filtergroup-reviewstatus": "Проверка на статуса",
+       "rcfilters-filter-patrolled-label": "Патрулирано",
+       "rcfilters-filter-patrolled-description": "Редакции, отбелязани като патрулирани.",
+       "rcfilters-filter-unpatrolled-label": "Непатрулирано",
+       "rcfilters-filter-unpatrolled-description": "Редакции, неотбелязани като патрулирани.",
+       "rcfilters-filtergroup-significance": "Значимост",
        "rcfilters-filter-minor-label": "Малки промени",
        "rcfilters-filter-major-label": "Обикновени редакции",
        "rcfilters-filtergroup-changetype": "Вид на промяната",
        "filetype-mime-mismatch": "Файловото разширение \".$1\" не отговаря на MIME типа на файла ($2).",
        "filetype-badmime": "Не е разрешено качването на файлове с MIME-тип „$1“.",
        "filetype-bad-ie-mime": "Този файл не може да бъде качен, защото Internet Explorer го разпознава като „$1“, който е отхвърлен и потенциално опасен файлов формат.",
-       "filetype-unwanted-type": "'''â\80\9e.$1â\80\9c''' Ðµ Ð½ÐµÐ¶ÐµÐ»Ð°Ð½ Ñ\84айлов Ñ\84оÑ\80маÑ\82. {{PLURAL:$3|Ð\9fÑ\80еопръчителният файлов формат е|Препоръчителните файлови формати са}} $2.",
+       "filetype-unwanted-type": "'''â\80\9e.$1â\80\9c''' Ðµ Ð½ÐµÐ¶ÐµÐ»Ð°Ð½ Ñ\84айлов Ñ\84оÑ\80маÑ\82. {{PLURAL:$3|Ð\9fÑ\80епоръчителният файлов формат е|Препоръчителните файлови формати са}} $2.",
        "filetype-banned-type": "'''„.$1“''' не {{PLURAL:$4|е позволен файлов формат|са позволени файлови формати}}. {{PLURAL:$3|Позволеният файлов формат е|Позволените файлови формати са}} $2.",
        "filetype-missing": "Файлът няма разширение (напр. „.jpg“).",
        "empty-file": "Подаденият от вас файл беше празен.",
        "upload-options": "Настройки за качване",
        "watchthisupload": "Наблюдаване на файла",
        "filewasdeleted": "Файл в този име е съществувал преди време, но е бил изтрит. Проверете $1 преди да го качите отново.",
+       "filename-thumb-name": "Заглавието на този файл изглежда като заглавие на миниатюра (thumbnail). Не качвайте миниатюри на файлове, които вече съществуват в това същото уки. Освен това, променете заглавието на файла с някое по-съдържателно и без представката, която е характерна за миниатюрите.",
        "filename-bad-prefix": "Името на файла, който качвате, започва с '''„$1“''', което е неописателно име, типично задавано по автоматичен начин от цифровите камери или апарати. Изберете по-описателно име на файла.",
        "upload-proto-error": "Неправилен протокол",
        "upload-proto-error-text": "Изисква се адрес започващ с <code>http://</code> или <code>ftp://</code>.",
        "upload-form-label-infoform-date": "Дата",
        "upload-form-label-own-work-message-generic-local": "Потвърждавам, че качвам този файл в съответствие с правилата и лицензионната политика на сайта {{SITENAME}}.",
        "upload-form-label-not-own-work-message-generic-local": "Ако не можете да заредите този файл в съответствие с правилата на сайта {{SITENAME}}, моля, затворете този прозорец и опитайте друг метод.",
+       "upload-form-label-not-own-work-message-generic-foreign": "Ако не можете да качите този файл в съответствие с правилата на споделеното хранилище, моля, затворете този прозорец и опитайте друг метод.",
        "backend-fail-notexists": "Файлът $1 не съществува.",
        "backend-fail-delete": "Файлът $1 не може да бъде изтрит.",
        "backend-fail-alreadyexists": "Файлът $1 вече съществува.",
        "img-auth-nopathinfo": "Липсва PATH_INFO.\nВашият сървър не е конфигуриран да предава тази информация.\nТой може да е базиран на CGI и да не може да поддържа img_auth.\nВижте https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "img-auth-notindir": "Търсеният път не е в настроената директория за качвания.",
        "img-auth-badtitle": "Грешка при изграждането на валидно заглавие от „$1“.",
-       "img-auth-nologinnWL": "Не сте влезли в системата и „$1“ не е в белия списък.",
+       "img-auth-nologinnWL": "Не сте влезли в системата и „$1“ не е в разрешения списък.",
        "img-auth-nofile": "Файлът „$1“ не съществува.",
        "img-auth-isdir": "Опитвате се да осъществите достъп до директорията „$1“.\nРазрешен е само достъп до файловете.",
        "img-auth-streaming": "Излъчване \"$1\"",
        "license": "Лицензиране:",
        "license-header": "Лицензиране",
        "nolicense": "Нищо не е избрано",
+       "licenses-edit": "Промяна на параметрите на лицензите",
        "license-nopreview": "(Не е наличен предварителен преглед)",
        "upload_source_url": "(избраният от вас файл от валиден, публично достъпен интернет-адрес)",
        "upload_source_file": "(файл на вашия компютър)",
        "sharedupload-desc-there": "Този файл е от $1 и може да се използва от други проекти.\nЗа повече информация вижте [$2 описателната му страница].",
        "sharedupload-desc-here": "Този файл е от $1 и може да се използва от други проекти.\nСледва информация за файла, достъпна през [$2 оригиналната му описателна страница].",
        "sharedupload-desc-edit": "Този файл е от $1 и може да бъде използван от други проекти.\nВероятно желаете да редактирате описанието му на [$2 неговата описателна страница].",
+       "sharedupload-desc-create": "Този файл е от $1 и може да бъде използван от други проекти.\nВероятно желаете да редактирате описанието му на [$2 неговата описателна страница].",
        "filepage-nofile": "Не съществува файл с това име.",
        "filepage-nofile-link": "Не съществува файл с това име, но можете [$1 да го качите].",
        "uploadnewversion-linktext": "Качване на нова версия на файла",
        "unwatchedpages": "Ненаблюдавани страници",
        "listredirects": "Списък на пренасочванията",
        "listduplicatedfiles": "Списък на повтарящи се файлове",
+       "listduplicatedfiles-summary": "Това е списък на файловете, за които последната версия е дубликат с последната версия на друг файл. Показани са само локалните файлове.",
        "unusedtemplates": "Неизползвани шаблони",
        "unusedtemplatestext": "Тази страница съдържа списък на страниците в именно пространство {{ns:template}}, които не са включени в друга страница. Проверявайте за препратки към отделните шаблони преди да ги изтриете или предложите за изтриване.",
        "unusedtemplateswlh": "други препратки",
        "statistics-pages-desc": "Всички страници в уикито, включително дискусионни, пренасочващи страници и т.н.",
        "statistics-files": "Качени файлове",
        "statistics-edits": "Брой редакции по страници от началото на {{SITENAME}}",
-       "statistics-edits-average": "СÑ\80едно редакции на страница",
+       "statistics-edits-average": "СÑ\80еден Ð±Ñ\80ой редакции на страница",
        "statistics-users": "Регистрирани [[Special:ListUsers|потребители]]",
        "statistics-users-active": "Активни потребители",
        "statistics-users-active-desc": "Потребители, направили редакция през {{PLURAL:$1|последния ден|последните $1 дни}}",
+       "pageswithprop": "Страници с page property",
+       "pageswithprop-legend": "Страници с page property",
+       "pageswithprop-text": "На тази страница са показани всички страници, които използват page property.",
        "pageswithprop-prop": "Име на свойството:",
        "pageswithprop-submit": "Отваряне",
        "doubleredirects": "Двойни пренасочвания",
        "wantedpages": "Желани страници",
        "wantedpages-badtitle": "Невалидно заглавие в резултатното множество: $1",
        "wantedfiles": "Желани файлове",
+       "wantedfiletext-cat": "Следните файлове се използват, но не съществуват. Файлове от външни хранилища могат да бъдат показани. Всички подобни неверни положителни резултати ще бъдат <del>зачеркнати</del>. Също така, страниците, които включват файлове, които не съществуват са включени в [[:$1]].",
        "wantedfiletext-nocat": "Следните файлове се използват, но не съществуват. Възможно е да са включени файлове от външни хранилища, въпреки че съществуват. Всички такива случаи на възможна фалшива тревога ще бъдат показвани <del>зачеркнати</del>.",
        "wantedtemplates": "Желани шаблони",
        "mostlinked": "Най-препращани страници",
        "log-title-wildcard": "Търсене на заглавия, започващи със",
        "showhideselectedlogentries": "Промяна на видимостта на избраните записи",
        "checkbox-select": "Избери: $1",
-       "checkbox-all": "всички",
+       "checkbox-all": "Ð\92сички",
        "checkbox-none": "никои",
        "checkbox-invert": "обърни избора",
        "allpages": "Всички страници",
        "allpagesbadtitle": "Зададеното име е невалидно. Възможно е да съдържа междуезикова или междупроектна представка или пък знаци, които не могат да се използват в заглавия.",
        "allpages-bad-ns": "В {{SITENAME}} не съществува именно пространство „$1“.",
        "allpages-hide-redirects": "Скриване на пренасочванията",
+       "cachedspecial-viewing-cached-ttl": "Преглеждате кеширана версия на страница, която е за последно обновена преди $1.",
        "cachedspecial-refresh-now": "Преглед на текущата.",
        "categories": "Категории",
        "categories-submit": "Показване",
        "activeusers-intro": "Това е списък на потребителите, които са демонстрирали някаква активност през {{PLURAL:$1|последния|последните}} $1 {{PLURAL:$1|ден|дни}}.",
        "activeusers-count": "$1 {{PLURAL:$1|действие|действия}} за {{PLURAL:$3|последния ден|последните $3 дни}}",
        "activeusers-from": "Показване на потребителите, започвайки от:",
+       "activeusers-groups": "Показване на потребителите, принадлежащи към групи:",
+       "activeusers-excludegroups": "Скриване на потребителите, принадлежащи към групи:",
        "activeusers-noresult": "Няма намерени потребители.",
        "activeusers-submit": "Показване на активните потребители",
        "listgrouprights": "Права по потребителски групи",
        "watchlistanontext": "За преглеждане и редактиране на списъка за наблюдение се изисква влизане в системата.",
        "watchnologin": "Не сте влезли",
        "addwatch": "Добавяне към списъка за наблюдение",
-       "addedwatchtext": "СÑ\82Ñ\80аниÑ\86аÑ\82а â\80\9e'''[[:$1]]'''â\80\9c Ð¸ Ð±ÐµÑ\81едаÑ\82а Ñ\9d Ð±Ñ\8fÑ\85а Ð´Ð¾Ð±Ð°Ð²ÐµÐ½Ð¸ ÐºÑ\8aм [[Special:Watchlist|Ñ\81пиÑ\81Ñ\8aка Ð²и за наблюдение]].",
+       "addedwatchtext": "СÑ\82Ñ\80аниÑ\86аÑ\82а â\80\9e'''[[:$1]]'''â\80\9c Ð¸ Ð±ÐµÑ\81едаÑ\82а Ñ\9d Ð±Ñ\8fÑ\85а Ð´Ð¾Ð±Ð°Ð²ÐµÐ½Ð¸ ÐºÑ\8aм [[Special:Watchlist|Ñ\81пиÑ\81Ñ\8aка Ð\92и за наблюдение]].",
        "addedwatchtext-short": "Страницата „$1“ беше добавена към списъка Ви за наблюдение.",
        "removewatch": "Премахване от списъка за наблюдение",
-       "removedwatchtext": "СÑ\82Ñ\80аниÑ\86аÑ\82а â\80\9e[[:$1]]â\80\9c Ð¸ Ð±ÐµÑ\81едаÑ\82а Ñ\9d Ð±Ñ\8fÑ\85а Ð¿Ñ\80емаÑ\85наÑ\82и Ð¾Ñ\82 [[Special:Watchlist|Ñ\81пиÑ\81Ñ\8aка Ð²и за наблюдение]].",
+       "removedwatchtext": "СÑ\82Ñ\80аниÑ\86аÑ\82а â\80\9e[[:$1]]â\80\9c Ð¸ Ð±ÐµÑ\81едаÑ\82а Ñ\9d Ð±Ñ\8fÑ\85а Ð¿Ñ\80емаÑ\85наÑ\82и Ð¾Ñ\82 [[Special:Watchlist|Ñ\81пиÑ\81Ñ\8aка Ð\92и за наблюдение]].",
        "removedwatchtext-short": "Страницата „$1“ беше премахната от списъка Ви за наблюдение.",
        "watch": "Наблюдение",
        "watchthispage": "Наблюдаване на страницата",
        "unwatchthispage": "Спиране на наблюдение",
        "notanarticle": "Не е страница",
        "notvisiblerev": "Версията беше изтрита",
-       "watchlist-details": "{{PLURAL:$1|Ð\95дна Ð½Ð°Ð±Ð»Ñ\8eдавана Ñ\81Ñ\82Ñ\80аниÑ\86а|$1 Ð½Ð°Ð±Ð»Ñ\8eдавани Ñ\81Ñ\82Ñ\80аниÑ\86и}} Ð¾Ñ\82 Ñ\81пиÑ\81Ñ\8aка Ð²и за наблюдение (без беседи).",
+       "watchlist-details": "{{PLURAL:$1|Ð\95дна Ð½Ð°Ð±Ð»Ñ\8eдавана Ñ\81Ñ\82Ñ\80аниÑ\86а|$1 Ð½Ð°Ð±Ð»Ñ\8eдавани Ñ\81Ñ\82Ñ\80аниÑ\86и}} Ð¾Ñ\82 Ñ\81пиÑ\81Ñ\8aка Ð\92и за наблюдение (без беседи).",
        "wlheader-enotif": "Известяването по е-поща е включено.",
        "wlheader-showupdated": "Страниците, които са били променени след последния път, когато сте ги посетили, са показани в '''получер'''.",
        "wlnote": "{{PLURAL:$1|Показана е последната промяна|Показани са последните '''$1''' промени}} през {{PLURAL:$2|последния час|последните '''$2''' часа}}, започвайки от от $3, $4.",
        "watchlist-options": "Опции на списъка за наблюдение",
        "watching": "Наблюдение…",
        "unwatching": "Спиране на наблюдение…",
-       "watcherrortext": "Ð\92Ñ\8aзникна Ð³Ñ\80еÑ\88ка Ð¿Ñ\80и Ð¿Ñ\80омÑ\8fна Ð½Ð° Ð½Ð°Ñ\81Ñ\82Ñ\80ойкиÑ\82е Ð·Ð° Ñ\81пиÑ\81Ñ\8aка Ð²и за наблюдение за „$1“.",
+       "watcherrortext": "Ð\92Ñ\8aзникна Ð³Ñ\80еÑ\88ка Ð¿Ñ\80и Ð¿Ñ\80омÑ\8fна Ð½Ð° Ð½Ð°Ñ\81Ñ\82Ñ\80ойкиÑ\82е Ð·Ð° Ñ\81пиÑ\81Ñ\8aка Ð\92и за наблюдение за „$1“.",
        "enotif_reset": "Отбелязване на всички страници като посетени",
        "enotif_impersonal_salutation": "Потребител на {{SITENAME}}",
        "enotif_subject_deleted": "Страницата „$1“ в {{SITENAME}} беше {{GENDER:$2|изтрита}} от $2",
        "delete-legend": "Изтриване",
        "historywarning": "<strong>Внимание:</strong> Страницата, която възнамерявате да изтриете, има история с приблизително $1 {{PLURAL:$1|редакция|редакции}}:",
        "historyaction-submit": "Показване",
-       "confirmdeletetext": "Ð\9dа Ð¿Ñ\8aÑ\82 Ñ\81Ñ\82е Ð´Ð° Ð¸Ð·Ñ\82Ñ\80иеÑ\82е Ñ\81Ñ\82Ñ\80аниÑ\86а Ð·Ð°ÐµÐ´Ð½Ð¾ Ñ\81 Ñ\86Ñ\8fлаÑ\82а Ñ\9d Ñ\80едакÑ\86ионна Ð¸Ñ\81Ñ\82оÑ\80иÑ\8f.\nÐ\9fоÑ\82вÑ\8aÑ\80деÑ\82е, Ñ\87е Ð¸Ñ\81каÑ\82е Ñ\82ова, Ñ\80азбиÑ\80аÑ\82е Ð¿Ð¾Ñ\81ледÑ\81Ñ\82виÑ\8fÑ\82а Ð¸ Ð¿Ñ\80авиÑ\82е Ñ\82ова Ð² Ñ\81Ñ\8aоÑ\82веÑ\82Ñ\81Ñ\82вие Ñ\81 [[{{MediaWiki:Policy-url}}|линиÑ\8fÑ\82а Ð½Ð° Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ðµ]].",
+       "confirmdeletetext": "Ð\9dа Ð¿Ñ\8aÑ\82 Ñ\81Ñ\82е Ð´Ð° Ð¸Ð·Ñ\82Ñ\80иеÑ\82е Ñ\81Ñ\82Ñ\80аниÑ\86а Ð·Ð°ÐµÐ´Ð½Ð¾ Ñ\81 Ñ\86Ñ\8fлаÑ\82а Ñ\9d Ñ\80едакÑ\86ионна Ð¸Ñ\81Ñ\82оÑ\80иÑ\8f.\nÐ\9fоÑ\82вÑ\8aÑ\80деÑ\82е, Ñ\87е Ð¸Ñ\81каÑ\82е Ñ\82ова, Ñ\80азбиÑ\80аÑ\82е Ð¿Ð¾Ñ\81ледÑ\81Ñ\82виÑ\8fÑ\82а Ð¸ Ð¿Ñ\80авиÑ\82е Ñ\82ова Ð² Ñ\81Ñ\8aоÑ\82веÑ\82Ñ\81Ñ\82вие Ñ\81 [[{{MediaWiki:Policy-url}}|полиÑ\82икаÑ\82а]].",
        "actioncomplete": "Действието беше изпълнено",
        "actionfailed": "Действието не сполучи",
        "deletedtext": "Страницата „$1“ беше изтрита. Вижте $2 за запис на последните изтривания.",
        "rollback-success": "Отменени редакции на {{GENDER:$3|$1}};\nвъзвръщане към последната версия на {{GENDER:$4|$2}}.",
        "sessionfailure-title": "Прекъсната сесия",
        "sessionfailure": "Изглежда има проблем със сесията ви; действието беше отказано като предпазна мярка срещу крадене на сесията. Натиснете бутона за връщане на браузъра, презаредете страницата, от която сте дошли, и опитайте отново.",
+       "changecontentmodel": "Промяна на модела на съдържанието на страница",
+       "changecontentmodel-legend": "Промяна на модела на съдържанието",
        "changecontentmodel-title-label": "Заглавие на страницата",
+       "changecontentmodel-model-label": "Нов модел на съдържанието",
        "changecontentmodel-reason-label": "Причина:",
        "changecontentmodel-submit": "Променяне",
+       "changecontentmodel-success-title": "Моделът на съдържание бе променен",
        "changecontentmodel-success-text": "Типът на съдържанието на [[:$1]] е успешно променен.",
        "log-name-contentmodel": "Дневник на cъдържанието промяна модела",
        "log-description-contentmodel": "Събития, отнасящи се до модели на съдържанието на страницата",
        "protect-expiring-local": "срок на изтичане $1",
        "protect-expiry-indefinite": "безсрочно",
        "protect-cascade": "Каскадна защита — защита на всички страници, включени в настоящата страница.",
-       "protect-cantedit": "Не можете да промените нивото на защита на тази страницата, защото нямате права да я редактирате.",
+       "protect-cantedit": "Не можете да промените нивото на защита на тази страница, защото нямате права да я редактирате.",
        "protect-othertime": "Друг срок:",
        "protect-othertime-op": "друг срок",
        "protect-existing-expiry": "Оставащо време: $2, $3",
        "undeletepagetext": "{{PLURAL:$1|Следната страница беше изтрита, но все още се намира в архива и може да бъде възстановена|Следните $1 страници бяха изтрити, но все още се намират в архива и могат да бъдат възстановени}}. Архивът може да се почиства от време на време.",
        "undelete-fieldset-title": "Възстановяване на версии",
        "undeleteextrahelp": "За възстановяване на пълната история на страницата не се слагат отметки и се натиска '''''{{int:undeletebtn}}'''''.\nЗа частично възстановяване се поставят отметки на тези версии на страницата, които трябва да бъдат възстановени, след което се натиска '''''{{int:undeletebtn}}'''''.",
-       "undeleterevisions": "{{PLURAL:$1|Една версия беше архивирана|$1 версии бяха архивирани}}",
+       "undeleterevisions": "$1 {{PLURAL:$1|версия беше изтрита|версии бяха изтрити}}",
        "undeletehistory": "Ако възстановите страницата, всички версии ще бъдат върнати в историята.\nАко след изтриването е създадена страница със същото име, възстановените версии ще се появят като по-ранна история, а текущата версия на страницата няма да бъде заменена автоматично. Също така обърнете внимание, че ограниченията, приложени върху версиите, ще се загубят след възстановяването.",
        "undeleterevdel": "Възстановяването няма да бъде изпълнено, ако би довело до частично изтриване на актуалната версия. В такъв случай актуалната версия не трябва да бъде избирана или пък състоянието й трябва да бъде променено на нормална (нескрита) версия. Версиите на файлове, които нямате право да преглеждате, няма да бъдат възстановени.",
        "undeletehistorynoadmin": "Тази страница е била изтрита. В резюмето отдолу е посочена причината за това, заедно с информация за потребителите, редактирали страницата преди изтриването й. Конкретното съдържание на изтритите версии е достъпно само за администратори.",
        "undeleteviewlink": "преглеждане",
        "undeleteinvert": "Обръщане на избора",
        "undeletecomment": "Причина:",
-       "undeletedrevisions": "{{PLURAL:$1|Една версия беше възстановена|$1 версии бяха възстановени}}",
-       "undeletedrevisions-files": "{{PLURAL:$1|Една версия|$1 версии}} и {{PLURAL:$1|един файл|$2 файла}} бяха възстановени",
-       "undeletedfiles": "{{PLURAL:$1|Един файл беше възстановен|$1 файла бяха възстановени}}",
        "cannotundelete": "Една или повече операции по възстановяване се провалиха:\n$1",
        "undeletedpage": "'''Страницата „$1“ беше възстановена.'''\n\nМожете да видите последните изтрити и възстановени страници в [[Special:Log/delete|дневника на изтриванията]].",
        "undelete-header": "Прегледайте [[Special:Log/delete|дневника на изтриванията]] за текущо изтритите страници.",
        "undelete-search-prefix": "Показване на страници, започващи със:",
        "undelete-search-submit": "Търсене",
        "undelete-no-results": "Не са намерени страници, отговарящи на търсения критерий.",
-       "undelete-filename-mismatch": "Ð\9dе Ðµ Ð²Ñ\8aзможно Ð²Ñ\8aзÑ\81Ñ\82ановÑ\8fванеÑ\82о Ð½Ð° Ñ\84айловаÑ\82а Ð²ÐµÑ\80Ñ\81иÑ\8f Ñ\81 Ð²Ñ\80емеви Ð¾Ñ\82пеÑ\87аÑ\82Ñ\8aк $1: несъответствие в името на файла",
-       "undelete-bad-store-key": "Ð\9dе Ðµ Ð²Ñ\8aзможно Ð²Ñ\8aзÑ\81Ñ\82ановÑ\8fванеÑ\82о Ð½Ð° Ñ\84айловаÑ\82а Ð²ÐµÑ\80Ñ\81иÑ\8f Ñ\81 Ð²Ñ\80емеви Ð¾Ñ\82пеÑ\87аÑ\82Ñ\8aк $1: файлът е липсвал преди изтриването.",
+       "undelete-filename-mismatch": "Ð\9dе Ðµ Ð²Ñ\8aзможно Ð²Ñ\8aзÑ\81Ñ\82ановÑ\8fванеÑ\82о Ð½Ð° Ñ\84айловаÑ\82а Ð²ÐµÑ\80Ñ\81иÑ\8f Ñ\81 Ð²Ñ\80емева Ð¾Ñ\82меÑ\82ка $1: несъответствие в името на файла",
+       "undelete-bad-store-key": "Ð\9dе Ðµ Ð²Ñ\8aзможно Ð²Ñ\8aзÑ\81Ñ\82ановÑ\8fванеÑ\82о Ð½Ð° Ñ\84айловаÑ\82а Ð²ÐµÑ\80Ñ\81иÑ\8f Ñ\81 Ð²Ñ\80емева Ð¾Ñ\82меÑ\82ка $1: файлът е липсвал преди изтриването.",
        "undelete-cleanup-error": "Грешка при изтриване на неизползвания архивен файл „$1“.",
        "undelete-missing-filearchive": "Не е възможно възстановяването на файла с ID $1, защото не присъства в базата от данни. Вероятно вече е възстановен.",
        "undelete-error": "Грешка при възстановяване на страницата",
        "ipb-confirmhideuser": "На път сте да блокирате потребител, който е \"скрит потребител\". Това действие ще заличи потребителското име от всички списъци и дневници. Наистина ли желаете да направите това?",
        "ipb-edit-dropdown": "Причини за блокиране",
        "ipb-unblock-addr": "Отблокиране на $1",
-       "ipb-unblock": "Отблокиране на потребителско име IP-адрес",
+       "ipb-unblock": "Отблокиране на потребителско име или IP-адрес",
        "ipb-blocklist": "Преглед на текущите блокирания",
        "ipb-blocklist-contribs": "Приноси на {{GENDER:$1|$1}}",
        "ipb-blocklist-duration-left": "{{PLURAL:$1|остава още $1|остават още $1}}",
        "ipblocklist": "Блокирани потребители",
        "ipblocklist-legend": "Търсене на блокиран потребител",
        "blocklist-userblocks": "Скриване на блокирани потребителски сметки",
-       "blocklist-tempblocks": "Скриване на срочни блокирания",
+       "blocklist-tempblocks": "Скриване на временни блокирания",
        "blocklist-addressblocks": "Скриване на отделни блокирани IP адреси",
        "blocklist-rangeblocks": "Скриване на блокиранията по IP диапазон",
        "blocklist-timestamp": "Дата и час",
        "cant-move-to-user-page": "Нямате нужните права на достъп, за да извършвате преместване на страници върху потребителски страници (можете да местите само върху подстраници от потребителското пространство).",
        "cant-move-category-page": "Нямате необходимите права за преместване на страници на категории.",
        "cant-move-to-category-page": "Нямате необходимите права за преместване на страница в страница на категория.",
+       "cant-move-subpages": "Нямате права за преместване на подстраници.",
+       "namespace-nosubpages": "Именно пространство \"$1\" не позволява подстраници.",
        "newtitle": "Ново заглавие:",
        "move-watch": "Наблюдаване на страницата",
        "movepagebtn": "Преместване",
        "move-leave-redirect": "Оставяне на пренасочваща страница от старото към новото заглавие",
        "protectedpagemovewarning": "'''Внимание:''' Тази страница е защитена и само потребители със статут на администратори могат да я преместят.\nЗа справка по-долу е показан последният запис от дневниците.",
        "semiprotectedpagemovewarning": "'''Внимание:''' Тази страница е защитена и само регистрирани потребители могат да я преместят.\nЗа справка по-долу е показан последният запис от дневниците.",
-       "move-over-sharedrepo": "== Файлът вече съществува ==\n[[:$1]] вече съществува в споделеното хранилище. Преместване на файл с това заглавие ще замени споделения файл.",
+       "move-over-sharedrepo": "[[:$1]] вече съществува в споделеното хранилище. Преместване на файл с това заглавие ще замени споделения файл.",
        "file-exists-sharedrepo": "Избраното име на файл вече се използва от файл в сопделеното хранилище.\nНеобходимо е да изберете друго име.",
        "export": "Изнасяне на страници",
        "exporttext": "Тук можете да изнесете като XML текста и историята на една или повече страници. Получените данни можете да вмъкнете в друг сайт, използващ софтуера МедияУики, чрез [[Special:Import|неговата страница за внaсяне]].\n\nЗа да изнесете няколко страници, въвеждайте всяко ново заглавие на '''нов ред'''. След това изберете дали искате само текущата версия (заедно с информация за последната редакция) или всички версии (заедно с текущата) на страницата.\n\nАко желаете само текущата версия, бихте могли да използвате препратка от вида [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] за страницата [[{{MediaWiki:Mainpage}}]].",
        "import-nonewrevisions": "Не са импортирани версии (всички вече съществуват или са пропуснати поради грешки).",
        "xml-error-string": "$1 на ред $2, колона $3 (байт $4): $5",
        "import-upload": "Качване на XML данни",
-       "import-token-mismatch": "Ð\97агÑ\83бени Ñ\81а Ð´Ð°Ð½Ð½Ð¸Ñ\82е Ð·Ð° Ñ\81еÑ\81иÑ\8fÑ\82а. Ð\9eпиÑ\82айÑ\82е Ð¾Ñ\82ново.",
+       "import-token-mismatch": "Ð\97агÑ\83ба Ð½Ð° Ð´Ð°Ð½Ð½Ð¸Ñ\82е Ð·Ð° Ñ\82екÑ\83Ñ\89аÑ\82а Ñ\81еÑ\81иÑ\8f.\n\nÐ\9cоже Ð±Ð¸ Ñ\81Ñ\82е Ð¸Ð·Ð»ÐµÐ·Ð»Ð¸ Ð¾Ñ\82 Ñ\81иÑ\81Ñ\82емаÑ\82а. <strong>Ð\9cолÑ\8f, Ñ\83веÑ\80еÑ\82е Ñ\81е, Ñ\87е Ñ\81Ñ\82е Ð²Ð»ÐµÐ·Ð»Ð¸ Ð² Ð¿Ñ\80оÑ\84ила Ñ\81и Ð¸ Ð¾Ð¿Ð¸Ñ\82айÑ\82е Ð¾Ñ\82ново</strong>.\nÐ\90ко Ð²Ñ\81е Ð¾Ñ\89е Ð½Ðµ Ñ\80абоÑ\82и, Ð¾Ð¿Ð¸Ñ\82айÑ\82е Ð´Ð° [[Special:UserLogout|излезеÑ\82е]] Ð¸ Ð´Ð° Ð²Ð»ÐµÐ·ÐµÑ\82е Ð¾Ñ\82ново, Ñ\81Ñ\8aÑ\89о Ñ\82ака Ð¿Ñ\80овеÑ\80еÑ\82е Ð´Ð°Ð»Ð¸ Ð±Ñ\80аÑ\83зÑ\8aÑ\80Ñ\8aÑ\82 Ð²Ð¸ Ð¿Ð¾Ð·Ð²Ð¾Ð»Ñ\8fва Ð±Ð¸Ñ\81квиÑ\82ки Ð¾Ñ\82 Ñ\82ози Ñ\81айÑ\82.",
        "import-invalid-interwiki": "Не може да бъде извършено внасяне от посоченото уики.",
        "import-error-edit": "Страницата „$1“ не беше импортирана, тъй като нямате права да я редактирате.",
        "import-error-create": "Страницата „$1“ не беше импортирана, тъй като нямате права да я създадете.",
        "pageinfo-length": "Дължина на страницата (в байтове)",
        "pageinfo-article-id": "Номер на страницата",
        "pageinfo-language": "Език на съдържанието на страницата",
+       "pageinfo-language-change": "промяна",
        "pageinfo-content-model": "Модел на съдържанието на страницата",
        "pageinfo-content-model-change": "промяна",
        "pageinfo-robot-policy": "Индексиране от роботи",
        "newimages-summary": "Тази специална страница показва последно качените файлове.",
        "newimages-legend": "Име на файл",
        "newimages-label": "Име на файл (или част от него):",
+       "newimages-user": "IP-адрес или потребителско име",
        "newimages-showbots": "Показване на качвания от ботове",
        "newimages-hidepatrolled": "Скрий проверените качвания",
        "noimages": "Няма нищо.",
        "exif-originalimageheight": "Височина на изображението преди намаляването",
        "exif-originalimagewidth": "Ширина на изображението преди намаляването",
        "exif-compression-1": "Некомпресиран",
-       "exif-copyrighted-true": "Заштитено со авторски права",
-       "exif-copyrighted-false": "Статута на авторските права не е указан",
+       "exif-copyrighted-true": "Заштитено с авторски права",
+       "exif-copyrighted-false": "Статутът на авторските права не е указан",
        "exif-unknowndate": "Неизвестна дата",
        "exif-orientation-1": "Нормално",
        "exif-orientation-2": "Отражение по хоризонталата",
        "version-poweredby-others": "други",
        "version-poweredby-translators": "преводачи в translatewiki.net",
        "version-credits-summary": "Бихме искали да изкажем признателност на следните хора за техните приноси към [[Special:Version|MediaWiki]].",
-       "version-license-info": "MediaWiki е свободен софтуер, можете да го разпространявате и/или променяте съгласно условията на GNU General Public License, както е публикуван от Free Software Foundation, версия 2 на лиценза или (по ваше усмотрение) която и да е следваща версия.\n\nMediaWiki се разпространява с надеждата, че ще бъде полезен, но БЕЗ НИКАКВИ ГАРАНЦИИ, без дори косвена гаранция за ПРОДАВАЕМОСТ или ПРИГОДНОСТ ЗА КОНКРЕТНА УПОТРЕБА. Вижте GNU General Public License за повече подробности.\n\nТрябва да сте получили [{{SERVER}}{{SCRIPTPATH}}/COPYING копие на GNU General Public License] заедно с тази програма. Ако не сте, пишете на Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA или го [//www.gnu.org/licenses/old-licenses/gpl-2.0.html прочетете в мрежата].",
+       "version-license-info": "МедияУики е свободен софтуер, можете да го разпространявате и/или променяте съгласно условията на GNU General Public License, както е публикуван от Free Software Foundation, версия 2 на лиценза или (по ваше усмотрение) която и да е следваща версия.\n\nМедияУики се разпространява с надеждата, че ще бъде полезен, но БЕЗ НИКАКВИ ГАРАНЦИИ, без дори косвена гаранция за ПРОДАВАЕМОСТ или ПРИГОДНОСТ ЗА КОНКРЕТНА УПОТРЕБА. Вижте GNU General Public License за повече подробности.\n\nТрябва да сте получили [{{SERVER}}{{SCRIPTPATH}}/COPYING копие на GNU General Public License] заедно с тази програма. Ако не сте, пишете на Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA или го [//www.gnu.org/licenses/old-licenses/gpl-2.0.html прочетете в мрежата].",
        "version-software": "Инсталиран софтуер",
        "version-software-product": "Продукт",
        "version-software-version": "Версия",
        "version-libraries-license": "Лиценз",
        "version-libraries-description": "Описание",
        "version-libraries-authors": "Автори",
+       "redirect": "Пренасочване по идентификатор на файл, потребител, страница, версия или запис от дневника",
+       "redirect-summary": "Тази специална страница пренасочва към файл (като се има предвид името на файла), към страница (по зададена версия или номер на страницата), към потребителска страница (по зададен потребителски номер), или към запис от дневника (по зададен номер на записа). <br />\nИзползване: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], [[{{#Special:Redirect}}/user/101]], или [[{{#Special:Redirect}}/logid/186]].",
        "redirect-submit": "Отваряне",
+       "redirect-lookup": "Параметър:",
        "redirect-value": "Стойност:",
        "redirect-user": "Потребителски номер",
        "redirect-page": "Номер на страницата",
        "redirect-revision": "Версия на страницата",
        "redirect-file": "Име на файл",
+       "redirect-logid": "Номер на записа",
        "redirect-not-exists": "Стойността не е намерена",
        "fileduplicatesearch": "Търсене на повтарящи се файлове",
        "fileduplicatesearch-summary": "Търсене на повтарящи се файлове на база хеш стойности.",
        "tags-edit-title": "Редактиране на етикетите",
        "tags-edit-manage-link": "Управление на етикетите",
        "tags-edit-revision-selected": "{{PLURAL:$1|Избрана версия|Избрани версии}} от [[:$2]]:",
+       "tags-edit-logentry-selected": "{{PLURAL:$1|Избрано събитие|Избрани събития}}:",
        "tags-edit-revision-legend": "Добавяне или премахване на етикети от {{PLURAL:$1|тази редакция|всичките $1 редакции}}",
        "tags-edit-existing-tags": "Съществуващи етикети:",
        "tags-edit-existing-tags-none": "<em>Няма</em>",
        "htmlform-time-placeholder": "ЧЧ:ММ:СС",
        "htmlform-datetime-placeholder": "ГГГГ-ММ-ДД ЧЧ:ММ:СС",
        "htmlform-date-invalid": "Избраната от вас стойност за дата не е разпозната. Опитайте да използвате формат ГГГГ-ММ-ДД.",
+       "htmlform-datetime-invalid": "Избраната от вас стойност за дата не е разпозната. Опитайте да използвате формат ГГГГ-ММ-ДД ЧЧ:ММ:СС.",
        "htmlform-title-badnamespace": "[[:$1]] не е в именното пространство \"{{ns:$2}}\".",
        "htmlform-title-not-exists": "$1 не съществува.",
        "htmlform-user-not-exists": "<strong>$1</strong> не съществува.",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|промени}} потребителската група на $3",
        "logentry-rights-autopromote": "$1 е автоматично {{GENDER:$2|повишен|повишена}} от $4 до $5",
        "logentry-upload-upload": "$1 {{GENDER:$2|качи}} $3",
+       "logentry-upload-revert": "$1 {{GENDER:$2|качи}} $3",
+       "log-name-managetags": "Дневник на управлението на етикети",
+       "log-description-managetags": "На тази страница са изброени задачи, свързани с управлението на [[Special:Tags|етикети]]. Дневникът съдържа само действия, извършвани ръчно от администратор. Етикети могат да бъдат създавани или изтривани от уики софтуера без това да бъде отразено в този дневник.",
+       "log-name-tag": "Дневник на етикетите",
+       "log-description-tag": "Тази страница показва, кога потребителите са добавили или премахнали [[Special:Tags|етикети]] от отделни версии или записи. Списъкът не включва подобни действия, когато те се появяват, като част от процеса на редактиране, изтриване или подобни действия.",
        "rightsnone": "(никакви)",
        "feedback-adding": "Добавяне на коментар към страницата...",
        "feedback-back": "Обратно",
        "pagelang-select-lang": "Избиране на език",
        "pagelang-reason": "Причина",
        "pagelang-submit": "Изпращане",
+       "pagelang-nonexistent-page": "Страницата $1 не съществува.",
        "right-pagelang": "Промяна езика на страница",
        "action-pagelang": "промяна езика на страницата",
        "log-name-pagelang": "Дневник на езиковите промени",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (включено)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 (<strong>изключено</strong>)",
        "mediastatistics": "Статистика за файлове",
+       "mediastatistics-summary": "Статистика за видовете качени файлове. Тя включва само последните версии на файловете, без старите или изтритите версии.",
+       "mediastatistics-bytespertype": "Пълен размер на файловете за този раздел: {{PLURAL:$1|$1 байт|$1 байта}} ($2; $3%).",
+       "mediastatistics-allbytes": "Общ размер на всички файлове: {{PLURAL:$1|$1 байт|$1 байта}} ($2).",
        "mediastatistics-table-mimetype": "MIME тип",
        "mediastatistics-table-extensions": "Възможни разширения",
        "mediastatistics-table-count": "Брой файлове",
        "mediastatistics-header-audio": "Аудио",
        "mediastatistics-header-video": "Видео",
        "mediastatistics-header-multimedia": "Мултимедия",
+       "mediastatistics-header-office": "Офис",
        "mediastatistics-header-total": "Всички файлове",
        "json-error-syntax": "Синтактична грешка",
        "headline-anchor-title": "Препратка към този раздел",
        "mw-widgets-dateinput-no-date": "Нищо не е избрано",
        "mw-widgets-dateinput-placeholder-day": "ГГГГ-ММ-ДД",
        "mw-widgets-dateinput-placeholder-month": "ГГГГ-ММ",
+       "mw-widgets-mediasearch-input-placeholder": "Търсене на мултимедия",
+       "mw-widgets-mediasearch-noresults": "Не бяха открити резултати.",
        "mw-widgets-titleinput-description-new-page": "страницата все още не съществува",
        "mw-widgets-titleinput-description-redirect": "пренасочване към $1",
+       "mw-widgets-categoryselector-add-category-placeholder": "Добавяне на категория...",
        "randomrootpage": "Случайна основна страница",
        "log-action-filter-block": "Вид на блокирането:",
        "log-action-filter-delete": "Вид на изтриването:",
        "log-action-filter-block-block": "Блокиране",
        "log-action-filter-block-reblock": "Промяна на блокирането",
        "log-action-filter-block-unblock": "Отблокиране",
+       "log-action-filter-contentmodel-change": "Промяна на модела на съдържанието",
        "log-action-filter-delete-delete": "Изтриване на страница",
        "log-action-filter-delete-restore": "Възстановяване на страница",
+       "log-action-filter-managetags-create": "Създаване на етикети",
        "log-action-filter-managetags-delete": "Премахване на етикет",
        "log-action-filter-managetags-activate": "Активиране на етикет",
        "log-action-filter-managetags-deactivate": "Деактивиране на етикет",
+       "log-action-filter-newusers-autocreate": "Автоматично създаване",
+       "log-action-filter-protect-protect": "Защита",
+       "log-action-filter-protect-unprotect": "Сваляне на защитата",
+       "log-action-filter-rights-rights": "Ръчна промяна",
+       "log-action-filter-rights-autopromote": "Автоматична промяна",
        "log-action-filter-upload-upload": "Ново качване",
        "log-action-filter-upload-overwrite": "Повторно качване",
+       "authmanager-create-disabled": "Създаването на сметки е изключено.",
        "authmanager-authplugin-setpass-bad-domain": "Невалиден домейн.",
+       "authmanager-userdoesnotexist": "Няма регистрирана потребителска сметка за „$1“.",
        "authmanager-retype-help": "Парола (повторно) за потвърждение.",
        "authmanager-email-label": "Е-поща",
        "authmanager-email-help": "Електронна поща",
        "authmanager-provider-temporarypassword": "Временна парола",
        "authprovider-resetpass-skip-label": "Пропусни",
        "specialpage-securitylevel-not-allowed-title": "Не е позволено",
-       "cannotauth-not-allowed-title": "Достъпът е отказан"
+       "cannotauth-not-allowed-title": "Достъпът е отказан",
+       "cannotauth-not-allowed": "Не ви е позволено да използвате тази страница",
+       "credentialsform-account": "Име на сметка:",
+       "linkaccounts": "Свързване на сметки",
+       "linkaccounts-success-text": "Сметката беше свързана.",
+       "linkaccounts-submit": "Свързване на сметки",
+       "restrictionsfield-badip": "Невалиден IP-адрес или интервал от адреси: $1",
+       "revid": "версия $1"
 }
index 30c5ca1..5cb321e 100644 (file)
                        "Elias Ahmmad"
                ]
        },
-       "tog-underline": "সà¦\82যà§\8bà¦\97à¦\97à§\81লির নিচে দাগ দেখানো হোক:",
-       "tog-hideminor": "à¦\85নà§\81লà§\8dলà§\87à¦\96à§\8dয à¦¸à¦®à§\8dপাদনাà¦\97à§\81লà§\8b à¦¸à¦¾à¦®à§\8dপà§\8dরতিà¦\95 à¦ªà¦°à¦¿à¦¬à¦°à§\8dতনসমà§\82হà§\87 à¦\86ড়াল à¦\95রà§\8b",
-       "tog-hidepatrolled": "পরীক্ষিত সম্পাদনা গুলো সাম্প্রতিক পরিবর্তনসমূহে আড়াল করো",
-       "tog-newpageshidepatrolled": "পরীক্ষিত পাতা গুলো নতুন পাতার তালিকায় আড়াল করো",
-       "tog-hidecategorization": "পাতার à¦¶à§\8dরà§\87ণà§\80বদà§\8dধà¦\95রণ à¦²à§\81à¦\95ান",
-       "tog-extendwatchlist": "শà§\81ধà§\81 à¦¸à¦¾à¦®à§\8dপà§\8dরতিà¦\95 à¦ªà¦°à¦¿à¦¬à¦°à§\8dতনà¦\87 à¦¨à¦¯à¦¼, à¦¸à¦\95ল à¦ªà¦°à¦¿à¦¬à¦°à§\8dতন à¦¦à§\87à¦\96তà§\87 à¦¨à¦\9cর à¦¤à¦¾à¦²à¦¿à¦\95া à¦¸à¦®à§\8dপà§\8dরসারণ à¦\95রà§\81ন",
-       "tog-usenewrc": "সামà§\8dপà§\8dরতিà¦\95 à¦ªà¦°à¦¿à¦¬à¦°à§\8dতনসমà§\82হ à¦\8fবà¦\82 à¦¨à¦\9cরতালিà¦\95া à¦ªà¦¾à¦¤à¦¾à¦¯à¦¼ à¦ªà¦°à¦¿à¦¬à¦°à§\8dতনà¦\97à§\81লà§\8b à¦\8fà¦\95তà§\8dরà§\87 à¦ªà§\8dরদরà§\8dশন",
-       "tog-numberheadings": "শিরà§\8bনামà¦\97à§\81লà§\8bà¦\95à§\87 à¦¸à§\8dবয়à¦\82à¦\95à§\8dরিয়ভাবà§\87 à¦\95à§\8dরমিà¦\95 à¦¨à¦®à§\8dবর à¦¦à¦¾à¦\93",
-       "tog-showtoolbar": "সমà§\8dপাদনা à¦¸à¦°à¦\9eà§\8dà¦\9cামদণà§\8dড à¦¦à§\87à¦\96াà¦\93",
-       "tog-editondblclick": "দুইবার ক্লিক করে পাতা সম্পাদনা",
-       "tog-editsectiononrightclick": "পরিচ্ছেদের শিরোনামে ডান ক্লিকের মাধ্যমে সম্পাদনা করার ক্ষমতা দেয়া হোক",
-       "tog-watchcreations": "à¦\86মার à¦¤à§\88রি à¦ªà¦¾à¦¤à¦¾ à¦\8fবà¦\82 à¦\86পলà§\8bড à¦\95রা à¦«à¦¾à¦\87লà¦\97à§\81ললà§\8b আমার নজরতালিকায় যোগ করা হোক",
-       "tog-watchdefault": "আমার সম্পাদিত পাতা এবং ফাইলগুলো আমার নজরতালিকায় যোগ করা হোক",
-       "tog-watchmoves": "à¦\86মার à¦¸à§\8dথানানà§\8dতরিত à¦ªà¦¾à¦¤à¦¾ à¦\8fবà¦\82 à¦«à¦¾à¦\87লà¦\97à§\81লà§\8b আমার নজরতালিকায় যোগ করা হোক",
-       "tog-watchdeletion": "à¦\86মার à¦\85পসারিত à¦ªà¦¾à¦¤à¦¾ à¦\8fবà¦\82 à¦«à¦¾à¦\87লà¦\97à§\81লà§\8b আমার নজর তালিকায় যোগ করা হোক",
-       "tog-watchuploads": "à¦\86মার à¦¨à¦\9cরতালিà¦\95ায় à¦\86মার à¦\86পলà§\8bড à¦\95রা à¦¨à¦¤à§\81ন à¦«à¦¾à¦\87ল à¦¯à§\8bà¦\97 à¦\95র",
-       "tog-watchrollback": "আমার দ্বারা রোলব্যাক করা পাতা আমার নজরতালিকায় যোগ করা হোক",
+       "tog-underline": "সà¦\82যà§\8bà¦\97à§\87র নিচে দাগ দেখানো হোক:",
+       "tog-hideminor": "à¦\85নà§\81লà§\8dলà§\87à¦\96à§\8dয à¦¸à¦®à§\8dপাদনাà¦\97à§\81লি à¦¸à¦¾à¦®à§\8dপà§\8dরতিà¦\95 à¦ªà¦°à¦¿à¦¬à¦°à§\8dতন à¦ªà¦¾à¦¤à¦¾à¦¯à¦¼ à¦²à§\81à¦\95িয়à§\87 à¦°à¦¾à¦\96া à¦¹à§\8bà¦\95",
+       "tog-hidepatrolled": "পরীক্ষিত সম্পাদনাগুলি সাম্প্রতিক পরিবর্তন পাতায় লুকিয়ে রাখা হোক",
+       "tog-newpageshidepatrolled": "পরীক্ষিত পাতাগুলিকে নতুন পাতার তালিকায় লুকিয়ে রাখা হোক",
+       "tog-hidecategorization": "পাতাà¦\97à§\81লির à¦¶à§\8dরà§\87ণà§\80à¦\95রণ à¦²à§\81à¦\95িয়à§\87 à¦°à¦¾à¦\96া à¦¹à§\8bà¦\95",
+       "tog-extendwatchlist": "শà§\81ধà§\81 à¦¸à¦¾à¦®à§\8dপà§\8dরতিà¦\95 à¦ªà¦°à¦¿à¦¬à¦°à§\8dতনà¦\87 à¦¨à¦¯à¦¼, à¦¸à¦\95ল à¦ªà¦°à¦¿à¦¬à¦°à§\8dতন à¦¦à§\87à¦\96তà§\87 à¦¨à¦\9cর à¦¤à¦¾à¦²à¦¿à¦\95া à¦¸à¦®à§\8dপà§\8dরসারণ à¦\95রা à¦¹à§\8bà¦\95",
+       "tog-usenewrc": "সামà§\8dপà§\8dরতিà¦\95 à¦ªà¦°à¦¿à¦¬à¦°à§\8dতনসমà§\82হ à¦\8fবà¦\82 à¦¨à¦\9cরতালিà¦\95া à¦ªà¦¾à¦¤à¦¾à¦¯à¦¼ à¦ªà¦°à¦¿à¦¬à¦°à§\8dতনà¦\97à§\81লি à¦\8fà¦\95তà§\8dরà§\87 à¦ªà§\8dরদরà§\8dশন à¦\95রা à¦¹à§\8bà¦\95",
+       "tog-numberheadings": "শিরà§\8bনামà¦\97à§\81লিà¦\95à§\87 à¦¸à§\8dবয়à¦\82à¦\95à§\8dরিয়ভাবà§\87 à¦\95à§\8dরমিà¦\95 à¦¨à¦®à§\8dবর à¦¦à§\87য়া à¦¹à§\8bà¦\95",
+       "tog-showtoolbar": "সমà§\8dপাদনা à¦¸à¦°à¦\9eà§\8dà¦\9cামদণà§\8dড à¦¦à§\87à¦\96ানà§\8b à¦¹à§\8bà¦\95",
+       "tog-editondblclick": "দুইবার ক্লিক করে পাতা সম্পাদনা করা হোক",
+       "tog-editsectiononrightclick": "পরিচ্ছেদের শিরোনামে ডান ক্লিক করার মাধ্যমে পরিচ্ছেদ সম্পাদনা করার সুবিধাটি সক্রিয় করা হোক",
+       "tog-watchcreations": "à¦\86মার à¦¤à§\88রি à¦\95রা à¦ªà¦¾à¦¤à¦¾à¦\97à§\81লি à¦\8fবà¦\82 à¦\86পলà§\8bড à¦\95রা à¦«à¦¾à¦\87লà¦\97à§\81লি আমার নজরতালিকায় যোগ করা হোক",
+       "tog-watchdefault": "আমার সম্পাদিত পাতাগুলি এবং ফাইলগুলি আমার নজরতালিকায় যোগ করা হোক",
+       "tog-watchmoves": "à¦\86মার à¦¦à§\8dবারা à¦¸à§\8dথানানà§\8dতরিত à¦ªà¦¾à¦¤à¦¾à¦\97à§\81লি à¦\8fবà¦\82 à¦«à¦¾à¦\87লà¦\97à§\81লি আমার নজরতালিকায় যোগ করা হোক",
+       "tog-watchdeletion": "à¦\86মার à¦¦à§\8dবারা à¦\85পসারিত à¦ªà¦¾à¦¤à¦¾à¦\97à§\81লি à¦\8fবà¦\82 à¦«à¦¾à¦\87লà¦\97à§\81লি আমার নজর তালিকায় যোগ করা হোক",
+       "tog-watchuploads": "à¦\86মার à¦\86পলà§\8bড à¦\95রা à¦¨à¦¤à§\81ন à¦«à¦¾à¦\87লà¦\97à§\81লি à¦\86মার à¦¨à¦\9cরতালিà¦\95ায় à¦¯à§\8bà¦\97 à¦\95রা à¦¹à§\8bà¦\95",
+       "tog-watchrollback": "আমার দ্বারা রোলব্যাক করা পাতাগুলি আমার নজরতালিকায় যোগ করা হোক",
        "tog-minordefault": "শুরুতেই সব সম্পাদনাকে অনুল্লেখ্য বলে চিহ্নিত করা হোক",
        "tog-previewontop": "সম্পাদনা বাক্সের আগে প্রাকদর্শন দেখানো হোক",
        "tog-previewonfirst": "প্রথম সম্পাদনার ক্ষেত্রে প্রাকদর্শন দেখানো হোক",
-       "tog-enotifwatchlistpages": "আমার নজর তালিকায় আছে এমন পাতা অথবা ফাইলে পরিবর্তন হলে আমাকে ই-মেইল করো",
+       "tog-enotifwatchlistpages": "আমার নজরতালিকায় আছে এমন কোন পাতা অথবা ফাইলে পরিবর্তন হলে আমাকে ই-মেইল করা হোক",
        "tog-enotifusertalkpages": "আমার ব্যবহারকারী আলোচনা পাতার পরিবর্তন হলে আমাকে ই-মেইল করা হোক",
-       "tog-enotifminoredits": "পাতা à¦\8fবà¦\82 à¦«à¦¾à¦\87লà¦\97à§\81লà§\8bতে অনুল্লেখ্য সম্পাদনার জন্যও আমাকে ই-মেইল করা হোক",
-       "tog-enotifrevealaddr": "বিজ্ঞপ্তি মেইলে আমার ই-মেইল ঠিকানা প্রকাশ করা হোক",
-       "tog-shownumberswatching": "নজরদারী করছে, এমন ব্যবহারকারীর সংখ্যা দেখানো হোক",
+       "tog-enotifminoredits": "পাতা à¦\8fবà¦\82 à¦«à¦¾à¦\87লà¦\97à§\81লিতে অনুল্লেখ্য সম্পাদনার জন্যও আমাকে ই-মেইল করা হোক",
+       "tog-enotifrevealaddr": "বিজ্ঞপ্তির ই-মেইলগুলিতে আমার ই-মেইল ঠিকানা প্রকাশ করা হোক",
+       "tog-shownumberswatching": "নজরদারী করছে এমন ব্যবহারকারীর সংখ্যা দেখানো হোক",
        "tog-oldsig": "আপনার বর্তমান স্বাক্ষর:",
-       "tog-fancysig": "সà§\8dবাà¦\95à§\8dষরà¦\95à§\87 à¦\89à¦\87à¦\95িà¦\9fà§\87à¦\95à§\8dসà¦\9f à¦¹à¦¿à¦¸à§\87বà§\87 à¦®à¦¨à§\87 à¦\95রà§\81ন (à¦\95à§\8bন à¦¸à¦¯à¦¼à¦\82à¦\95à§\8dরিয় à¦²à¦¿à¦\99à§\8dà¦\95 ছাড়া)",
-       "tog-uselivepreview": "তাà§\8eà¦\95à§\8dষণিà¦\95 à¦ªà§\8dরাà¦\95দরà§\8dশন à¦¬à§\8dযবহার à¦\95রà§\8b",
+       "tog-fancysig": "সà§\8dবাà¦\95à§\8dষরà¦\95à§\87 à¦\89à¦\87à¦\95িà¦\9fà§\87à¦\95à§\8dসà¦\9f à¦¹à¦¿à¦¸à§\87বà§\87 à¦®à¦¨à§\87 à¦\95রা à¦¹à§\8bà¦\95 (à¦\95à§\8bন à¦¸à§\8dবয়à¦\82à¦\95à§\8dরিয় à¦¸à¦\82যà§\8bà¦\97 ছাড়া)",
+       "tog-uselivepreview": "তাà§\8eà¦\95à§\8dষণিà¦\95 à¦ªà§\8dরাà¦\95দরà§\8dশন à¦¬à§\8dযবহার à¦\95রা à¦¹à§\8bà¦\95",
        "tog-forceeditsummary": "খালি সম্পাদনা সারাংশ প্রবেশ করানোর সময় আমাকে জানানো হোক",
-       "tog-watchlisthideown": "à¦\86মার à¦¸à¦®à§\8dপাদনাà¦\97à§\81লি à¦\86মার à¦¨à¦\9cরতালিà¦\95ায় à¦¨à¦¾ à¦¦à§\87à¦\96ানà§\8b হোক",
-       "tog-watchlisthidebots": "বà¦\9fà§\87র à¦\95রা à¦¸à¦®à§\8dপাদনাà¦\97à§\81লি à¦¨à¦\9cরতালিà¦\95ায় à¦¨à¦¾ à¦¦à§\87à¦\96ানà§\8b হোক",
-       "tog-watchlisthideminor": "অনুল্লেখ্য সম্পাদনাগুলো নজর তালিকায় না দেখানো হোক",
-       "tog-watchlisthideliu": "নà¦\9cরতালিà¦\95াতà§\87 à¦\85à§\8dযাà¦\95াà¦\89নà§\8dà¦\9fà§\87 à¦²à¦\97-à¦\87ন à¦\95রা à¦¬à§\8dযবহারà¦\95ারà§\80দà§\87র à¦¸à¦®à§\8dপাদনা à¦\86ড়ালে রাখা হোক",
-       "tog-watchlistreloadautomatically": "পà§\8dরতিবার à¦\8fà¦\95à¦\9fি à¦\9bাà¦\81à¦\95নি à¦ªà¦°à¦¿à¦¬à¦°à§\8dতন à¦¹à¦\93য়া à¦®à¦¾à¦¤à§\8dরà¦\87 à¦¸à§\8dবয়à¦\82à¦\95à§\8dরিয়ভাবà§\87 à¦¨à¦\9cরতালিà¦\95ায় à¦ªà§\81নà¦\83লà§\8bড à¦\95রà§\8b (জাভাস্ক্রিপ্ট প্রয়োজন)",
-       "tog-watchlisthideanons": "নà¦\9cরতালিà¦\95াতà§\87 à¦¬à§\87নামà§\80 à¦¬à§\8dযবহারà¦\95ারà§\80দà§\87র à¦¸à¦®à§\8dপাদনা আড়ালে রাখা হোক",
-       "tog-watchlisthidepatrolled": "পরীক্ষিত সম্পাদনা গুলো নজরতালিকায় আড়াল করো",
-       "tog-watchlisthidecategorization": "পাতার à¦¶à§\8dরà§\87ণà§\80বদà§\8dধà¦\95রণ à¦²à§\81à¦\95ান",
-       "tog-ccmeonemails": "à¦\85নà§\8dয à¦¬à§\8dযবহারà¦\95ারà§\80র à¦\95াà¦\9bà§\87 à¦\86মার à¦ªà¦¾à¦ à¦¾à¦¨à§\8b à¦\87মà§\87à¦\87লà§\87র à¦\8fà¦\95à¦\9fি à¦\85নà§\81লিপি আমাকে পাঠানো হোক",
+       "tog-watchlisthideown": "à¦\86মার à¦¸à¦®à§\8dপাদনাà¦\97à§\81লি à¦\86মার à¦¨à¦\9cরতালিà¦\95ায় à¦²à§\81à¦\95িয়à§\87 à¦°à¦¾à¦\96া হোক",
+       "tog-watchlisthidebots": "বà¦\9fà§\87র à¦\95রা à¦¸à¦®à§\8dপাদনাà¦\97à§\81লি à¦¨à¦\9cরতালিà¦\95ায় à¦²à§\81à¦\95িয়à§\87 à¦°à¦¾à¦\96া হোক",
+       "tog-watchlisthideminor": "অনুল্লেখ্য সম্পাদনাগুলো নজরতালিকায় লুকিয়ে রাখা হোক",
+       "tog-watchlisthideliu": "à¦\85à§\8dযাà¦\95াà¦\89নà§\8dà¦\9fà§\87 à¦ªà§\8dরবà§\87শà¦\95à§\83ত à¦¬à§\8dযবহারà¦\95ারà§\80দà§\87র à¦¸à¦®à§\8dপাদনাà¦\97à§\81লি à¦¨à¦\9cরতালিà¦\95ায় à¦²à§\81à¦\95িয়ে রাখা হোক",
+       "tog-watchlistreloadautomatically": "পà§\8dরতিবার à¦\8fà¦\95à¦\9fি à¦\9bাà¦\81à¦\95নি à¦ªà¦°à¦¿à¦¬à¦°à§\8dতন à¦¹à¦\93য়া à¦®à¦¾à¦¤à§\8dরà¦\87 à¦¸à§\8dবয়à¦\82à¦\95à§\8dরিয়ভাবà§\87 à¦¨à¦\9cরতালিà¦\95াà¦\9fি à¦ªà§\81নà¦\83লà§\8bড à¦\95রা à¦¹à§\8bà¦\95 (জাভাস্ক্রিপ্ট প্রয়োজন)",
+       "tog-watchlisthideanons": "বà§\87নামà§\80 à¦¬à§\8dযবহারà¦\95ারà§\80দà§\87র à¦¸à¦®à§\8dপাদনাà¦\97à§\81লি à¦¨à¦\9cরতালিà¦\95ায় আড়ালে রাখা হোক",
+       "tog-watchlisthidepatrolled": "পরীক্ষিত সম্পাদনাগুলি নজরতালিকায় লুকিয়ে রাখা হোক",
+       "tog-watchlisthidecategorization": "পাতার à¦¶à§\8dরà§\87ণà§\80বদà§\8dধà¦\95রণ à¦²à§\81à¦\95িয়à§\87 à¦°à¦¾à¦\96া à¦¹à§\8bà¦\95",
+       "tog-ccmeonemails": "à¦\85নà§\8dয à¦¬à§\8dযবহারà¦\95ারà§\80র à¦\95াà¦\9bà§\87 à¦\86মার à¦ªà¦¾à¦ à¦¾à¦¨à§\8b à¦\87মà§\87à¦\87লà§\87র à¦\8fà¦\95à¦\9fি à¦ªà§\8dরতিলিপি আমাকে পাঠানো হোক",
        "tog-diffonly": "পার্থক্যের নিচে পাতার বিষয়বস্তু না দেখানো হোক",
-       "tog-showhiddencats": "লà§\81à¦\95ায়িত à¦¬à¦¿à¦·à¦¯à¦¼à¦¶à§\8dরà§\87ণà§\80সমà§\82হ à¦¦à§\87à¦\96াà¦\93",
-       "tog-norollbackdiff": "রà§\8bলবà§\8dযাà¦\95à§\87র à¦ªà¦°à§\87 à¦ªà¦¾à¦°à§\8dথà¦\95à§\8dয à¦¦à§\87à¦\96িà¦\93 à¦¨à¦¾",
-       "tog-useeditwarning": "à¦\85সà¦\82রà¦\95à§\8dষিত à¦ªà¦°à¦¿à¦¬à¦°à§\8dতনসহ à¦\95à§\8bনà§\8b à¦ªà¦¾à¦¤à¦¾ à¦¤à§\8dযাà¦\97à§\87র à¦¸à¦®à¦¯à¦¼ à¦¸à¦¾à¦¬à¦§à¦¾à¦¨ à¦\95রà§\8b",
-       "tog-prefershttps": "প্রবেশ করার সময় সবসময় নিরাপদ সংযোগ ব্যবহার করুন",
+       "tog-showhiddencats": "লà§\81à¦\95ায়িত à¦¬à¦¿à¦·à¦¯à¦¼à¦¶à§\8dরà§\87ণà§\80সমà§\82হ à¦¦à§\87à¦\96ানà§\8b à¦¹à§\8bà¦\95",
+       "tog-norollbackdiff": "রà§\8bলবà§\8dযাà¦\95à§\87র à¦ªà¦°à§\87 à¦¸à¦\82সà§\8dà¦\95রণà¦\97à§\81লির à¦ªà¦¾à¦°à§\8dথà¦\95à§\8dয à¦¨à¦¾ à¦¦à§\87à¦\96ানà§\8b à¦¹à§\8bà¦\95",
+       "tog-useeditwarning": "à¦\95à§\8bনà§\8b à¦¸à¦®à§\8dপাদনা à¦ªà¦¾à¦¤à¦¾ à¦¤à§\8dযাà¦\97à§\87র à¦¸à¦®à¦¯à¦¼ à¦ªà¦°à¦¿à¦¬à¦°à§\8dতনà¦\97à§\81লি à¦¸à¦\82রà¦\95à§\8dষিত à¦¨à¦¾ à¦¹à¦¯à¦¼à§\87 à¦¥à¦¾à¦\95লà§\87 à¦\86মাà¦\95à§\87 à¦¸à¦¾à¦¬à¦§à¦¾à¦¨ à¦\95রা à¦¹à§\8bà¦\95",
+       "tog-prefershttps": "à¦\85à§\8dযাà¦\95াà¦\89নà§\8dà¦\9fà§\87 à¦ªà§\8dরবà§\87শ à¦\95রার à¦¸à¦®à¦¯à¦¼ à¦¸à¦¬à¦¸à¦®à¦¯à¦¼ à¦¨à¦¿à¦°à¦¾à¦ªà¦¦ à¦¸à¦\82যà§\8bà¦\97 à¦¬à§\8dযবহার à¦\95রà§\81ন",
        "underline-always": "সব সময়",
        "underline-never": "কখনো নয়",
        "underline-default": "স্কিন অথবা ব্রাউজারে যেমনভাবে নির্দিষ্ট করা আছে",
-       "editfont-style": "সমà§\8dপাদনা à¦\8fলাà¦\95ার à¦«à¦¨à§\8dà¦\9f à¦¸à§\8dà¦\9fাà¦\87ল:",
-       "editfont-default": "ব্রাউজার পূর্বনির্ধারিত",
+       "editfont-style": "সমà§\8dপাদনা à¦\8fলাà¦\95ার à¦«à¦¨à§\8dà¦\9f à¦¶à§\88লà§\80:",
+       "editfont-default": "বà§\8dরাà¦\89à¦\9cার à¦¦à§\8dবারা à¦ªà§\82রà§\8dবনিরà§\8dধারিত",
        "editfont-monospace": "মনোস্পেস ফন্ট",
        "editfont-sansserif": "স্যান্স-সেরিফ ফন্ট",
        "editfont-serif": "সেরিফ ফন্ট",
        "oct": "অক্টো",
        "nov": "নভে",
        "dec": "ডিসে",
-       "january-date": "জানুয়ারি $1",
-       "february-date": "ফেব্রুয়ারি $1",
-       "march-date": "মার্চ $1",
-       "april-date": "এপ্রিল $1",
-       "may-date": "মে $1",
-       "june-date": "জুন $1",
-       "july-date": "জুলাই $1",
-       "august-date": "আগস্ট $1",
-       "september-date": "সেপ্টেম্বর $1",
-       "october-date": "অক্টোবর $1",
-       "november-date": "নভেম্বর $1",
-       "december-date": "ডিসেম্বর $1",
+       "january-date": "$1 জানুয়ারি",
+       "february-date": "$1 ফেব্রুয়ারি",
+       "march-date": "$1 মার্চ",
+       "april-date": "$1 এপ্রিল",
+       "may-date": "$1 মে",
+       "june-date": "$1 জুন",
+       "july-date": "$1 জুলাই",
+       "august-date": "$1 আগস্ট",
+       "september-date": "$1 সেপ্টেম্বর",
+       "october-date": "$1 অক্টোবর",
+       "november-date": "$1 নভেম্বর",
+       "december-date": "$1 ডিসেম্বর",
        "period-am": "পূর্বাহ্ণ",
        "period-pm": "অপরাহ্ণ",
        "pagecategories": "{{PLURAL:$1|বিষয়শ্রেণী|বিষয়শ্রেণীসমূহ}}",
        "category_header": "\"$1\" বিষয়শ্রেণীতে অন্তর্ভুক্ত পাতাগুলি",
        "subcategories": "উপবিষয়শ্রেণীসমূহ",
        "category-media-header": "\"$1\" বিষয়শ্রেণীতে অন্তর্ভুক্ত মিডিয়া ফাইলগুলি",
-       "category-empty": "''এই বিষয়শ্রণীতে বর্তমানে কোন পাতা বা মিডিয়া ফাইল নেই।''",
-       "hidden-categories": "{{PLURAL:$1|লুকায়িত বিষয়শ্রেণী|লুকায়িত বিষয়শ্রেণীসমূহ}}",
+       "category-empty": "<em>এই বিষয়শ্রণীতে বর্তমানে কোন পাতা বা মিডিয়া ফাইল নেই।</em>",
+       "hidden-categories": "{{PLURAL:$1|লুকায়িত বিষয়শ্রেণী}}",
        "hidden-category-category": "লুকায়িত বিষয়শ্রেণীসমূহ",
-       "category-subcat-count": "{{PLURAL:$2|এই বিষয়শ্রেণীতে কেবলমাত্র নিচের উপবিষয়শ্রেণীটি আছে।|এই বিষয়শ্রেণীতে অন্তর্ভুক্ত মোট $2টি উপবিষয়শ্রেণীর মধ্যে {{PLURAL:$1|টি উপবিষয়শ্রেণী|$1টি উপবিষয়শ্রেণী}} নিচে দেখানো হয়েছে।}}",
-       "category-subcat-count-limited": "à¦\8fà¦\87 à¦¬à¦¿à¦·à¦¯à¦¼à¦¶à§\8dরà§\87ণà§\80তà§\87 à¦¨à¦¿à¦\9aà§\87র {{PLURAL:$1|à¦\9fি à¦\89পবিষয়শà§\8dরà§\87ণà§\80|$1à¦\9fি à¦\89পবিষয়শà§\8dরà§\87ণà§\80 à¦\86à¦\9bà§\87}}।",
-       "category-article-count": "{{PLURAL:$2|এই বিষয়শ্রেণীতে কেবল নিচের পাতাটি আছে।|এই বিষয়শ্রেণীতে অন্তর্ভুক্ত মোট $2টি পাতার মধ্যে {{PLURAL:$1|টি পাতা|$1টি পাতা}} নিচে দেখানো হল।}}",
-       "category-article-count-limited": "à¦\8fà¦\87 {{PLURAL:$1|পাতাà¦\9fি|$1 à¦ªà¦¾à¦¤à¦¾à¦\97à§\81লà§\8b}} à¦\8f বিষয়শ্রেণীতে রয়েছে।",
-       "category-file-count": "{{PLURAL:$2|এই বিষয়শ্রেণীতে কেবল নিচের পাতাটি আছে।|এই বিষয়শ্রেণীতে অন্তর্ভুক্ত মোট $2টি পাতার মধ্যে {{PLURAL:$1|টি পাতা|$1টি পাতা}} নিচে দেখানো হলো।}}",
+       "category-subcat-count": "{{PLURAL:$2|এই বিষয়শ্রেণীতে কেবলমাত্র নিচের উপবিষয়শ্রেণীটি আছে।|এই বিষয়শ্রেণীতে অন্তর্ভুক্ত মোট $2টি উপবিষয়শ্রেণীর মধ্যে {{PLURAL:$1|$1টি উপবিষয়শ্রেণী}} নিচে দেখানো হয়েছে।}}",
+       "category-subcat-count-limited": "à¦\8fà¦\87 à¦¬à¦¿à¦·à¦¯à¦¼à¦¶à§\8dরà§\87ণà§\80তà§\87 à¦¨à¦¿à¦\9aà§\87র {{PLURAL:$1|à¦\89পবিষয়শà§\8dরà§\87ণà§\80|$1à¦\9fি à¦\89পবিষয়শà§\8dরà§\87ণà§\80}} à¦\86à¦\9bà§\87।",
+       "category-article-count": "{{PLURAL:$2|এই বিষয়শ্রেণীতে কেবল নিচের পাতাটি আছে।|এই বিষয়শ্রেণীতে অন্তর্ভুক্ত মোট $2টি পাতার মধ্যে {{PLURAL:$1|$1টি পাতা}} নিচে দেখানো হল।}}",
+       "category-article-count-limited": "নিà¦\9aà§\87র {{PLURAL:$1|পাতাà¦\9fি|$1 à¦ªà¦¾à¦¤à¦¾à¦\97à§\81লà§\8b}} à¦\8fà¦\87 বিষয়শ্রেণীতে রয়েছে।",
+       "category-file-count": "{{PLURAL:$2|এই বিষয়শ্রেণীতে কেবল নিচের পাতাটি আছে।|এই বিষয়শ্রেণীতে অন্তর্ভুক্ত মোট $2টি পাতার মধ্যে {{PLURAL:$1|$1টি পাতা}} নিচে দেখানো হলো।}}",
        "category-file-count-limited": "নিচের {{PLURAL:$1|ফাইলটি|$1 ফাইলগুলো}} এই বিষয়শ্রেণীতে রয়েছে।",
        "listingcontinuesabbrev": "আরও আছে",
        "index-category": "নির্ঘণ্ট পাতা",
        "noindex-category": "নির্ঘণ্ট নয় এমন পাতা",
-       "broken-file-category": "à¦\85à¦\95ারà§\8dযà¦\95র à¦\9aিতà§\8dর সংযোগসহ পাতাসমূহ",
+       "broken-file-category": "à¦\85à¦\95ারà§\8dযà¦\95র à¦«à¦¾à¦\87ল সংযোগসহ পাতাসমূহ",
        "about": "পরিচিতি",
        "article": "বিষয়বস্তুর পাতা",
        "newwindow": "(নতুন উইন্ডোতে খুলবে)",
        "qbbrowse": "ব্রাউজ",
        "qbedit": "সম্পাদনা",
        "qbpageoptions": "এই পাতা",
-       "qbmyoptions": "à¦\86মার à¦ªà¦¾à¦¤à¦¾à¦¸à¦®à§\82হ",
+       "qbmyoptions": "à¦\86মার à¦ªà¦¾à¦¤à¦¾à¦\97à§\81লি",
        "faq": "প্রাজিপ্র",
        "faqpage": "Project:প্রাজিপ্র",
        "actions": "কার্যক্রম",
        "namespaces": "নামস্থান",
        "variants": "বিকল্পসমূহ",
-       "navigation-heading": "পরিভà§\8dরমণ à¦®à§\87নà§\81",
+       "navigation-heading": "পরিভà§\8dরমণ à¦¬à¦¾à¦\9bাà¦\87তালিà¦\95া",
        "errorpagetitle": "ত্রুটি",
        "returnto": "$1 পাতায় ফেরত যান।",
        "tagline": "{{SITENAME}} থেকে",
        "help": "সাহায্য",
        "search": "অনুসন্ধান",
+       "search-ignored-headings": " #<!-- এই লাইনটিকে ঠিক যেমন আছে তেমনটি রেখে দিন --> <pre>\n# যেসব শিরোনাম অনুসন্ধানে অগ্রাহ্য করা হবে।\n# যখনই শিরোনামযুক্ত পাতাটি সূচীভুক্ত হবে, তখনই এখানকার কোন পরিবর্তন বাস্তবায়িত হবে।\n# আপনি একটি নাল/শূন্য সম্পাদনা করে পাতাটিকে বলপূর্বক পুনঃসূচীভুক্ত করতে পারেন।\n# সিনট্যাক্স বা পদক্রম/পদবিন্যাসের নিয়মগুলি নিম্নরূপ:\n#   * অক্ষর থেকে শুরু করে লাইনের শেষ পর্যন্ত সবকিছু হচ্ছে একটি মন্তব্য বা কমেন্ট।\n#   * প্রতিটি অশূন্য লাইন হচ্ছে যে শিরোনামটি অগ্রাহ্য করা হবে, বড় হাতের লেখা এবং অন্যান্য সবকিছু গণনায় ধরে।\nতথ্যসূত্র\nবহিঃসংযোগ\nআরও দেখুন\n#</pre> <!-- এই লাইনটিকে ঠিক যেমন আছে তেমনটি রেখে দিন -->",
        "searchbutton": "অনুসন্ধান",
        "go": "চলো",
        "searcharticle": "চলো",
        "printableversion": "ছাপার যোগ্য সংস্করণ",
        "permalink": "স্থায়ী সংযোগ",
        "print": "মুদ্রণ",
-       "view": "দà§\87à¦\96াà¦\93",
+       "view": "দà§\87à¦\96à§\81ন",
        "view-foreign": "$1-এ দেখুন",
        "edit": "সম্পাদনা",
        "edit-local": "স্থানীয় বিবরণ সম্পাদনা করুন",
-       "create": "তৈরি",
+       "create": "তৈরি করুন",
        "create-local": "স্থানীয় বিবরণ যোগ করুন",
        "editthispage": "এই পাতাটি সম্পাদনা করুন",
-       "create-this-page": "পাতাà¦\9fি à¦¤à§\88রি à¦\95রà§\8b",
+       "create-this-page": "à¦\8fà¦\87 à¦ªà¦¾à¦¤à¦¾à¦\9fি à¦¤à§\88রি à¦\95রà§\81ন",
        "delete": "অপসারণ",
-       "deletethispage": "à¦\8fà¦\87 à¦ªà¦¾à¦¤à¦¾à¦\9fি à¦®à§\81à¦\9bà§\87 à¦«à§\87লুন",
-       "undeletethispage": "পাতাà¦\9fি à¦ªà§\81নরà§\81দà§\8dধার à¦\95রà§\8b",
+       "deletethispage": "à¦\8fà¦\87 à¦ªà¦¾à¦¤à¦¾à¦\9fি à¦\85পসারণ à¦\95রুন",
+       "undeletethispage": "পাতাà¦\9fি à¦ªà§\81নরà§\81দà§\8dধার à¦\95রà§\81ন",
        "undelete_short": "{{PLURAL:$1|১টি সম্পাদনা|$1টি সম্পাদনা}} পুনঃস্থাপন করুন",
-       "viewdeleted_short": "{{PLURAL:$1|à¦\8fà¦\95à¦\9fি à¦\85পসারিত à¦¸à¦®à§\8dপাদনা|$1à¦\9fি à¦\85পসারিত à¦¸à¦®à§\8dপাদনা}} à¦¦à§\87à¦\96াà¦\93",
+       "viewdeleted_short": "{{PLURAL:$1|à¦\8fà¦\95à¦\9fি à¦\85পসারিত à¦¸à¦®à§\8dপাদনা|$1à¦\9fি à¦\85পসারিত à¦¸à¦®à§\8dপাদনা}} à¦¦à§\87à¦\96à§\81ন",
        "protect": "সুরক্ষা",
        "protect_change": "পরিবর্তন করুন",
-       "protectthispage": "à¦\8fà¦\87 à¦ªà¦¾à¦¤à¦¾à¦\95à§\87 à¦¸à§\81রà¦\95à§\8dষিত à¦\95রà§\8b",
+       "protectthispage": "à¦\8fà¦\87 à¦ªà¦¾à¦¤à¦¾à¦\9fি à¦¸à§\81রà¦\95à§\8dষিত à¦\95রà§\81ন",
        "unprotect": "সুরক্ষা পরিবর্তন",
        "unprotectthispage": "এই পাতার সুরক্ষা পরিবর্তন করুন",
        "newpage": "নতুন পাতা",
        "tool-link-userrights": "{{GENDER:$1|ব্যবহারকারী}} দল পরিবর্তন করুন",
        "tool-link-userrights-readonly": "{{GENDER:$1|ব্যবহারকারী}} দল দেখুন",
        "tool-link-emailuser": "এই {{GENDER:$1|ব্যবহারকারী}}কে ইমেইল পাঠান",
-       "userpage": "বà§\8dযাবহারà¦\95ারà§\80র à¦ªà¦¾à¦¤à¦¾ à¦¦à§\87à¦\96à§\81ন",
-       "projectpage": "মà§\87à¦\9fা-পাতা দেখুন",
+       "userpage": "ব্যবহারকারীর পাতা দেখুন",
+       "projectpage": "পà§\8dরà¦\95লà§\8dপ à¦ªà¦¾à¦¤à¦¾à¦\9fি দেখুন",
        "imagepage": "ফাইল পাতা দেখুন",
        "mediawikipage": "বার্তার পাতা দেখুন",
        "templatepage": "টেমপ্লেট পাতা দেখুন",
        "redirectpagesub": "পুনর্নির্দেশ পাতা",
        "redirectto": "পুননির্দেশিত হয়েছে:",
        "lastmodifiedat": "এ পাতায় শেষ পরিবর্তন হয়েছিল $2টার সময়, $1 তারিখে।",
-       "viewcount": "এ পাতাটি {{PLURAL:$1|বার|$1 বার}} দেখা হয়েছে।",
+       "viewcount": "এই পাতাটি {{PLURAL:$1|একবার|$1 বার}} দেখা হয়েছে।",
        "protectedpage": "সুরক্ষিত পাতা",
-       "jumpto": "à¦\9dাà¦\81প à¦¦াও:",
+       "jumpto": "সরাসরি à¦¯াও:",
        "jumptonavigation": "পরিভ্রমণ",
        "jumptosearch": "অনুসন্ধান",
        "view-pool-error": "দুঃখিত, সার্ভারে এ মূহুর্তে অতিরিক্ত চাপ রয়েছে।\nঅনেক বেশি সংখ্যক ব্যবহারকারী এই পাতাটি দেখার চেষ্টা করছেন।\nনতুন করে এ পাতাটি দেখার চেষ্টা করার আগে কিছুক্ষণ অপেক্ষা করুন।\n\n$1",
        "generic-pool-error": "দুঃখিত, সার্ভারে এ মূহুর্তে অতিরিক্ত চাপ রয়েছে।\nঅনেক বেশি সংখ্যক ব্যবহারকারী এই পাতাটি দেখার চেষ্টা করছেন।\nনতুন করে এ পাতাটি দেখার চেষ্টা করার আগে কিছুক্ষণ অপেক্ষা করুন।",
-       "pool-timeout": "সময় à¦\89তà§\8dতিরà§\8dণ à¦²à¦\95-à¦\8fর à¦\9cনà§\8dয à¦\85পà§\87à¦\95à§\8dষারত",
+       "pool-timeout": "à¦\85বরà§\8bধà§\87র à¦\9cনà§\8dয à¦\85পà§\87à¦\95à§\8dষা à¦\95রতà§\87 à¦\97িয়à§\87 à¦¸à¦®à¦¯à¦¼ à¦\89তà§\8dতà§\80রà§\8dণ",
        "pool-queuefull": "পুলের লাইন পূর্ণ",
        "pool-errorunknown": "অজানা ত্রুটি",
        "pool-servererror": "পুল কাউন্টার সার্ভিস নিষ্ক্রিয় ($1)।",
        "privacy": "গোপনীয়তার নীতি",
        "privacypage": "Project:গোপনীয়তার নীতি",
        "badaccess": "অনুমোদন ত্রুটি",
-       "badaccess-group0": "আপনি যে কাজের জন্য অনুরোধ করেছেন, যে কাজটি সম্পন্ন করার অনুমতি নেই।",
+       "badaccess-group0": "আপনি যে কাজের জন্য অনুরোধ করেছেন তা আপনার সম্পন্ন করার অনুমতি নেই।",
        "badaccess-groups": "আপনি যে কাজটি করতে চাচ্ছেন তা কেবল {{PLURAL:$2|এই দলের|এই দলগুলির যেকোন একটির}} একজন সদস্য ব্যবহারকারী সম্পাদন করতে পারেন: $1।",
        "versionrequired": "মিডিয়াউইকির $1 নং সংস্করণ প্রয়োজন",
        "versionrequiredtext": "এই পাতাটি ব্যবহার করার জন্য মিডিয়াউইকির $1 নং সংস্করণ প্রয়োজন। [[Special:Version|সংস্করণ পাতা]] দেখুন।",
        "youhavenewmessagesmulti": "আপনার $1টি নতুন বার্তা এসেছে",
        "editsection": "সম্পাদনা",
        "editold": "সম্পাদনা",
-       "viewsourceold": "à¦\89à§\8eস à¦¦à§\87à¦\96াà¦\93",
+       "viewsourceold": "à¦\89à§\8eস à¦¦à§\87à¦\96à§\81ন",
        "editlink": "সম্পাদনা",
        "viewsourcelink": "উৎস দেখুন",
        "editsectionhint": "অনুচ্ছেদ সম্পাদনা: $1",
        "toc": "পরিচ্ছেদসমূহ",
        "showtoc": "দেখাও",
-       "hidetoc": "à¦\86ড়ালà§\87 à¦°à¦¾à¦\96à§\8b",
+       "hidetoc": "লà§\81à¦\95িয়à§\87 à¦°à¦¾à¦\96à§\81ন",
        "collapsible-collapse": "সংকোচন",
        "collapsible-expand": "প্রসারণ",
        "confirmable-confirm": "{{GENDER:$1|আপনি}} কি নিশ্চিত?",
        "confirmable-yes": "হ্যাঁ",
        "confirmable-no": "না",
-       "thisisdeleted": "$1 à¦¦à§\87à¦\96ানà§\8b à¦¬à¦¾ à¦ªà§\81নà¦\83সà§\83ষà§\8dà¦\9fি à¦\95রা à¦¹à§\8bà¦\95?",
-       "viewdeleted": "$1 à¦¦à§\87à¦\96ানà§\8b à¦¹à§\8bà¦\95?",
+       "thisisdeleted": "$1 à¦¦à§\87à¦\96বà§\87ন à¦¬à¦¾ à¦ªà§\81নরà§\81দà§\8dধার à¦\95রবà§\87ন?",
+       "viewdeleted": "$1 à¦¦à§\87à¦\96বà§\87ন?",
        "restorelink": "{{PLURAL:$1|একটি মুছে ফেলা সম্পাদনা|$1টি মুছে ফেলা সম্পাদনা}}",
        "feedlinks": "ফিড:",
        "feed-invalid": "গ্রাহক ফিডের ধরন অবৈধ।",
        "page-atom-feed": "\"$1\" অ্যাটম ফিড",
        "feed-atom": "অ্যাটম",
        "red-link-title": "$1 (পাতার অস্তিত্ব নেই)",
-       "sort-descending": "à¦\89লà§\8dà¦\9fà§\8b à¦¬à¦°à§\8dণà¦\95à§\8dরমà§\87 à¦¸à¦¾à¦\9cাà¦\93",
-       "sort-ascending": "বরà§\8dণানà§\81à¦\95à§\8dরমà§\87 à¦¸à¦¾à¦\9cাà¦\93",
+       "sort-descending": "à¦\89লà§\8dà¦\9fà§\8b à¦¬à¦°à§\8dণà¦\95à§\8dরমà§\87 à¦¸à¦¾à¦\9cান",
+       "sort-ascending": "বরà§\8dণানà§\81à¦\95à§\8dরমà§\87 à¦¸à¦¾à¦\9cান",
        "nstab-main": "পাতা",
        "nstab-user": "ব্যবহারকারীর পাতা",
        "nstab-media": "মিডিয়া পাতা",
        "nosuchspecialpage": "এমন কোন বিশেষ পাতা নেই",
        "nospecialpagetext": "<strong>আপনি একটি অবৈধ বিশেষ পাতার অনুরোধ করেছেন।</strong>\n\n[[Special:SpecialPages|{{int:specialpages}}]]-এ বৈধ বিশেষ পাতাগুলির একটি তালিকা পাবেন।",
        "error": "ত্রুটি",
-       "databaseerror": "ডাà¦\9fাবà§\87স ত্রুটি",
-       "databaseerror-text": "ডাটাবেজ অনুসন্ধান ত্রুটি।\nএটি সফটওয়্যারের একটি ত্রুটি হতে পারে।",
-       "databaseerror-textcl": "ডাটাবেজ অনুসন্ধান ত্রুটি।",
+       "databaseerror": "ডাà¦\9fাবà§\87à¦\9c ত্রুটি",
+       "databaseerror-text": "ডাটাবেজ অনুসন্ধানে একটি ত্রুটি উৎপন্ন হয়েছে।\nএটি সফটওয়্যারের কোন ত্রুটির কারণে হতে পারে।",
+       "databaseerror-textcl": "ডাটাবেজ অনুসন্ধানে একটি ত্রুটি উৎপন্ন হয়েছে।",
        "databaseerror-query": "অনুসন্ধান: $1",
        "databaseerror-function": "ফাংশন: $1",
        "databaseerror-error": "ত্রুটি: $1",
-       "laggedslavemode": "সতর্কীকরণ: পাতাটি সম্ভবত সম্প্রতি হালনাগাদকৃত নয়।",
-       "readonly": "ডেটাবেজের ব্যবহার সীমাবদ্ধ",
-       "enterlockreason": "তালাবদ্ধ করার কারণ কি তা বলুন, সাথে কখন তালা খুলবেন তার আনুমানিক সময় উল্লখ্য করুন",
-       "readonlytext": "নতুন ভুক্তি এবং অন্যান্য সম্পাদনার জন্য ডাটাবেজ বর্তমানে বন্ধ করা আছে। সম্ভবত ডাটাবেজ রক্ষণাবেক্ষণের নিয়মিত কাজ চলছে। কিছুক্ষণ পরে এটি স্বাভাবিক অবস্থায় ফিরে আসবে।\n\nসিস্টেম প্রশাসক যিনি এটি বন্ধ করেছেন তিনি এই ব্যাখ্যা দিয়েছেন: $1",
-       "missing-article": "\"$1\" $2 লেখাটি ডাটাবেসের কোন পাতায় খুজে পাওয়া যায়নি।\n\nমুছে ফেলা কোন পাতায় সংযোগ থাকার কারনেই সাধারণত এমনটি ঘটে।\n\nযদি এমনটি না হয়, তাহলে আপনি সফটওয়্যারে কোন ত্রুটি খুজে পেয়েছেন।\nদয়াকরে এ ব্যাপার সম্পর্কে ইউআরএল সহ কোন [[Special:ListUsers/sysop|প্রশাসককে]] জানান।",
+       "transaction-duration-limit-exceeded": "দীর্ঘ পুনঃসৃষ্টি বিলম্ব এড়ানোর জন্য এই ট্রানজাকশনটি বাতিল করা হল, কারণ লিখনের স্থায়িত্ব ($1) $2 সেকেন্ড সীমাটিকে অতিক্রম করে গিয়েছিল। \nযদি আপনি অনেকগুলি আইটেম একসাথে পরিবর্তন করতে চান, তাহলে একাধিক ক্ষুদ্রতর অপারেশন সম্পন্ন করার চেষ্টা করুন।",
+       "laggedslavemode": "<strong>সতর্ক বার্তা:</strong> পাতাটি সম্ভবত সম্প্রতি হালনাগাদ করা হয়নি।",
+       "readonly": "ডাটাবেজ অবরুদ্ধ",
+       "enterlockreason": "অবরুদ্ধ করার কারণ কী তা বলুন, সাথে কখন অবরোধ খুলবেন তার আনুমানিক সময় উল্লেখ করুন",
+       "readonlytext": "নতুন ভুক্তি এবং অন্যান্য সম্পাদনার জন্য ডাটাবেজ বর্তমানে অবরুদ্ধ করা আছে। সম্ভবত ডাটাবেজ রক্ষণাবেক্ষণের নিয়মিত কাজ চলছে। কাজ শেষ হলে এটি স্বাভাবিক অবস্থায় ফিরে আসবে।\n\nযে সিস্টেম প্রশাসক এটি অবরুদ্ধ করেছেন, তিনি এই ব্যাখ্যা দিয়েছেন: $1",
+       "missing-article": "\"$1\" পাতাটির $2 লেখাটি ডাটাবেজ খুঁজে পায়নি, যদিও খুঁজে পাওয়ার কথা ছিল।\n\nসাধারণত কোন মেয়াদোত্তীর্ণ সংশোধন পার্থক্য অনুসরণ করলে অথবা  \nমুছে ফেলা কোন পাতার ইতিহাসের সংযোগ অনুসরণ করলে এমনটি ঘটে।\n\nযদি এমনটি না হয়, তাহলে আপনি হয়ত সফটওয়্যারে কোন ত্রুটি খুঁজে পেয়েছেন।\n\nঅনুগ্রহ করে ইউআরএল-টি উল্লেখ করে এ ব্যাপারে কোন [[Special:ListUsers/sysop|প্রশাসককে]] অবহিত করুন।",
        "missingarticle-rev": "(সংস্করণ#: $1)",
        "missingarticle-diff": "(পার্থক্য: $1, $2)",
-       "readonly_lag": "ডাà¦\9fাবà§\87à¦\9c à¦¸à§\8dবয়à¦\82à¦\95à§\8dরিয়ভাবà§\87 à¦¬à¦¨্ধ করে দেয়া হয়েছে, যাতে অধীন ডাটাবেজ সার্ভারগুলি প্রধান ডাটাবেজ সার্ভারের অবস্থায় আসতে পারে।",
+       "readonly_lag": "ডাà¦\9fাবà§\87à¦\9c à¦¸à§\8dবয়à¦\82à¦\95à§\8dরিয়ভাবà§\87 à¦\85বরà§\81দ্ধ করে দেয়া হয়েছে, যাতে অধীন ডাটাবেজ সার্ভারগুলি প্রধান ডাটাবেজ সার্ভারের অবস্থায় আসতে পারে।",
        "nonwrite-api-promise-error": "'Promise-Non-Write-API-Action' HTTP শিরলেখে পাঠানো হয়েছিল কিন্তু অনুরোধটি একটি API লিখন মডিউলে ছিল।",
-       "internalerror": "à¦\86ভ্যন্তরীণ ত্রুটি",
-       "internalerror_info": "à¦\86ভ্যন্তরীণ ত্রুটি: $1",
+       "internalerror": "à¦\85ভ্যন্তরীণ ত্রুটি",
+       "internalerror_info": "à¦\85ভ্যন্তরীণ ত্রুটি: $1",
        "internalerror-fatal-exception": "\"$1\" ধরনের মারাত্মক ব্যতিক্রম",
-       "filecopyerror": "\"$1\" à¦¥à§\87à¦\95à§\87 \"$2\" à¦«à¦¾à¦\87ল à¦\85নà§\81লিপি করা যায়নি।",
-       "filerenameerror": "\"$1\" à¦«à¦¾à¦\87লà¦\9fির à¦¨à¦¾à¦® à¦¬à¦¦à¦²à§\87 \"$2\" à¦\95রা à¦¸à¦®à§\8dভব à¦¹à¦\9aà§\8dà¦\9bà§\87 à¦¨à¦¾।",
-       "filedeleteerror": "\"$1\" à¦«à¦¾à¦\87লà¦\9fি à¦®à§\81à¦\9bà§\87 à¦«à§\87লা à¦¸à¦®à§\8dভব à¦¹à¦\9aà§\8dà¦\9bà§\87 à¦¨à¦¾।",
-       "directorycreateerror": "\"$1\" à¦¡à¦¾à¦\87রà§\87à¦\95à§\8dà¦\9fরি তৈরি করা যায়নি।",
-       "directoryreadonlyerror": "নির্দেশিকা \"$1\" শুধুমাত্র পাঠযোগ্য।",
-       "directorynotreadableerror": "নির্দেশিকা \"$1\" পাঠযোগ্য নয়।",
-       "filenotfound": "\"$1\" à¦«à¦¾à¦\87লà¦\9fি à¦\96à§\81à¦\81à¦\9cà§\87 à¦ªà¦¾à¦\93য়া à¦¯à¦¾à¦\9aà§\8dà¦\9bà§\87 à¦¨à¦¾।",
+       "filecopyerror": "\"$1\" à¦¨à¦¾à¦® à¦¥à§\87à¦\95à§\87 \"$2\" à¦¨à¦¾à¦®à§\87 à¦«à¦¾à¦\87ল à¦ªà§\8dরতিলিপি করা যায়নি।",
+       "filerenameerror": "\"$1\" à¦«à¦¾à¦\87লà¦\9fির à¦¨à¦¾à¦® à¦ªà¦°à¦¿à¦¬à¦°à§\8dতন à¦\95রà§\87 \"$2\" à¦\95রা à¦¸à¦®à§\8dভব à¦¹à¦¯à¦¼à¦¨à¦¿।",
+       "filedeleteerror": "\"$1\" à¦«à¦¾à¦\87লà¦\9fি à¦®à§\81à¦\9bà§\87 à¦«à§\87লা à¦¸à¦®à§\8dভব à¦¹à¦¯à¦¼à¦¨à¦¿।",
+       "directorycreateerror": "\"$1\" à¦¨à¦¿à¦°à§\8dদà§\87শিà¦\95া তৈরি করা যায়নি।",
+       "directoryreadonlyerror": "\"$1\" নির্দেশিকাটি শুধুমাত্র পাঠযোগ্য।",
+       "directorynotreadableerror": "\"$1\" নির্দেশিকাটি পাঠযোগ্য নয়।",
+       "filenotfound": "\"$1\" à¦«à¦¾à¦\87লà¦\9fি à¦\96à§\81à¦\81à¦\9cà§\87 à¦ªà¦¾à¦\93য়া à¦¯à¦¾à¦¯à¦¼à¦¨à¦¿।",
        "unexpected": "অপ্রত্যাশিত মান: \"$1\"=\"$2\"।",
-       "formerror": "তà§\8dরà§\81à¦\9fি: à¦«à¦°à¦®à¦\9fি à¦\9cমা à¦¦à§\87à¦\93য়া à¦¯à¦¾à¦¯à¦¼à¦¨à¦¿",
+       "formerror": "তà§\8dরà§\81à¦\9fি: à¦«à¦°à¦®à¦\9fি à¦\9cমা à¦¦à§\87à¦\93য়া à¦¸à¦®à§\8dভব à¦¹à¦¯à¦¼à¦¨à¦¿à¥¤",
        "badarticleerror": "এই পাতায় এই কাজটি করা সম্ভব নয়।",
-       "cannotdelete": "\"$1\" à¦ªà¦¾à¦¤à¦¾ à¦¬à¦¾ à¦«à¦¾à¦\87লà¦\9fি à¦®à§\8bà¦\9bা à¦¸à¦®à§\8dভব à¦¨à¦¾।\nসম্ভবত অন্য কেউ আগেই এটিকে মুছে ফেলেছেন।",
-       "cannotdelete-title": "\"$1\" à¦ªà§\83ষà§\8dঠা à¦®à§\81à¦\9bà§\87 à¦«à§\87লা à¦¯à¦¾à¦\9aà§\8dà¦\9bà§\87 à¦¨à¦¾à¥¤",
-       "delete-hook-aborted": "হà§\82à¦\95 à¦¦à§\8dবারা à¦¸à¦®à§\8dপাদনা à¦ªà¦°à¦¿à¦¤à§\8dযà¦\95à§\8dত à¦¹à¦¯à¦¼à§\87à¦\9bà§\87।\nà¦\8fর à¦\95à§\8bন à¦¬à§\8dযাà¦\96à§\8dযা à¦¨à¦¾à¦\87।",
+       "cannotdelete": "\"$1\" à¦ªà¦¾à¦¤à¦¾ à¦¬à¦¾ à¦«à¦¾à¦\87লà¦\9fি à¦®à§\8bà¦\9bা à¦¸à¦®à§\8dভব à¦¹à¦¯à¦¼à¦¨à¦¿।\nসম্ভবত অন্য কেউ আগেই এটিকে মুছে ফেলেছেন।",
+       "cannotdelete-title": "\"$1\" à¦ªà¦¾à¦¤à¦¾à¦\9fি à¦®à§\81à¦\9bà§\87 à¦«à§\87লা à¦¯à¦¾à¦\9aà§\8dà¦\9bà§\87 à¦¨à¦¾",
+       "delete-hook-aborted": "হà§\81à¦\95à§\87র à¦\95ারণà§\87 à¦ªà¦¾à¦¤à¦¾ à¦®à§\8bà¦\9bার à¦\95াà¦\9cà¦\9fি à¦ªà¦°à¦¿à¦¤à§\8dযà¦\95à§\8dত à¦¹à¦¯à¦¼à§\87à¦\9bà§\87।\nà¦\95à§\8bন à¦¬à§\8dযাà¦\96à§\8dযা à¦¦à§\87য়া à¦¹à¦¯à¦¼à¦¨à¦¿।",
        "no-null-revision": "\"$1\" পাতার জন্য ফাঁকা সংস্করণ তৈরী করা যায়নি",
-       "badtitle": "শিরà§\8bনামà¦\9fি à¦\97à§\8dরহনযà§\8bà¦\97à§\8dয à¦¨à¦¯à¦¼à¥¤",
+       "badtitle": "ভà§\81ল à¦¶à¦¿à¦°à§\8bনাম",
        "badtitletext": "অনুরোধকৃত পাতার শিরোনামটি অবৈধ, খালি কিংবা কোন ভুল আন্তঃভাষা বা আন্তঃউইকি শিরোনাম সংযোগ ছিল। এটিতে সম্ভবত এমন এক (একাধিক) ক্যারেক্টার আছে, যা (যেগুলি) শিরোনামে ব্যবহারযোগ্য নয়।",
        "title-invalid-empty": "অনুরোধকৃত পাতার শিরোনামটি খালি বা শুধুমাত্র একটি নামস্থানের নাম ধারণ করে।",
        "title-invalid-utf8": "অনুরোধকৃত পাতার শিরোনামটিতে একটি অবৈধ ইউটিএফ-৮ অনুক্রম রয়েছে।",
        "title-invalid-interwiki": "অনুরোধকৃত পাতার শিরোনামে একটি আন্তঃউইকি সংযোগ উপস্থিত রয়েছে যা শিরোনামে ব্যবহার করা যাবে না।",
-       "title-invalid-talk-namespace": "অনুরোধকৃত পাতার শিরোনাম একটি আলাপ পাতা নির্দেশ করে যার অস্তিত্ব থাকতে পারে না।",
+       "title-invalid-talk-namespace": "à¦\85নà§\81রà§\8bধà¦\95à§\83ত à¦ªà¦¾à¦¤à¦¾à¦° à¦¶à¦¿à¦°à§\8bনাম à¦\8fমন à¦\8fà¦\95à¦\9fি à¦\86লাপ à¦ªà¦¾à¦¤à¦¾ à¦¨à¦¿à¦°à§\8dদà§\87শ à¦\95রà§\87 à¦¯à¦¾à¦° à¦\85সà§\8dতিতà§\8dব à¦¥à¦¾à¦\95তà§\87 à¦ªà¦¾à¦°à§\87 à¦¨à¦¾à¥¤",
        "title-invalid-characters": "অনুরোধকৃত পাতার শিরোনামে অবৈধ অক্ষর রয়েছে: \"$1\"।",
        "title-invalid-relative": "শিরনামে রিলেটিভ পাথ ব্যবহার করা হয়েছে (./, ../), রিলেটিভ পাথ ব্যবহার উপযোগী নয়, কারণ ব্যবহারকারীর ব্রাউজারে এটি সঠিকভাবে কাজ করে না।",
        "title-invalid-magic-tilde": "অনুরোধকৃত পাতার শিরোনামে অবৈধ জাদু টিল্ডা অনুক্রম (<nowiki>~~~</nowiki>) রয়েছে।",
-       "title-invalid-too-long": "পাতার à¦¶à¦¿à¦°à§\8bনামà¦\9fি à¦\85তà§\8dযাধিà¦\95 à¦¦à§\80রà§\8dà¦\98। à¦\87à¦\89à¦\9fিà¦\8fফ-৮ à¦\8fনà¦\95à§\8bডিà¦\82 à¦\85নà§\81যায়à§\80 à¦\8fà¦\9fি $1 {{PLURAL:$1|বাà¦\87à¦\9fà§\87র}} à¦¥à§\87à¦\95à§\87 à¦¦à§\80রà§\8dà¦\98 হতে পারবে না।",
-       "title-invalid-leading-colon": "à¦\85নà§\81রà§\8bধà¦\95à§\83ত à¦ªà¦¾à¦¤à¦¾à¦° à¦¶à¦¿à¦°à§\8bনামà§\87র à¦¶à§\81রà§\81তà§\87 à¦\8fà¦\95à¦\9fি à¦\85বà§\88ধ à¦\95à§\8bলন রয়েছে।",
+       "title-invalid-too-long": "à¦\85নà§\81রà§\8bধà¦\95à§\83ত à¦ªà¦¾à¦¤à¦¾à¦° à¦¶à¦¿à¦°à§\8bনামà¦\9fি à¦\85তà§\8dযধিà¦\95 à¦¦à§\80রà§\8dà¦\98। à¦\87à¦\89à¦\9fিà¦\8fফ-৮ à¦¸à¦¾à¦\82à¦\95à§\87তিà¦\95à§\80à¦\95রণ à¦\85নà§\81যায়à§\80 à¦\8fà¦\9fি $1 {{PLURAL:$1|বাà¦\87à¦\9fà§\87র}} à¦¥à§\87à¦\95à§\87 à¦¦à§\80রà§\8dà¦\98তর হতে পারবে না।",
+       "title-invalid-leading-colon": "à¦\85নà§\81রà§\8bধà¦\95à§\83ত à¦ªà¦¾à¦¤à¦¾à¦° à¦¶à¦¿à¦°à§\8bনামà¦\9fির à¦¶à§\81রà§\81তà§\87 à¦\8fà¦\95à¦\9fি à¦\85বà§\88ধ à¦\95à§\8bলন à¦\9aিহà§\8dন (:) রয়েছে।",
        "perfcached": "নিচের উপাত্তগুলো ক্যাশ থেকে নেয়া এবং সম্পূর্ণ হালনাগাদকৃত না-ও হতে পারে। সর্বোচ্চ {{PLURAL:$1|একটি ফলাফল|$1 টি ফলাফল}} ক্যাশে থাকতে পারে।",
-       "perfcachedts": "নিচের উপাত্তগুলো ক্যাশ থেকে নেয়া এবং $1 তারিখে হালনাগাদ করা হয়েছে। সর্বোচ্চ {{PLURAL:$4|একটি ফলাফল|$4 টি ফলাফল}} ক্যাশে থাকতে পারে।",
-       "querypage-no-updates": "এই পাতার জন্য হালনাগাদ নিষ্ক্রিয় করা হয়েছে। এখানে রাখা উপাত্ত এ মুহূর্তে রিফ্রেশ করা হবে না।",
+       "perfcachedts": "নিচের উপাত্তগুলো ক্যাশ থেকে নেয়া এবং সর্বশেষ $1 তারিখে হালনাগাদ করা হয়েছে। সর্বোচ্চ {{PLURAL:$4|একটি ফলাফল|$4টি ফলাফল}} ক্যাশে থাকতে পারে।",
+       "querypage-no-updates": "এই পাতার জন্য হালনাগাদ নিষ্ক্রিয় করা হয়েছে। এখানে রাখা উপাত্তগুলি এ মুহূর্তে হালনাগাদ করা হবে না।",
        "viewsource": "উৎস দেখুন",
-       "viewsource-title": "$1 এর উৎস দেখুন",
+       "viewsource-title": "$1-এর উৎস দেখুন",
        "actionthrottled": "কাজের গতি ধীরকরণ",
-       "actionthrottledtext": "সà§\8dপà§\8dযাম-রà§\8bধà§\80 à¦¸à¦®à¦¾à¦§à¦¾à¦¨ à¦¹à¦¿à¦¸à§\87বà§\87 à¦\8fà¦\87 à¦\95াà¦\9cà¦\9fি à¦\96à§\81ব à¦\95ম à¦¸à¦®à¦¯à¦¼à§\87 à¦\85নà§\87à¦\95 à¦¬à§\87শিবার à¦¸à¦®à§\8dপাদনা à¦\95রার সীমা বেঁধে দেওয়া হয়েছে, এবং আপনি সেই সীমা অতিক্রম করেছেন।\nঅনুগ্রহ করে কয়েক মিনিট পরে আবার চেষ্টা করুন।",
-       "protectedpagetext": "সমà§\8dপাদনা à¦\85থবা à¦¸à§\8dথানানà§\8dতর à¦\8fড়াতà§\87 à¦\8f à¦ªà¦¾à¦¤à¦¾à¦\9fির à¦¬à§\8dযবহার à¦¨à¦¿à¦¯à¦¼à¦¨à§\8dতà§\8dরণ করা হয়েছে।",
-       "viewsourcetext": "à¦\8f à¦ªà¦¾à¦¤à¦¾à¦\9fি à¦\86পনি à¦¦à§\87à¦\96তà§\87 à¦\8fবà¦\82 à¦\89à§\8eসà§\87র à¦\85নà§\81লিপি à¦¨à¦¿তে পারবেন।",
-       "viewyourtext": "আপনি এই পাতায় <strong>আপনার সম্পাদনা</strong>দেখতে এবং অনুলিপি করতে পারেন।",
-       "protectedinterface": "এই পাতার বিষয়বস্তু এই উইকি সফটওয়্যারের একটি ইন্টারফেস বার্তা প্রদান করে, তাই এটিকে সুরক্ষিত করে রাখা হয়েছে।\nসকল উইকির অনুবাদে কোনো ধরনের সংযোজন বা পরিবর্তন করতে, অনুগ্রহ করে মিডিয়াউইকি স্থানীয়করন প্রকল্প [https://translatewiki.net/ translatewiki.net] ব্যবহার করুন।",
-       "editinginterface": "<strong>সতর্কীকরণ:</strong> আপনি এমন একটি পাতা সম্পাদনা করছেন যা সফটওয়্যারের জন্য ইন্টারফেস টেক্সট প্রদান করে।\nএই পাতাতে সংঘটিত পরিবর্তন এই উইকির ব্যবহারকারীদের ইন্টারফেসে প্রভাব ফেলবে, যা অন্য ব্যবহারকারীরা দেখতে পাবেন।",
-       "translateinterface": "সকল উইকির জন্য অনুবাদ যোগ বা পরিবর্তন করতে, দয়া করে [https://translatewiki.net/ translatewiki.net], মিডিয়াউইকি স্থানীয়করণ প্রকল্প ব্যবহার করুন।",
-       "cascadeprotected": "এই পাতাটি সম্পাদনা থেকে সুরক্ষিত কারণ এটি নিম্নোক্ত {{PLURAL:$1|পাতায়|পাতাসমূহে}} অন্তর্ভুক্ত, যা \"প্রপাতাকার\" বৈশিষ্ট্য সহযোগে সুরক্ষিত করা আছে:\n$2",
-       "namespaceprotected": "'''$1''' নামস্থানে কোন পাতা আপনার সম্পাদনা করার অনুমতি নেই।",
+       "actionthrottledtext": "à¦\85পবà§\8dযবহার à¦ªà§\8dরতিরà§\8bধà¦\95 à¦¸à¦®à¦¾à¦§à¦¾à¦¨ à¦¹à¦¿à¦¸à§\87বà§\87 à¦\8fà¦\87 à¦\95াà¦\9cà¦\9fি à¦\96à§\81ব à¦\95ম à¦¸à¦®à¦¯à¦¼à§\87 à¦\85নà§\87à¦\95 à¦¬à§\87শিবার à¦¸à¦®à§\8dপাদন à¦\95রার à¦\89পর সীমা বেঁধে দেওয়া হয়েছে, এবং আপনি সেই সীমা অতিক্রম করেছেন।\nঅনুগ্রহ করে কয়েক মিনিট পরে আবার চেষ্টা করুন।",
+       "protectedpagetext": "সমà§\8dপাদনা à¦\85থবা à¦\85নà§\8dযানà§\8dয à¦\95াà¦\9cà§\87 à¦¬à¦¾à¦§à¦¾ à¦¦à¦¿à¦¤à§\87 à¦\8fà¦\87 à¦ªà¦¾à¦¤à¦¾à¦\9fিà¦\95à§\87 à¦¸à§\81রà¦\95à§\8dষিত করা হয়েছে।",
+       "viewsourcetext": "à¦\8f à¦ªà¦¾à¦¤à¦¾à¦\9fি à¦\86পনি à¦¦à§\87à¦\96তà§\87 à¦\8fবà¦\82 à¦\89à§\8eসà§\87র à¦ªà§\8dরতিলিপি à¦\95রতে পারবেন।",
+       "viewyourtext": "আপনি এই পাতায় করা <strong>আপনার সম্পাদনাগুলি</strong> দেখতে এবং প্রতিলিপি করতে পারেন।",
+       "protectedinterface": "এই পাতার বিষয়বস্তু এই উইকি সফটওয়্যারের একটি ইন্টারফেস বার্তা প্রদান করে, তাই এটি যাতে অপব্যবহারে না করা হয়, সেজন্য এটিকে সুরক্ষিত করে রাখা হয়েছে।\nসকল উইকির অনুবাদে কোনো ধরনের সংযোজন বা পরিবর্তন করতে অনুগ্রহ করে মিডিয়াউইকি স্থানীয়করণ প্রকল্প [https://translatewiki.net/ translatewiki.net] ব্যবহার করুন।",
+       "editinginterface": "<strong>সতর্ক বার্তা:</strong> আপনি এমন একটি পাতা সম্পাদনা করছেন যা সফটওয়্যারের জন্য ইন্টারফেস লেখা সরবরাহ করে।\nএই পাতাতে সংঘটিত পরিবর্তন এই উইকির অন্যান্য ব্যবহারকারীদের জন্য দৃশ্যমান ইন্টারফেসে প্রভাব ফেলবে।",
+       "translateinterface": "সকল উইকির জন্য অনুবাদ যোগ বা পরিবর্তন করতে দয়া করে [https://translatewiki.net/ translatewiki.net], মিডিয়াউইকি স্থানীয়করণ প্রকল্প ব্যবহার করুন।",
+       "cascadeprotected": "এই পাতাটিকে সম্পাদনা করা থেকে সুরক্ষিত করা হয়েছে, কারণ এটি নিম্নোক্ত {{PLURAL:$1|পাতায়|পাতাগুলিতে}} অন্তর্ভুক্ত, {{PLURAL:$1|যেটি|যেগুলি}} \"প্রপাতাকার\" বৈশিষ্ট্য সহযোগে সুরক্ষিত করা আছে:\n$2",
+       "namespaceprotected": "<strong>$1</strong> নামস্থানের কোন পাতা আপনার সম্পাদনা করার অনুমতি নেই।",
        "customcssprotected": "আপনার এই সিএসএস পাতাটি সম্পাদনা করার অনুমতি নেই, কারণ এ পাতায় অন্য ব্যবহারকারীর নিজস্ব সেটিংস রয়েছে।",
        "customjsprotected": "আপনার এই জাভাস্ক্রিপ্ট পাতাটি সম্পাদনা করার অনুমতি নেই, কারণ এ পাতায় অন্য ব্যবহারকারীর নিজস্ব সেটিংস রয়েছে।",
        "mycustomcssprotected": "আপনার এই সিএসএস পাতাটি সম্পাদনা করার অনুমতি নেই।",
        "mypreferencesprotected": "আপনার পছন্দসমূহ সম্পাদনা করতে আপনার অনুমতি নেই",
        "ns-specialprotected": "বিশেষ পাতাসমূহ সম্পাদনা করা যাবে না।",
        "titleprotected": "[[User:$1|$1]] কর্তৃক এই শিরোনামটি সৃষ্টি করা থেকে সুরক্ষিত করা হয়েছে। কারণ: <em>$2</em>।",
-       "filereadonlyerror": "\"$1\" à¦«à¦¾à¦\87লà¦\9fিà¦\95à§\87 à¦ªà¦°à¦¿à¦¬à¦°à§\8dতন à¦\95রা à¦¸à¦®à§\8dভব à¦¹à¦\9aà§\8dà¦\9bà§\87 à¦¨à¦¾ à¦\95ারণ \"$2\" à¦«à¦¾à¦\87ল à¦¸à¦\82à¦\97à§\8dরহসà§\8dথল à¦¶à§\81ধà§\81মাতà§\8dর-পঠন à¦®à§\8bডà§\87 à¦\86à¦\9bà§\87।\n\nসিসà§\8dà¦\9fà§\87ম à¦ªà§\8dরশাসà¦\95 à¦¯à¦¿à¦¨à¦¿ à¦\8fà¦\9fি à¦¬à¦¨্ধ করেছেন তিনি এই ব্যাখ্যা দিয়েছেন: \"$3\"।",
+       "filereadonlyerror": "\"$1\" à¦«à¦¾à¦\87লà¦\9fিà¦\95à§\87 à¦ªà¦°à¦¿à¦¬à¦°à§\8dতন à¦\95রা à¦¸à¦®à§\8dভব à¦¹à¦\9aà§\8dà¦\9bà§\87 à¦¨à¦¾ à¦\95ারণ \"$2\" à¦«à¦¾à¦\87ল à¦¸à¦\82à¦\97à§\8dরহশালাà¦\9fি à¦¶à§\81ধà§\81মাতà§\8dর-পঠন à¦®à§\8bডà§\87 à¦\86à¦\9bà§\87।\n\nসিসà§\8dà¦\9fà§\87ম à¦ªà§\8dরশাসà¦\95 à¦¯à¦¿à¦¨à¦¿ à¦«à¦¾à¦\87লà¦\9fি à¦\85বরà§\81দ্ধ করেছেন তিনি এই ব্যাখ্যা দিয়েছেন: \"$3\"।",
        "invalidtitle-knownnamespace": "অবৈধ শিরোনাম, যেখানে নামস্থান \"$2\" এবং লেখা হয়েছে \"$3\"",
        "invalidtitle-unknownnamespace": "অবৈধ শিরোনাম, যেখানে ব্যবহৃত হয়েছে অপরিচিত নামস্থান সংখ্যা $1 এবং লেখা হয়েছে \"$2\"",
        "exception-nologin": "প্রবেশ করেন নি",
        "exception-nologin-text": "এই কাজ করা বা পাতাটি দেখার জন্য অনুগ্রহ করে প্রবেশ করুন।",
        "exception-nologin-text-manual": "অনুগ্রহ করে এই পাতা দেখতে অথবা পরিবর্তন করতে $1 করুন।",
-       "virus-badscanner": "ভুল কনফিগারেশন: অজ্ঞাত ভাইরাস স্কেনার: ''$1''",
+       "virus-badscanner": "ভুল কনফিগারেশন: অজ্ঞাত ভাইরাস স্কেনার: <em>$1</em>",
        "virus-scanfailed": "স্ক্যান করা যাচ্ছে না (কোড $1)",
        "virus-unknownscanner": "অজানা এন্টিভাইরাস:",
        "logouttext": "'''আপনি এখন আপনার অ্যাকাউন্ট থেকে প্রস্থান করেছেন।'''\n\nনোট করুন যে কিছু পাতায় আপনাকে এখনও প্রবেশ অবস্থায় দেখাবে, যতক্ষণ না আপনি ব্রাউজার ক্যাশ পরিষ্কার করছেন।",
        "cannotloginnow-title": "এখন প্রবেশ করা যাবে না",
        "cannotloginnow-text": "$1 ব্যবহার করার সময় প্রবেশ করা সম্ভব নয়।",
        "cannotcreateaccount-title": "অ্যাকাউন্ট তৈরি করা যাবে না",
-       "cannotcreateaccount-text": "সরাসরি à¦\85à§\8dযাà¦\95াà¦\89নà§\8dà¦\9f à¦¸à§\83ষà§\8dà¦\9fিà¦\95রণ à¦\8fà¦\87 à¦\89à¦\87à¦\95িতà§\87 à¦¸à¦\95à§\8dরিয় নয়।",
+       "cannotcreateaccount-text": "সরাসরি à¦\85à§\8dযাà¦\95াà¦\89নà§\8dà¦\9f à¦¤à§\88রিà¦\95রণ à¦\8fà¦\87 à¦\89à¦\87à¦\95িতà§\87 à¦¸à¦®à§\8dভব নয়।",
        "yourdomainname": "আপনার ডোমেইন:",
        "password-change-forbidden": "আপনি এই উইকিতে পাসওয়ার্ড পরিবর্তন করতে পারবেন না।",
        "externaldberror": "হয় কোন বহিঃস্থ যাচাইকরণ ডাটাবেজ ত্রুটি ঘটেছে অথবা আপনার বহিঃস্থ অ্যাকাউন্ট হালনাগাদ করার অনুমতি নেই।",
        "usernameinprogress": "এই ব্যবহারকারী নামের জন্য একটি অ্যাকাউন্ট তৈরি আগে থেকেই চলছে। দয়া করে অপেক্ষা করুন।",
        "userexists": "এই ব্যবহারকারী নামটি ইতমধ্যে ব্যবহার করা হয়েছে।\nঅনুগ্রহ করে অন্য নাম বেছে নিন।",
        "loginerror": "প্রবেশ করতে সমস্যা হয়েছে",
-       "createacct-error": "অ্যাকাউন্ট তৈরি ত্রুটি",
+       "createacct-error": "অ্যাকাউন্ট তৈরিতে ত্রুটি",
        "createaccounterror": "অ্যাকাউন্ট তৈরি হয়নি: $1",
        "nocookiesnew": "ব্যবহারকারীর অ্যাকাউন্টটি সৃষ্টি করা হয়েছে, কিন্তু আপনি এখনও অ্যাকাউন্টে প্রবেশ করেননি। {{SITENAME}}-তে কুকি ব্যবহার করে ব্যবহারকারীদের অ্যাকাউন্টে প্রবেশ করানো হয়। আপনার ব্রাউজারে কুকিগুলি নিষ্ক্রিয় করা আছে। অনুগ্রহ করে কুকিগুলি সক্রিয় করুন এবং আপনার নতুন ব্যবহারকারী নাম ও পাসওয়ার্ড ব্যবহার করে অ্যাকাউন্টে প্রবেশ করুন।",
        "nocookieslogin": "ব্যবহারকারীদের প্রবেশ সম্পন্ন করতে {{SITENAME}} কুকি ব্যবহার করে। আপনার ব্রাউজারে কুকি নিষ্ক্রিয় করা আছে। কুকি চালু করে আবার চেষ্টা করুন।",
        "emaildisabled": "এই সাইটটিতে ই-মেইল প্রদানের সুবিধা নেই।",
        "accountcreated": "অ্যাকাউন্ট তৈরি করা হয়েছে",
        "accountcreatedtext": "[[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|আলাপ]]) এর জন্য ব্যবহারকারী অ্যাকাউন্ট তৈরি করা হয়েছে।",
-       "createaccount-title": "{{SITENAME}}-à¦\8fর à¦\9cনà§\8dয à¦\85à§\8dযাà¦\95াà¦\89নà§\8dà¦\9f à¦¸à§\83ষà§\8dà¦\9fি",
-       "createaccount-text": "à¦\95à§\87à¦\89 $2-à¦\8fর à¦\9cনà§\8dয {{SITENAME}}-à¦\8f à¦\8fà¦\95à¦\9fি à¦\85à§\8dযাà¦\95াà¦\89নà§\8dà¦\9f à¦¸à§\83ষà§\8dà¦\9fি à¦\95রà§\87à¦\9bà§\87ন ($4)। \"$2\"-à¦\8fর à¦\9cনà§\8dয à¦ªà¦¾à¦¸à¦\93য়ারà§\8dড à¦¹à¦² \"$3\"। à¦\86পনার à¦\8fà¦\96ন à¦\85à§\8dযাà¦\95াà¦\89নà§\8dà¦\9fà§\87 à¦ªà§\8dরবà§\87শ à¦\95রà§\87 à¦ªà¦¾à¦¸à¦\93য়ারà§\8dড à¦ªà¦°à¦¿à¦¬à¦°à§\8dতন à¦\95রা à¦\89à¦\9aিত।\n\nযদি à¦­à§\81ল à¦\95রà§\87 à¦\85à§\8dযাà¦\95াà¦\89নà§\8dà¦\9fà¦\9fি à¦¸à§\83ষà§\8dà¦\9fি হয়ে থাকে, তাহলে এই বার্তাটি উপেক্ষা করুন।",
+       "createaccount-title": "{{SITENAME}}-à¦\8fর à¦\9cনà§\8dয à¦\85à§\8dযাà¦\95াà¦\89নà§\8dà¦\9f à¦¤à§\88রিà¦\95রণ",
+       "createaccount-text": "à¦\95à§\87à¦\89 $2-à¦\8fর à¦\9cনà§\8dয {{SITENAME}}-à¦\8f à¦\8fà¦\95à¦\9fি à¦\85à§\8dযাà¦\95াà¦\89নà§\8dà¦\9f à¦¤à§\88রি à¦\95রà§\87à¦\9bà§\87ন ($4)। \"$2\"-à¦\8fর à¦\9cনà§\8dয à¦ªà¦¾à¦¸à¦\93য়ারà§\8dড à¦¹à¦² \"$3\"। à¦\86পনার à¦\8fà¦\96ন à¦\85à§\8dযাà¦\95াà¦\89নà§\8dà¦\9fà§\87 à¦ªà§\8dরবà§\87শ à¦\95রà§\87 à¦ªà¦¾à¦¸à¦\93য়ারà§\8dড à¦ªà¦°à¦¿à¦¬à¦°à§\8dতন à¦\95রা à¦\89à¦\9aিত।\n\nযদি à¦­à§\81ল à¦\95রà§\87 à¦\85à§\8dযাà¦\95াà¦\89নà§\8dà¦\9fà¦\9fি à¦¤à§\88রি হয়ে থাকে, তাহলে এই বার্তাটি উপেক্ষা করুন।",
        "login-throttled": "আপনি সাম্প্রতিক সময়ে পরপর বেশ কয়েকবার প্রবেশের চেষ্টা করেছেন।\nপুনরায় চেষ্টা করার পূর্বে অনুগ্রহ করে $1 অপেক্ষা করুন।",
        "login-abort-generic": "আপনার প্রবেশ ব্যর্থ হয়েছে - বাতিল করা হয়েছে",
        "login-migrated-generic": "আপনার অ্যাকাউন্ট স্থানান্তরিত করা হয়েছে, এবং আপনার ব্যবহারকারী নাম আর এই উইকিতে বিদ্যমান নয়।",
        "loginlanguagelabel": "ভাষা: $1",
-       "suspicious-userlogout": "à¦\86পনার à¦ªà§\8dরসà§\8dথানà§\87র à¦\85নà§\81রà§\8bধ à¦¬à¦¾à¦¤à¦¿à¦² à¦¹à¦¯à¦¼à§\87à¦\9bà§\87 à¦\95ারণ à¦\85নà§\81মিত à¦¯à§\87 à¦\86পনার à¦¬à§\8dরাà¦\89à¦\9cার à¦\85সমà§\8dপà§\82রà§\8dণ à¦\85থবা à¦ªà§\82বরà§\8dবতà§\80 à¦¤à¦¥à§\8dয প্রেরণ করেছে।",
+       "suspicious-userlogout": "à¦\85à§\8dযাà¦\95াà¦\89নà§\8dà¦\9f à¦¥à§\87à¦\95à§\87 à¦\86পনার à¦ªà§\8dরসà§\8dথানà§\87র à¦\85নà§\81রà§\8bধ à¦ªà§\8dরতà§\8dযাà¦\96ান à¦\95রা à¦¹à¦¯à¦¼à§\87à¦\9bà§\87 à¦\95ারণ à¦®à¦¨à§\87 à¦¹à¦\9aà§\8dà¦\9bà§\87 à¦¯à§\87 à¦\85নà§\81রà§\8bধà¦\9fি à¦\8fà¦\95à¦\9fি à¦\85à¦\95ারà§\8dযà¦\95র à¦¬à§\8dরাà¦\89à¦\9cার à¦\85থবা à¦\95à§\8dযাশ à¦\95রà§\87 à¦\8fমন à¦ªà§\8dরà¦\95à§\8dসি à¦¸à¦¾à¦°à§\8dভার প্রেরণ করেছে।",
        "createacct-another-realname-tip": "আসল নাম ঐচ্ছিক।\nআপনি যদি তা দিতে চান, তাহলে তা ব্যবহারকারীকে তাদের কাজের জন্য স্বীকৃতিদানে ব্যবহার করা হবে।",
        "pt-login": "প্রবেশ",
        "pt-login-button": "প্রবেশ",
        "oldpassword": "পুরনো পাসওয়ার্ড:",
        "newpassword": "নতুন পাসওয়ার্ড:",
        "retypenew": "নতুন পাসওয়ার্ড আবার লিখুন:",
-       "resetpass_submit": "পাসà¦\93য়ারà§\8dড à¦¦à¦¾à¦\93 à¦\8fবà¦\82 à¦²à¦\97-à¦\87ন à¦\95রà§\8b",
+       "resetpass_submit": "পাসà¦\93য়ারà§\8dড à¦¨à¦¿à¦°à§\8dধারণ à¦\95রà§\87 à¦\85à§\8dযাà¦\95াà¦\89নà§\8dà¦\9fà§\87 à¦ªà§\8dরবà§\87শ à¦\95রà§\81ন",
        "changepassword-success": "আপনার পাসওয়ার্ড পরিবর্তন করা হয়েছে!",
-       "changepassword-throttled": "আপনি সম্প্রতি পরপর বেশ কয়েকবার প্রবেশের চেষ্টা করেছেন। পুনরায় চেষ্টা করার পূর্বে অনুগ্রহ করে $1 অপেক্ষা করুন।",
+       "changepassword-throttled": "à¦\86পনি à¦¸à¦®à§\8dপà§\8dরতি à¦ªà¦°à¦ªà¦° à¦¬à§\87শ à¦\95য়à§\87à¦\95বার à¦\85à§\8dযাà¦\95াà¦\89নà§\8dà¦\9fà§\87 à¦ªà§\8dরবà§\87শà§\87র à¦\9aà§\87ষà§\8dà¦\9fা à¦\95রà§\87à¦\9bà§\87ন। à¦ªà§\81নরায় à¦\9aà§\87ষà§\8dà¦\9fা à¦\95রার à¦ªà§\82রà§\8dবà§\87 à¦\85নà§\81à¦\97à§\8dরহ à¦\95রà§\87 $1 à¦\85পà§\87à¦\95à§\8dষা à¦\95রà§\81ন।",
        "botpasswords": "বট পাসওয়ার্ড",
-       "botpasswords-disabled": "বট পাসওয়ার্ড নিষ্ক্রিয় করা।",
-       "botpasswords-no-central-id": "বট পাসওয়ার্ড ব্যবহার করার জন্য, আপনাকে একটি কেন্দ্রীভূত অ্যাকাউন্টে প্রবেশ করতে হবে।",
-       "botpasswords-existing": "বিদ্যমান বট শব্দচাবি",
+       "botpasswords-summary": "<em>বট পাসওয়ার্ডগুলি</em> এপিআই-এর মাধ্যমে অ্যাকাউন্টের প্রবেশের জন্য দরকারী মূল পরিচয়সূচক তথ্য ছাড়াই ব্যবহারকারীর অ্যাকাউন্টে প্রবেশাধিকার প্রদান করে। বট পাসওয়ার্ড দিয়ে অ্যাকাউন্টে প্রবেশ করলে ব্যবহারকারীর জন্য লভ্য অধিকারগুলি সীমিত হতে পারে।  \n\nএ কাজটি কেন করবেন, তা যদি অবগত না থাকেন, তাহলে সম্ভবত আপনার কাজটি করা উচিত নয়। অন্য কোনও ব্যক্তির কথায় কখনো এধরনের কিছু সৃষ্টি করবেন না এবং তাকে বা তাদেরকে এটি দেবেন না।",
+       "botpasswords-disabled": "বট পাসওয়ার্ডগুলি নিষ্ক্রিয় রয়েছে।",
+       "botpasswords-no-central-id": "বট পাসওয়ার্ড ব্যবহার করার জন্য আপনাকে একটি কেন্দ্রীভূত অ্যাকাউন্টে প্রবেশ করতে হবে।",
+       "botpasswords-existing": "বিদ্যমান বট পাসওয়ার্ড",
        "botpasswords-createnew": "একটি নতুন বট পাসওয়ার্ড তৈরি করুন",
        "botpasswords-editexisting": "একটি বিদ্যমান বট পাসওয়ার্ড পরিবর্তন করুন",
        "botpasswords-label-appid": "বটের নাম:",
-       "botpasswords-label-create": "তৈরি করো",
-       "botpasswords-label-update": "হালনাগাদ",
-       "botpasswords-label-cancel": "বাতিল",
-       "botpasswords-label-delete": "অপসারণ",
-       "botpasswords-label-resetpassword": "পাসওয়ার্ড পুনঃস্থাপন",
-       "botpasswords-label-grants": "প্রয়োগযোগ্য মঞ্জুরি:",
+       "botpasswords-label-create": "তৈরি করুন",
+       "botpasswords-label-update": "হালনাগাদ করুন",
+       "botpasswords-label-cancel": "বাতিল করুন",
+       "botpasswords-label-delete": "অপসারণ করুন",
+       "botpasswords-label-resetpassword": "পাসওয়ার্ড পুনঃনির্ধারণ করা হোক",
+       "botpasswords-label-grants": "প্রয়োগযোগ্য অনুমোদন:",
+       "botpasswords-help-grants": "অনুমোদনগুলি সেইসব অধিকারের সুবিধা দেয়, যেগুলি ইতিমধ্যেই আপনার ব্যবহারকারী অ্যাকাউন্টে বিদ্যমান। এখানে একটি অনুমোদনকে সক্রিয় করলে এমন কোন অধিকারের সুবিধা পাওয়া যাবে না, যা আপনার অ্যাকাউন্টের অন্যথায় নেই। আরও তথ্যের জন্য [[Special:ListGrants|অনুমোদনসমূহের সারণী]] দেখুন।",
        "botpasswords-label-grants-column": "অনুমোদিত",
        "botpasswords-bad-appid": "\"$1\" বট নামটি সঠিক নয়।",
-       "botpasswords-insert-failed": "\"$1\" à¦¨à¦¾à¦®à§\87র à¦¬à¦\9f à¦¯à§\81à¦\95à§\8dত à¦\95রা à¦¯à¦¾à¦¯à¦¼à¦¨à¦¿à¥¤ à¦\86à¦\97à§\87 à¦¥à§\87à¦\95à§\87à¦\87 তালিকায় রয়েছে?",
-       "botpasswords-update-failed": "\"$1\" নামের বট যুক্ত করা যায়নি। আগে অপসারণ করা হয়েছিল?",
+       "botpasswords-insert-failed": "\"$1\" à¦¨à¦¾à¦®à§\87র à¦¬à¦\9f à¦¯à§\81à¦\95à§\8dত à¦\95রা à¦¯à¦¾à¦¯à¦¼à¦¨à¦¿à¥¤ à¦\8fà¦\9fি à¦\95ি à¦\86à¦\97à§\87 à¦¥à§\87à¦\95à§\87à¦\87 à¦¬à¦\9fà§\87র তালিকায় রয়েছে?",
+       "botpasswords-update-failed": "\"$1\" à¦¨à¦¾à¦®à§\87র à¦¬à¦\9f à¦¯à§\81à¦\95à§\8dত à¦\95রা à¦¯à¦¾à¦¯à¦¼à¦¨à¦¿à¥¤ à¦\8fà¦\9fি à¦\95ি à¦\86à¦\97à§\87 à¦\85পসারণ à¦\95রা à¦¹à¦¯à¦¼à§\87à¦\9bিল?",
        "botpasswords-created-title": "বট পাসওয়ার্ড তৈরী করা হয়েছে",
        "botpasswords-created-body": "ব্যবহারকারী \"$2\"-এর \"$1\" নামের বটের জন্য বট পাসওয়ার্ড তৈরী করা হয়েছে।",
-       "botpasswords-updated-title": "বà¦\9f à¦ªà¦¾à¦¸à¦\93য়ারà§\8dড à¦\86পডà§\87à¦\9f করা হয়েছে",
+       "botpasswords-updated-title": "বà¦\9f à¦ªà¦¾à¦¸à¦\93য়ারà§\8dড à¦¹à¦¾à¦²à¦¨à¦¾à¦\97াদ করা হয়েছে",
        "botpasswords-updated-body": "ব্যবহারকারী \"$2\"-এর \"$1\" নামের বটের জন্য বট পাসওয়ার্ড হালনাগাদ করা হয়েছে।",
-       "botpasswords-deleted-title": "বà¦\9f à¦ªà¦¾à¦¸à¦\93য়ারà§\8dড à¦\85পসারণ à¦\95রা হয়েছে",
+       "botpasswords-deleted-title": "বà¦\9f à¦ªà¦¾à¦¸à¦\93য়ারà§\8dড à¦®à§\81à¦\9bà§\87 à¦«à§\87লা হয়েছে",
        "botpasswords-deleted-body": "ব্যবহারকারী \"$2\"-এর \"$1\" নামের বটের জন্য বট পাসওয়ার্ড মুছে ফেলা হয়েছিল।",
-       "botpasswords-no-provider": "BotPasswordsSessionProvider উপলব্ধ নয়।",
-       "botpasswords-restriction-failed": "বট পাসওয়ার্ডের সীমাবদ্ধতা এই প্রবেশ প্রতিরোধ করেছে।",
+       "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-no-info": "à¦\8fà¦\87 à¦ªà¦¾à¦¤à¦¾à¦\9fিতà§\87 à¦¸à¦°à¦¾à¦¸à¦°à¦¿ à¦ªà§\8dরবà§\87শাধিà¦\95ার à¦ªà§\87তà§\87 à¦\86পনাà¦\95à§\87 à¦\85বশà§\8dযà¦\87 à¦\85à§\8dযাà¦\95াà¦\89নà§\8dà¦\9fà§\87 à¦ªà§\8dরবà§\87শ à¦\95রতà§\87 à¦¹à¦¬à§\87।",
+       "resetpass-submit-loggedin": "পাসওয়ার্ড পরিবর্তন করুন",
        "resetpass-submit-cancel": "বাতিল",
        "resetpass-wrong-oldpass": "ভুল অস্থায়ী অথবা বর্তমান পাসওয়ার্ড।\nসম্ভবতঃ আপনি ইতোমধ্যেই আপনার পাসওয়ার্ডটি পরিবর্তন করেছেন অথবা একটি নতুন অস্থায়ী পাসওয়ার্ডের জন্য অনুরোধ করেছেন।",
-       "resetpass-recycled": "à¦\85নà§\81à¦\97à§\8dরহ à¦\95রà§\87 à¦¬à¦°à§\8dতমানà§\87 à¦¬à§\8dযবহার à¦\95রà¦\9bà§\87ন à¦\8fমন পাসওয়ার্ডের পরিবর্তে নতুন একটি পাসওয়ার্ড নির্ধারণ করুন।",
-       "resetpass-temp-emailed": "আপনি ইমেইলকৃত সাময়িক কোড দিয়ে প্রবেশ করেছেন।\nপ্রবেশ করার জন্য আপনাকে অবশ্যই একটি নতুন পাসওয়ার্ড নির্ধারণ করতে হবে:",
+       "resetpass-recycled": "à¦\85নà§\81à¦\97à§\8dরহ à¦\95রà§\87 à¦¬à¦¿à¦¦à§\8dযমান পাসওয়ার্ডের পরিবর্তে নতুন একটি পাসওয়ার্ড নির্ধারণ করুন।",
+       "resetpass-temp-emailed": "আপনি ইমেইলকৃত সাময়িক কোড দিয়ে প্রবেশ করেছেন। অ্যাকাউন্টে\nপ্রবেশ সম্পন্ন করার জন্য আপনাকে অবশ্যই একটি নতুন পাসওয়ার্ড নির্ধারণ করতে হবে:",
        "resetpass-temp-password": "অস্থায়ী পাসওয়ার্ড:",
        "resetpass-abort-generic": "পাসওয়ার্ড পরিবর্তন একটি এক্সটেনশনের কারণে স্থগিত করা হয়েছে।",
-       "resetpass-expired": "আপনার পাসওয়ার্ডের মেয়াদ উত্তীর্ণ হয়েছে। অনুগ্রহ করে নতুন পাসওয়ার্ড নির্ধারণ করুন।",
+       "resetpass-expired": "à¦\86পনার à¦ªà¦¾à¦¸à¦\93য়ারà§\8dডà§\87র à¦®à§\87য়াদ à¦\89তà§\8dতà§\80রà§\8dণ à¦¹à¦¯à¦¼à§\87à¦\9bà§\87। à¦\85à§\8dযাà¦\95াà¦\89নà§\8dà¦\9fà§\87 à¦ªà§\8dরবà§\87শà§\87র à¦\9cনà§\8dয à¦\85নà§\81à¦\97à§\8dরহ à¦\95রà§\87 à¦¨à¦¤à§\81ন à¦ªà¦¾à¦¸à¦\93য়ারà§\8dড à¦¨à¦¿à¦°à§\8dধারণ à¦\95রà§\81ন।",
        "resetpass-expired-soft": "আপনার পাসওয়ার্ডের মেয়াদ উত্তীর্ণ হয়েছে এবং আপনাকে একটি নতুন পাসওয়ার্ড নির্ধারণ করতে হবে। অনুগ্রহ করে এখনই একটি নতুন পাসওয়ার্ড নির্ধারণ করুন অথবা পরে পরিবর্তন করতে চাইলে \"{{int:authprovider-resetpass-skip-label}}\" বাটনে ক্লিক করুন।",
        "resetpass-validity-soft": "আপনার পাসওয়ার্ড বৈধ নয়: $1\n\nদয়া করে একটি নতুন পাসওয়ার্ড নির্ধারণ করুন অথবা পরে করার জন্য \"{{int:authprovider-resetpass-skip-label}}\" ক্লিক করুন।",
        "passwordreset": "পাসওয়ার্ড রিসেট",
        "passwordreset-nosuchcaller": "আহ্বানকারীর অস্তিত্ব নেই: $1",
        "passwordreset-ignored": "পাসওয়ার্ড পুনঃধার্যকরণ করা যায়নি। হয়তো কোন প্রদানকারী কনফিগার করা হয়েনি?",
        "passwordreset-invalidemail": "ভুল ইমেইল ঠিকানা",
-       "passwordreset-nodata": "à¦\8fà¦\95à¦\9fি à¦¬à§\8dযবহারà¦\95ারà§\80র à¦¨à¦¾à¦® à¦¬à¦¾ à¦\8fà¦\95à¦\9fি à¦\87মà§\87ল à¦ à¦¿à¦\95ানা à¦¦à§\81à¦\9fির à¦\8fà¦\95à¦\9fিà¦\93 à¦¸à¦°à¦¬à¦°à¦¾ à¦¦à§\87য়া হয়নি",
+       "passwordreset-nodata": "বà§\8dযবহারà¦\95ারà§\80র à¦¨à¦¾à¦® à¦¬à¦¾ à¦\87মà§\87ল à¦ à¦¿à¦\95ানা à¦¦à§\81à¦\9fির à¦\8fà¦\95à¦\9fিà¦\93 à¦¸à¦°à¦¬à¦°à¦¾à¦¹ à¦\95রা হয়নি",
        "changeemail": "ই-মেইল ঠিকানা পরিবর্তন বা বাতিল",
-       "changeemail-header": "à¦\86পনার à¦\87মà§\87ল à¦ à¦¿à¦\95ানা à¦ªà¦°à¦¿à¦¬à¦°à§\8dতন à¦\95রতà§\87 à¦\8fà¦\87 à¦«à¦°à¦®à¦\9fি à¦ªà§\82রণ à¦\95রà§\81ন। à¦\86পনি à¦¯à¦¦à¦¿ à¦\86পনার à¦\8fà¦\95াà¦\89নà§\8dà¦\9f à¦¥à§\87à¦\95à§\87 à¦¯à§\87 à¦\95à§\8bন à¦\87মà§\87ল à¦ à¦¿à¦\95ানার à¦\8fসà§\8bসিয়à§\87শন à¦\85পসারণ à¦\95রতà§\87 চান, তাহলে ফরমটি জমা দেওয়ার সময় নতুন ইমেইল ঠিকানা খালি রাখুন।",
-       "changeemail-no-info": "এই পাতাটিতে সরাসরি প্রবেশাধিকার পেতে আপনাকে অবশ্যই প্রবেশ করতে হবে।",
-       "changeemail-oldemail": "বর্তমান ই-মেইল ঠিকানা:",
-       "changeemail-newemail": "নতুন ই-মেইল ঠিকানা:",
-       "changeemail-newemail-help": "à¦\86পনার à¦\87মà§\87à¦\87ল à¦ à¦¿à¦\95ানা à¦\85পসরণ à¦\95রতà§\87 à¦\9aাà¦\87লà§\87 à¦\8fà¦\87 à¦\9cায়à¦\97াà¦\9fি à¦«à¦¾à¦\81à¦\95া à¦\9bà§\87ড়à§\87 à¦¦à§\87à¦\93য়া à¦\89à¦\9aিত। à¦\87মà§\87à¦\87ল à¦ à¦¿à¦\95ানা à¦\85পসরণ à¦\95রলà§\87 à¦\86পনি à¦­à§\81লà§\87 à¦¯à¦¾à¦\93য়া à¦ªà¦¾à¦¸à¦\93য়ারà§\8dড à¦ªà§\81নà¦\83ধারà§\8dয করতে পারবেন না এবং এই উইকি থেকে আপনাকে কোন ইমেইল পাঠানো হবে না।",
-       "changeemail-none": "(à¦\95িà¦\9bà§\81 à¦¨à¦¾ই)",
+       "changeemail-header": "à¦\86পনার à¦\87মà§\87ল à¦ à¦¿à¦\95ানা à¦ªà¦°à¦¿à¦¬à¦°à§\8dতন à¦\95রতà§\87 à¦\8fà¦\87 à¦«à¦°à¦®à¦\9fি à¦ªà§\82রণ à¦\95রà§\81ন। à¦\86পনি à¦¯à¦¦à¦¿ à¦\86পনার à¦\85à§\8dযাà¦\95াà¦\89নà§\8dà¦\9fà§\87র à¦¸à¦¾à¦¥à§\87 à¦\95à§\8bনà¦\93 à¦\87মà§\87à¦\87ল à¦ à¦¿à¦\95ানার à¦¸à¦\82শà§\8dলিষà§\8dà¦\9fতা à¦°à¦¾à¦\96তà§\87 à¦¨à¦¾ চান, তাহলে ফরমটি জমা দেওয়ার সময় নতুন ইমেইল ঠিকানা খালি রাখুন।",
+       "changeemail-no-info": "à¦\8fà¦\87 à¦ªà¦¾à¦¤à¦¾à¦\9fিতà§\87 à¦¸à¦°à¦¾à¦¸à¦°à¦¿ à¦ªà§\8dরবà§\87শাধিà¦\95ার à¦ªà§\87তà§\87 à¦\86পনাà¦\95à§\87 à¦\85বশà§\8dযà¦\87 à¦\85à§\8dযাà¦\95াà¦\89নà§\8dà¦\9fà§\87 à¦ªà§\8dরবà§\87শ à¦\95রতà§\87 à¦¹à¦¬à§\87।",
+       "changeemail-oldemail": "বর্তমান ইমেইল ঠিকানা:",
+       "changeemail-newemail": "নতুন ইমেইল ঠিকানা:",
+       "changeemail-newemail-help": "à¦\86পনার à¦\87মà§\87à¦\87ল à¦ à¦¿à¦\95ানা à¦\85পসারণ à¦\95রতà§\87 à¦\9aাà¦\87লà§\87 à¦\8fà¦\87 à¦\9cায়à¦\97াà¦\9fি à¦«à¦¾à¦\81à¦\95া à¦°à§\87à¦\96à§\87 à¦¦à§\87à¦\93য়া à¦\89à¦\9aিত। à¦\87মà§\87à¦\87ল à¦ à¦¿à¦\95ানা à¦\85পসারণ à¦\95রলà§\87 à¦\86পনি à¦­à§\81লà§\87 à¦¯à¦¾à¦\93য়া à¦ªà¦¾à¦¸à¦\93য়ারà§\8dড à¦ªà§\81নà¦\83নিরà§\8dধারণ করতে পারবেন না এবং এই উইকি থেকে আপনাকে কোন ইমেইল পাঠানো হবে না।",
+       "changeemail-none": "(নà§\87ই)",
        "changeemail-password": "আপনার {{SITENAME}} পাসওয়ার্ড:",
-       "changeemail-submit": "ই-মেইল পরিবর্তন",
-       "changeemail-throttled": "আপনি পরপর বেশ কয়েকবার প্রবেশের চেষ্টা করেছেন। পুনরায় চেষ্টা করার পূর্বে অনুগ্রহ করে $1 অপেক্ষা করুন।",
-       "changeemail-nochange": "দয়া à¦\95রà§\87 à¦\8fà¦\95à¦\9fি à¦­à¦¿à¦¨à§\8dন à¦¨à¦¤à§\81ন à¦\87মà§\87à¦\87ল à¦ à¦¿à¦\95ানা à¦²à¦¿à¦\96à§\81ন।",
-       "resettokens": "টোকেন পুনঃস্থাপন করুন",
-       "resettokens-text": "à¦\86পনি à¦\9fà§\8bà¦\95à§\87ন à¦ªà§\81নà¦\83সà§\8dথাপন à¦\95রতà§\87 à¦ªà¦¾à¦°à§\87ন, à¦¯à¦¾ à¦\85à§\8dযাà¦\95াà¦\89নà§\8dà¦\9fà§\87র à¦¸à¦¾à¦¥à§\87 à¦¸à¦®à§\8dপরà§\8dà¦\95িত à¦\86পনার à¦¬à§\8dযà¦\95à§\8dতিà¦\97ত à¦¤à¦¥à§\8dয à¦¦à§\87à¦\96ার à¦\95াà¦\9cà§\87 à¦¬à§\8dযবহার à¦\95রা à¦¹à¦¯à¦¼।",
-       "resettokens-no-tokens": "পà§\81নà¦\83সà§\8dথাপন করার মত কোনো টোকেন নেই।",
+       "changeemail-submit": "ইমেইল ঠিকানা পরিবর্তন",
+       "changeemail-throttled": "à¦\86পনি à¦ªà¦°à¦ªà¦° à¦¬à§\87শ à¦\95য়à§\87à¦\95বার à¦\85à§\8dযাà¦\95াà¦\89নà§\8dà¦\9fà§\87 à¦ªà§\8dরবà§\87শà§\87র à¦\9aà§\87ষà§\8dà¦\9fা à¦\95রà§\87à¦\9bà§\87ন। à¦ªà§\81নরায় à¦\9aà§\87ষà§\8dà¦\9fা à¦\95রার à¦ªà§\82রà§\8dবà§\87 à¦\85নà§\81à¦\97à§\8dরহ à¦\95রà§\87 $1 à¦\85পà§\87à¦\95à§\8dষা à¦\95রà§\81ন।",
+       "changeemail-nochange": "দয়া à¦\95রà§\87 à¦\8fà¦\95à¦\9fি à¦­à¦¿à¦¨à§\8dন à¦\93 à¦¨à¦¤à§\81ন à¦\87মà§\87à¦\87ল à¦ à¦¿à¦\95ানা à¦ªà§\8dরবà§\87শ à¦\95রান।",
+       "resettokens": "টোকেনগুলি পুনঃনির্ধারণ করুন",
+       "resettokens-text": "যà§\87 à¦\9fà§\8bà¦\95à§\87নà¦\97à§\81লি à¦\85à§\8dযাà¦\95াà¦\89নà§\8dà¦\9fà§\87র à¦¸à¦¾à¦¥à§\87 à¦¸à¦®à§\8dপরà§\8dà¦\95িত à¦\86পনার à¦¨à¦¿à¦°à§\8dদিষà§\8dà¦\9f à¦\95িà¦\9bà§\81 à¦¬à§\8dযà¦\95à§\8dতিà¦\97ত à¦¤à¦¥à§\8dয à¦¦à§\87à¦\96ার à¦\95াà¦\9cà§\87 à¦¬à§\8dযবহার à¦\95রা à¦¹à¦¯à¦¼, à¦¸à§\87à¦\97à§\81লি à¦\86পনি à¦ªà§\81নà¦\83নিরà§\8dধারণ à¦\95রতà§\87 à¦ªà¦¾à¦°à§\87ন।\n\nযদি à¦¦à§\81রà§\8dà¦\98à¦\9fনাà¦\95à§\8dরমà§\87 à¦\9fà§\8bà¦\95à§\87নà¦\97à§\81লি à¦\95াà¦\89à¦\95à§\87 à¦¦à¦¿à¦¯à¦¼à§\87 à¦¥à¦¾à¦\95à§\87ন à¦\85থবা à¦\86পনার à¦\85à§\8dযাà¦\95াà¦\89নà§\8dà¦\9f à¦¯à¦¦à¦¿ à¦¬à¦¹à¦¿à¦\83à¦\86à¦\95à§\8dরমণà§\87র à¦¶à¦¿à¦\95ার à¦¹à¦¯à¦¼, à¦¤à¦¾à¦¹à¦²à§\87 à¦\86পনার à¦\8f à¦\95াà¦\9cà¦\9fি à¦\95রা à¦\89à¦\9aিত।",
+       "resettokens-no-tokens": "পà§\81নà¦\83নিরà§\8dধারণ করার মত কোনো টোকেন নেই।",
        "resettokens-tokens": "টোকেন:",
        "resettokens-token-label": "$1 (বর্তমান: $2)",
-       "resettokens-watchlist-token": "ওয়েব ফিড (Atom/RSS) টোকেন পরিবর্তনের জন্য [[Special:Watchlist|নজরতালিকায় থাকা পাতাগুলোতে পরিবর্তন এসেছে]]",
-       "resettokens-done": "টোকেন পুনঃস্থাপন।",
-       "resettokens-resetbutton": "নির্বাচিত টোকেন পুনঃস্থাপন করুন",
+       "resettokens-watchlist-token": "[[Special:Watchlist|নজরতালিকায় থাকা পাতাগুলোতে পরিবর্তন]] সংক্রান্ত ওয়েব ফিডের (Atom বা RSS) টোকেন",
+       "resettokens-done": "টোকেনগুলি সফলভাবে পুনঃনির্ধারিত হয়েছে।",
+       "resettokens-resetbutton": "নির্বাচিত টোকেনগুলি পুনঃনির্ধারণ করুন",
        "bold_sample": "গাঢ় লেখা",
        "bold_tip": "গাঢ় লেখা",
-       "italic_sample": "তà§\80র্যক লেখা",
-       "italic_tip": "তà§\80র্যক লেখা",
-       "link_sample": "সংযোগের শিরোনাম",
-       "link_tip": "à¦\86ভ্যন্তরীণ সংযোগ",
-       "extlink_sample": "http://www.example.com সংযোগ শিরোনাম",
-       "extlink_tip": "বহিঃসংযোগ (মনে রাখবেন http:// উপসর্গ)",
+       "italic_sample": "তির্যক লেখা",
+       "italic_tip": "তির্যক লেখা",
+       "link_sample": "à¦\85ভà§\8dযনà§\8dতরà§\80ণ à¦¸à¦\82যà§\8bà¦\97à§\87র à¦¶à¦¿à¦°à§\8bনাম",
+       "link_tip": "à¦\85ভ্যন্তরীণ সংযোগ",
+       "extlink_sample": "http://www.example.com à¦¬à¦¹à¦¿à¦\83সà¦\82যà§\8bà¦\97 à¦¶à¦¿à¦°à§\8bনাম",
+       "extlink_tip": "বহিঃসংযোগ (http:// উপসর্গটি যোগ করতে ভুলবেন না)",
        "headline_sample": "শিরোনাম",
        "headline_tip": "২য় স্তরের শিরোনাম",
-       "nowiki_sample": "অ-ফরম্যাটকৃত টেক্সট এখানে যোগ করুন",
-       "nowiki_tip": "à¦\89à¦\87à¦\95ি à¦«à¦°à¦®à§\8dযাà¦\9fিà¦\82 উপেক্ষা করা হোক",
+       "nowiki_sample": "অবিন্যাসকৃত পাঠ্য এখানে যোগ করুন",
+       "nowiki_tip": "à¦\89à¦\87à¦\95ি à¦¬à¦¿à¦¨à§\8dযাসন উপেক্ষা করা হোক",
        "image_sample": "উদাহরণ.jpg",
        "image_tip": "গ্রথিত ফাইল",
        "media_tip": "ফাইল সংযোগ",
        "preview": "প্রাকদর্শন",
        "showpreview": "প্রাকদর্শন",
        "showdiff": "পরিবর্তনসমূহ",
-       "blankarticle": "<strong>সতরà§\8dà¦\95 à¦¬à¦¾à¦°à§\8dতা:</strong> à¦\86পনি à¦\8fà¦\95à¦\9fি à¦\96ালি à¦ªà¦¾à¦¤à¦¾ à¦¤à§\88রà§\80 à¦\95রতà§\87 à¦¯à¦¾à¦\9aà§\8dà¦\9bà§\87ন।\nà¦\86পনি à¦¯à¦¦à¦¿ à¦ªà§\81নরায় \"{{int:savearticle}}\" à¦¬à¦¾à¦\9fন à¦\95à§\8dলিà¦\95 à¦\95রà§\87ন à¦¤à¦¾à¦¹à¦²à§\87, à¦ªà¦¾à¦¤à¦¾à¦\9fি à¦¤à§\88রà§\80 à¦¹à¦¬à§\87 à¦¯à§\87à¦\96ানà§\87 à¦\95à§\8bনà§\8b à¦¤à¦¥à§\8dয à¦²à§\87à¦\96া à¦¨à§\87à¦\87।",
-       "anoneditwarning": "<strong>সতর্কতা:</strong> আপনি বর্তমানে প্রবেশ করেননি। যদি আপনি সম্পাদনা করেন এই পাতার সম্পাদনার ইতিহাসে আপনার আইপি ঠিকানা সার্বজনীনভাবে সংরক্ষিত হবে। যদি আপনি  <strong>[$1 প্রবেশ করেন]</strong> বা  <strong>[$2 একটি অ্যাকাউন্ট তৈরি করেন]</strong>, তাহলে আপনি আপনার আইপি ঠিকানা গোপন রাখতে পারবেন ও অন্যান্য অনেক কিছু সুবিধা পাবেন।",
-       "anonpreviewwarning": "<em>à¦\86পনি à¦ªà§\8dরবà§\87শ à¦\95রà§\87ননি। à¦¸à¦®à§\8dপাদনা করলে এই পাতার সম্পাদনার ইতিহাসে আপনার আইপি ঠিকানা সংরক্ষিত হবে।</em>",
-       "missingsummary": "'''à¦\96à§\87য়াল à¦\95রà§\81ন''':  à¦\86পনি à¦\95িনà§\8dতà§\81 à¦¸à¦®à§\8dপাদনার à¦¸à¦¾à¦°à¦¾à¦\82শ à¦¦à§\87ননি। à¦\86বার à¦¯à¦¦à¦¿ \"সà¦\82রà¦\95à§\8dষণ\" বোতামে ক্লিক করেন, তাহলে ঐ সারাংশ বাক্যটি ছাড়াই আপনার সম্পাদনা সংরক্ষিত হবে।",
+       "blankarticle": "<strong>সতরà§\8dà¦\95 à¦¬à¦¾à¦°à§\8dতা:</strong> à¦\86পনি à¦\8fà¦\95à¦\9fি à¦\96ালি à¦ªà¦¾à¦¤à¦¾ à¦¤à§\88রà§\80 à¦\95রতà§\87 à¦¯à¦¾à¦\9aà§\8dà¦\9bà§\87ন।\nà¦\86পনি à¦¯à¦¦à¦¿ à¦ªà§\81নরায় \"{{int:savearticle}}\" à¦¬à§\8bতামà¦\9fি à¦\95à§\8dলিà¦\95 à¦\95রà§\87ন à¦¤à¦¾à¦¹à¦²à§\87 à¦\95à§\8bন à¦ªà¦¾à¦ à§\8dয à¦¬à¦¿à¦·à¦¯à¦¼à¦¬à¦¸à§\8dতà§\81 à¦\9bাড়াà¦\87 à¦ªà¦¾à¦¤à¦¾à¦\9fি à¦¤à§\88রà§\80 à¦¹à¦¬à§\87।",
+       "anoneditwarning": "<strong>সতর্ক বার্তা:</strong> আপনি বর্তমানে আপনার অ্যাকাউন্টে প্রবেশ করেননি। যদি এ অবস্থায় আপনি সম্পাদনা সংরক্ষণ করেন তাহলে এই পাতার সম্পাদনার ইতিহাসে আপনার আইপি ঠিকানা জনসমক্ষে দৃশ্যমান হবে। যদি আপনি  <strong>[$1 অ্যাকাউন্টে প্রবেশ করেন]</strong> বা  <strong>[$2 একটি অ্যাকাউন্ট তৈরি করেন]</strong>, তাহলে আপনি আপনার আইপি ঠিকানা গোপন রাখতে পারবেন ও অন্যান্য বেশ কিছু সুবিধা পাবেন।",
+       "anonpreviewwarning": "<em>à¦\86পনি à¦\85à§\8dযাà¦\95াà¦\89নà§\8dà¦\9fà§\87 à¦ªà§\8dরবà§\87শ à¦\95রà§\87ননি। à¦¸à¦®à§\8dপাদনা à¦¸à¦\82রà¦\95à§\8dষণ করলে এই পাতার সম্পাদনার ইতিহাসে আপনার আইপি ঠিকানা সংরক্ষিত হবে।</em>",
+       "missingsummary": "'''à¦\96à§\87য়াল à¦\95রà§\81ন''':  à¦\86পনি à¦\86পনার à¦¸à¦®à§\8dপাদনার à¦\95à§\8bনà¦\93 à¦¸à¦¾à¦°à¦¾à¦\82শ à¦¦à§\87ননি। à¦\86বার à¦¯à¦¦à¦¿ \"{{int:savearticle}}\" বোতামে ক্লিক করেন, তাহলে ঐ সারাংশ বাক্যটি ছাড়াই আপনার সম্পাদনা সংরক্ষিত হবে।",
        "selfredirect": "<strong>সতর্কতা:</strong> আপনি এই পাতাকে এর নিজের দিকে পুনঃনির্দেশিত করছেন।\nআপনাকে পুনঃনির্দেশিত করার জন্য হয় ভুল লক্ষ্য নির্দিষ্ট করেছেন, অথবা আপনি ভুল পাতা সম্পাদনা করছেন।\nআপনি যদি আবার \"{{int:savearticle}}\" ক্লিক করেন, পুনর্নির্দেশ যেকোনোভাবেই হোক তৈরি করা হবে।",
        "missingcommenttext": "দয়া করে নিচে মন্তব্য যোগ করুন।",
-       "missingcommentheader": "<strong>খেয়াল করুন:</strong> আপনি এই মন্তব্যের জন্য কোন বিষয় প্রদান করেননি।আপনি যদি আবার \"{{int:savearticle}}\" বোতামে ক্লিক করেন, আপনার এই সম্পাদনা কোন বিষয় ছাড়াই সংরক্ষিত হবে।",
+       "missingcommentheader": "<strong>খেয়াল করুন:</strong> আপনি এই মন্তব্যের জন্য কোনও বিষয় প্রদান করেননি। আপনি যদি আবার \"{{int:savearticle}}\" বোতামে ক্লিক করেন, আপনার এই সম্পাদনা কোন বিষয় ছাড়াই সংরক্ষিত হবে।",
        "summary-preview": "সম্পাদনা সারাংশের প্রাকদর্শন:",
        "subject-preview": "বিষয়ের প্রাকদর্শন:",
        "previewerrortext": "আপনার পরিবর্তনগুলি প্রাকদর্শন করার চেষ্টা করার সময় একটি ত্রুটি ঘটেছে।",
        "blockedtitle": "ব্যবহারকারীকে বাধা দেয়া হয়েছে",
-       "blockedtext": "আপনার ব্যবহারকারী নাম বা আইপি ঠিকানার ঊপর নিষেধাজ্ঞা আরোপিত হয়েছে।\n\n$1 নিষেধাজ্ঞা আরোপ করেছেন। নিষেধের কারণ হিসেবে বলা হয়েছে:''$2''।\n\n* নিষেধাজ্ঞা শুরুর সময়:$8\n* নিষেধাজ্ঞা উঠিয়ে নেয়ার সময়: $6\n* যার উপর নিষেধাজ্ঞা আরোপ করা হয়েছে: $7\n\nআপনি $1 অথবা [[{{MediaWiki:Grouppage-sysop}}|প্রশাসকদের]] কারও সাথে এই নিষেধাজ্ঞা সংক্রান্ত বিষয়ে আলোচনা করতে পারেন।\n\nআপনি '(ব্যবহারকারীকে) ইমেইল করুন' ফিচারটি ব্যবহার করতে পারবেন না। তবে [[Special:Preferences|আপনার পছন্দ তালিকাতে]] যদি একটি বৈধ ই-মেইল ঠিকানা নির্দিষ্ট করা হয়ে থাকে এবং ফিচারটি ব্যবহারে যদি আপনাকে বাধা না দেওয়া হয়ে থাকে, তবে আপনি ফিচারটি ব্যবহার করতে পারবেন।\n\nআপনার বর্তমান আইপি ঠিকানা $3, এবং আপনার নিষেধাজ্ঞা নং হল #$5।\n\nদয়া করে আপনার যেকোন জিজ্ঞাসাতে উপরের সমস্ত বিবরণ অন্তর্ভুক্ত করুন।",
-       "autoblockedtext": "আপনার আইপি ঠিকানাকে স্বয়ংক্রিয়ভাবে বাধা দেয়া হয়েছে কারণ এটি আরেকজন ব্যবহারকারী দ্বারা ব্যবহৃত হয়েছে, যাকে $1 বাধা দিয়েছেন।\nযে কারণে বাধা দেয়া হয়েছে:\n\n:''$2''\n\n* বাধা শুরুর সময়: $8\n* বাধা শেষের সময়: $6\n* যাকে বাধা দেওয়ার চেষ্টা করা হয়েছে: $7\n\nআপনি $1-এর সাথে কিংবা অন্য যেকোন [[{{MediaWiki:Grouppage-sysop}}|প্রশাসকের]] সাথে যোগাযোগ করে বাধার ব্যাপারটি আলোচনা করতে পারেন।\n\nলক্ষ্য করুন, যদি আপনি \"এই ব্যবহারকারীকে ই-মেইল করুন\" বৈশিষ্ট্যটি ব্যবহার করতে চান, তবে আপনার [[Special:Preferences|পছন্দ]] অপশনে একটি বৈধ ইমেইল ঠিকানা নিবন্ধিত থাকতে হবে এবং আপনার সেটি ব্যবহারে কোন বাধা থাকতে পারবে না।\n\nআপনার বর্তমান আইপি ঠিকানা হচ্ছে $3, এবং বাধা দানের আইডি হল #$5।\nযেকোন প্রশ্ন করার সময় উপরের সকল তথ্য উল্লেখ করুন।",
+       "blockedtext": "<strong>আপনার ব্যবহারকারী নাম বা আইপি ঠিকানাটিকে সম্পাদনায় বাধাদান করা হয়েছে।</strong>\n\n$1 এই বাধাটি প্রদান করেছেন। বাধার কারণ হিসেবে বলা হয়েছে:<em>$2</em>।\n\n* বাধা শুরুর সময়:$8\n* বাধা উঠিয়ে নেয়ার সময়: $6\n* যাকে বাধাদান করা হয়েছে: $7\n\nআপনি $1 অথবা [[{{MediaWiki:Grouppage-sysop}}|প্রশাসকদের]] কারও সাথে এই বাধা সংক্রান্ত বিষয়ে আলোচনা করতে পারেন।\n\nআপনি \"(ব্যবহারকারীকে) ইমেইল করুন\" সুবিধাটি ব্যবহার করতে পারবেন না। তবে [[Special:Preferences|আপনার পছন্দ তালিকাতে]] যদি একটি বৈধ ইমেইল ঠিকানা নির্দিষ্ট করা হয়ে থাকে এবং সুবিধাটি ব্যবহারে যদি আপনাকে বাধা না দেওয়া হয়ে থাকে, তবে আপনি সুবিধাটি ব্যবহার করতে পারবেন।\n\nআপনার বর্তমান আইপি ঠিকানা হল $3, এবং আপনার বাধা নং হল #$5।\n\nদয়া করে আপনার যেকোন জিজ্ঞাসাতে উপরের সমস্ত বিবরণ অন্তর্ভুক্ত করুন।",
+       "autoblockedtext": "আপনার আইপি ঠিকানাটিকে স্বয়ংক্রিয়ভাবে সম্পাদনায় বাধাদান করা হয়েছে কারণ এমন আরেকজন ব্যবহারকারী এটি ব্যবহার করেছেন, যাকে $1 বাধা দিয়েছেন।\nযে কারণে বাধা দেওয়া হয়েছে সেটি হল:\n\n:<em>$2</em>\n\n* বাধা শুরুর সময়: $8\n* বাধা শেষের সময়: $6\n* যাকে বাধাদান করা হয়েছে: $7\n\nআপনি $1-এর সাথে কিংবা অন্য যেকোন [[{{MediaWiki:Grouppage-sysop}}|প্রশাসকের]] সাথে যোগাযোগ করে এই বাধা সংক্রান্ত বিষয়ে আলোচনা করতে পারেন।\n\nলক্ষ্য করুন, যদি আপনি \"এই ব্যবহারকারীকে ই-মেইল করুন\" সুবিধাটি ব্যবহার করতে চান, তবে [[Special:Preferences|আপনার পছন্দ তালিকাতে]] যদি একটি বৈধ ইমেইল ঠিকানা নির্দিষ্ট  থাকতে হবে এবং আপনার সেটি ব্যবহারে কোন বাধা থাকতে পারবে না।\n\nআপনার বর্তমান আইপি ঠিকানা হচ্ছে $3, এবং বাধা নং হল #$5।\n\nদয়া করে আপনার যেকোন জিজ্ঞাসাতে উপরের সমস্ত বিবরণ অন্তর্ভুক্ত করুন।",
+       "systemblockedtext": "আপনার ব্যবহারকারী নাম অথবা আইপি ঠিকানাটিকে স্বয়ংক্রিয়ভাবে মিডিয়াউইকি দ্বারা বাধাদান করা হয়েছে। যে কারণটি দেওয়া হয়েছে, সেটি হল:\n\n:<em>$2</em>\n\n* বাধা শুরুর সময়: $8\n* বাধা উঠিয়ে নেয়ার সময়: $6\n* যাকে বাধাদান করা হয়েছে: $7\n\nআপনার বর্তমান আইপি ঠিকানাটি হল $3।\nদয়া করে আপনার যেকোন জিজ্ঞাসাতে উপরের সমস্ত বিবরণ অন্তর্ভুক্ত করুন।",
        "blockednoreason": "কোন কারণ দেওয়া হয়নি",
-       "whitelistedittext": "পাতায় à¦¸à¦®à§\8dপাদনা à¦\95রতà§\87 à¦\86বশà§\8dযà¦\87 $1 à¦\95রতà§\87 à¦¹à¦¬à§\87।",
+       "whitelistedittext": "পাতায় à¦¸à¦®à§\8dপাদনা à¦\95রতà§\87 à¦\85নà§\81à¦\97à§\8dরহ à¦\95রà§\87 $1 à¦\95রà§\81ন।",
        "confirmedittext": "কোন সম্পাদনা করার আগে আপনার ই-মেইল ঠিকানাটি অবশ্যই নিশ্চিত করতে হবে। দয়া করে আপনার ই-মেইল ঠিকানাটি [[Special:Preferences|ব্যবহারকারীর পছন্দতালিকায়]] ঠিকমত দিন।",
        "nosuchsectiontitle": "অনুচ্ছেদ পাওয়া যায়নি",
        "nosuchsectiontext": "আপনি এমন একটি অনুচ্ছেদ সম্পাদনার চেষ্টা করেছেন, যার কোন অস্তিত্ব নেই।\nযখন এই পাতাটি দেখার চেষ্টা করছে, তখন হয়তো এটি সরিয়ে অথবা অপসারণ করা হয়েছে।",
        "accmailtitle": "পাসওয়ার্ড পাঠানো হয়েছে",
        "accmailtext": "[[User talk:$1|$1]] এর জন্য দৈব ভাবে উৎপন্ন শব্দ চাবি $2 এ পাঠানো হয়েছে।\nলগ-ইন করার পর ''[[Special:ChangePassword|পাসওয়ার্ড পরিবর্তন]]'' পাতা থেকে এটি পরিবর্তন করা যাব।",
        "newarticle": "(নতুন)",
-       "newarticletext": "à¦\86পনি à¦\8fমন à¦\8fà¦\95à¦\9fি à¦²à¦¿à¦\82à¦\95 à¦\85নà§\81সরণ à¦\95রà¦\9bà§\87ন, à¦¯à¦¾ à¦¨à§\87à¦\87।\nপাতাà¦\9fি à¦¤à§\88রি à¦\95রতà§\87, à¦¨à¦¿à¦\9aà§\87র à¦¬à¦¾à¦\95à§\8dসà§\87 à¦¤à¦¾ à¦\9fাà¦\87প à¦\95রা à¦¶à§\81রà§\81 à¦\95রà§\81ন (à¦\86রà¦\93 à¦¤à¦¥à§\8dয à¦\9cানতà§\87 [$1 à¦¸à¦¹à¦¾à¦¯à¦¼à¦¿à¦\95া à¦ªà¦¾à¦¤à¦¾] à¦¦à§\87à¦\96à§\81ন)।\nà¦\86পনি à¦¯à¦¦à¦¿ à¦­à§\81ল à¦\95রà§\87 à¦\8fà¦\96ানà§\87 à¦\8fসà§\87 à¦¥à¦¾à¦\95à§\87ন, à¦¤à¦¾à¦¹à¦²à§\87 à¦\86পনার à¦¬à§\8dরাà¦\89à¦\9cারà§\87র '''back''' à¦¬à§\8bতাম ক্লিক করুন।",
+       "newarticletext": "à¦\86পনি à¦\8fমন à¦\8fà¦\95à¦\9fি à¦ªà¦¾à¦¤à¦¾à¦° à¦¸à¦\82যà§\8bà¦\97 à¦\85নà§\81সরণ à¦\95রà¦\9bà§\87ন, à¦¯à¦¾à¦° à¦\85সà§\8dতিসà§\8dত à¦¨à§\87à¦\87।\nপাতাà¦\9fি à¦¤à§\88রি à¦\95রতà§\87, à¦¨à¦¿à¦\9aà§\87র à¦¬à¦¾à¦\95à§\8dসà§\87 à¦¤à¦¾ à¦\9fাà¦\87প à¦\95রা à¦¶à§\81রà§\81 à¦\95রà§\81ন (à¦\86রà¦\93 à¦¤à¦¥à§\8dয à¦\9cানতà§\87 [$1 à¦¸à¦¹à¦¾à¦¯à¦¼à¦¿à¦\95া à¦ªà¦¾à¦¤à¦¾] à¦¦à§\87à¦\96à§\81ন)।\nà¦\86পনি à¦¯à¦¦à¦¿ à¦­à§\81ল à¦\95রà§\87 à¦\8fà¦\96ানà§\87 à¦\8fসà§\87 à¦¥à¦¾à¦\95à§\87ন, à¦¤à¦¾à¦¹à¦²à§\87 à¦\86পনার à¦¬à§\8dরাà¦\89à¦\9cারà§\87র <strong>পিà¦\9bন</strong> à¦¬à§\8bতামà§\87 ক্লিক করুন।",
        "anontalkpagetext": "----\n<em>এটি একটি বেনামী ব্যবহারকারীর আলাপের পাতা, যিনি এখনও কোন অ্যাকাউন্ট তৈরি করেননি, কিংবা তিনি অ্যাকাউন্টটি ব্যবহার করছেন না।</em>\nআমরা তাই সাংখ্যিক আইপি ঠিকানা ব্যবহার করে তাঁকে শনাক্ত করছি।\nএকাধিক ব্যবহারকারী এরকম একটি আইপি ঠিকানা ব্যবহার করতে পারেন।\nআপনি যদি একজন বেনামী ব্যবহারকারী হয়ে থাকেন এবং যদি অনুভব করেন যে আপনার প্রতি অপ্রাসঙ্গিক মন্তব্য করা হয়েছে, তাহলে অন্যান্য বেনামী ব্যবহারকারীর সাথে ভবিষ্যতে বিভ্রান্তি এড়াতে অনুগ্রহ করে [[Special:CreateAccount|একটি অ্যাকাউন্ট তৈরি করুন]] অথবা  [[Special:UserLogin|অ্যাকাউন্টে প্রবেশ করুন]]।",
        "noarticletext": "বর্তমানে এই পাতায় কোন লেখা নেই।\nআপনি চাইলে অন্যান্য পাতায় [[Special:Search/{{PAGENAME}}| এই শিরোনামটি অনুসন্ধান করতে পারেন]],\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} এ সম্পর্কিত লগ অনুসন্ধান করতে পারেন], \nকিংবা [{{fullurl:{{FULLPAGENAME}}|action=edit}} এই পাতাটি তৈরি করতে পারেন]</span>।",
        "noarticletext-nopermission": "বর্তমানে এই পাতায় কোন লেখা নেই।\nআপনি চাইলে অন্য পাতায় [[Special:Search/{{PAGENAME}}| শিরোনামটি অনুসন্ধান করতে পারেন]], অথবা <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": "à¦\8fà¦\87 à¦¬à§\8dযবহারà¦\95ারà§\80 à¦¬à¦°à§\8dতমানà§\87 à¦¬à§\8dলà¦\95 à¦°à¦¯à¦¼à§\87à¦\9bà§\87।\nরà§\87ফারà§\87নà§\8dসà§\87র à¦\9cনà§\8dয à¦¸à¦¾à¦®à§\8dপà§\8dরতিà¦\95 à¦¬à§\8dলà¦\95 à¦²à¦\97 à¦­à§\81à¦\95à§\8dতি নিচে দেওয়া হল:",
+       "blocked-notice-logextract": "à¦\8fà¦\87 à¦¬à§\8dযবহারà¦\95ারà§\80 à¦¬à¦°à§\8dতমানà§\87 à¦\85বরà§\81দà§\8dধ à¦°à¦¯à¦¼à§\87à¦\9bà§\87ন।\nসà§\82তà§\8dরà§\87র à¦\9cনà§\8dয à¦¸à¦¾à¦®à§\8dপà§\8dরতিà¦\95 à¦¬à¦¾à¦§à¦¾à¦¦à¦¾à¦¨ à¦²à¦\97à§\87র à¦­à§\81à¦\95à§\8dতিà¦\9fি নিচে দেওয়া হল:",
        "clearyourcache": "<strong>লক্ষ্য করুন:</strong> সংরক্ষণের পর, পরিবর্তনগুলো দেখতে আপনাকে আপনার ব্রাউজারের ক্যাশে পরিষ্কার করার প্রয়োজন হতে পারে।\n* <strong>ফায়ারফক্স / সাফারি:</strong> <em>Shift</em> ধরে রাখা অবস্থায়<em>পুনঃলোড করুন</em>-এ ক্লিক করুন, অথবা <em>Ctrl-F5</em> বা <em>Ctrl-R</em> (ম্যাক-এ <em>⌘-R</em>) চাপুন\n* <strong>গুগল ক্রোম:</strong> <em>Ctrl-Shift-R</em> (ম্যাক-এ <em>⌘-Shift-R</em>) চাপুন\n* <strong>ইন্টারনেট এক্সপ্লোরার:</strong> <em>Ctrl</em> ধরে রাখা অবস্থায় <em>Refresh</em>-এ ক্লিক করুন, অথবা <em>Ctrl-F5</em> চাপুন\n* <strong>অপেরা:</strong> <em>মেনু → ব্যবস্থাপনাসমূহ</em>-এ যান (ম্যাকে <em>অপেরা → পছন্দসমূহ</em>) এবং এরপর <em>গোপনীয়তা ও সুরক্ষা → ব্রাউজিং-এর তথ্য পরিষ্কার করুন → ক্যাশে করা ছবি ও ফাইলগুলি</em>।",
        "usercssyoucanpreview": "'''পরামর্শ:''' \"{{int:showpreview}}\" বোতাম ব্যবহার করে সংরক্ষণের আগে আপনার নতুন CSS পরীক্ষা করুন।",
        "userjsyoucanpreview": "'''পরামর্শ:''' \"{{int:showpreview}}\" বোতাম ব্যবহার করে সংরক্ষণের আগে আপনার নতুন JavaScript পরীক্ষা করুন।",
        "continue-editing": "সম্পাদনা করুন",
        "previewconflict": "এই প্রাকদর্শনটি সম্পাদনা ক্ষেত্রের উপরের অংশটির টেক্সট সংরক্ষণ করলে যেরকম দেখাবে, তা দেখাচ্ছে।",
        "session_fail_preview": "দুঃখিত! সেশন ডাটা হারিয়ে যাওয়ার কারণে আপনার সম্পাদনাটি সংরক্ষণ করা সম্ভব হয়নি।\n\nআপনি সম্ভবত সংযোগ হারিয়েছন। <strong>দয়া করে যাচাই করুন যে আপনি এখনও প্রবেশরত রয়েছেন এবং আবার চেষ্টা করুন</strong>। যদি এটি এখনও কাজ না করে, তাহলে দয়া করে [[Special:UserLogout|অ্যাকাউন্ট থেকে প্রস্থান করুন]] এবং আবার অ্যাকাউন্টে প্রবেশ করে চেষ্টা করুন এবং এবং পরীক্ষা করুন যে আপনার ব্রাউজার এই সাইটে কুকি ব্যবহারের অনুমতি দেয়।",
-       "session_fail_preview_html": "দুঃখিত! সেশন উপাত্ত হারিয়ে যাওয়ার কারণে আমরা আপনার সম্পাদনাটি প্রক্রিয়া করতে পারিনি।\n\n<em>{{SITENAME}}-এ raw HTML সক্রিয় আছে বলে জাভাস্ক্রিপ্ট ভিত্তিক আক্রমণ থেকে প্রতিরক্ষার জন্য প্রাকদর্শনটি দেখানো হচ্ছে না।</em>\n\n<strong>যদি এটি সম্পাদনার একটি বৈধ প্রচেষ্টা হয়, তবে অনুগ্রহ করে আবার চেষ্টা করুন।</strong>\nযদি তারপরেও কাজ না হয়, তবে অ্যাকাউন্ট থেকে [[Special:UserLogout|বেরিয়ে গিয়ে]] আবার প্রবেশ করুন, এবং পরীক্ষা করে দেখুন যে আপনার ব্রাউজারে এই সাইট থেকে কুকি অনুমতি দেয়।",
+       "session_fail_preview_html": "দুঃখিত! সেশনের উপাত্ত হারিয়ে যাওয়ার কারণে আমরা আপনার সম্পাদনাটি প্রক্রিয়াভুক্ত করতে পারিনি।\n\n<em>{{SITENAME}}-এ raw HTML সক্রিয় আছে বলে জাভাস্ক্রিপ্ট ভিত্তিক আক্রমণ থেকে প্রতিরক্ষার জন্য প্রাকদর্শনটি দেখানো হচ্ছে না।</em>\n\n<strong>যদি এটি সম্পাদনার একটি বৈধ প্রচেষ্টা হয়, তবে অনুগ্রহ করে আবার চেষ্টা করুন।</strong>\nযদি তারপরেও কাজ না হয়, তবে অ্যাকাউন্ট থেকে [[Special:UserLogout|বেরিয়ে গিয়ে]] আবার প্রবেশ করুন, এবং পরীক্ষা করে দেখুন যে আপনার ব্রাউজারে এই সাইট থেকে কুকি রাখার অনুমতি আছে কি না।",
        "token_suffix_mismatch": "'''আপনার সম্পাদনাটি প্রত্যাখ্যান করা হয়েছে, কারণ আপনার ক্লায়েন্ট প্রোগ্রামটি সম্পাদনা টেক্সটের বিরামচিহ্নগুলি গুলিয়ে ফেলেছে। পাতাটির টেক্সটে যাতে ক্ষতি না হয় সেজন্য সম্পাদনাটি প্রত্যাখ্যান করা হয়েছে। আপনি কোন ত্রুটিপূর্ণ ওয়েব-ভিত্তিক বেনামী প্রক্সি সেবা ব্যবহার করলে এরকম হতে পারে।'''",
        "edit_form_incomplete": "'''আপনার সম্পাদনার কিছু অংশ সার্ভারে পৌছায় নি; আপনার সম্পাদনা সম্পূর্ণরুপে আছে কিনা নিশ্চিত হয়ে আবার চেষ্টা করুন'''",
        "editing": "সম্পাদনা করছেন: $1",
        "editingsection": "সম্পাদনা করছেন $1 (অনুচ্ছেদ)",
        "editingcomment": "সম্পাদনা করছেন $1 (নতুন অনুচ্ছেদ)",
        "editconflict": "সম্পাদনা দ্বন্দ্ব: $1",
-       "explainconflict": "à¦\86পনি à¦ªà¦¾à¦¤à¦¾à¦\9fি à¦¸à¦®à§\8dপাদনা à¦¶à§\81রà§\81 à¦\95রার à¦ªà¦° à¦\85নà§\8dয à¦\95à§\87à¦\89 à¦ªà¦¾à¦¤à¦¾à¦\9fিতà§\87 à¦ªà¦°à¦¿à¦¬à¦°à§\8dতন à¦\8fনà§\87à¦\9bà§\87।\nà¦\9fà§\87à¦\95à§\8dসà¦\9f à¦\8fলাà¦\95ার à¦\89পরà§\87র à¦\85à¦\82শà§\87 à¦¬à¦°à§\8dতমানà§\87 à¦\9fà§\87à¦\95à§\8dসà¦\9f à¦¯à§\87ভাবà§\87 à¦\86à¦\9bà§\87, à¦¤à¦¾ à¦¦à§\87à¦\96ানà§\8b à¦¹à¦¯à¦¼à§\87à¦\9bà§\87।\nà¦\86পনার à¦ªà¦°à¦¿à¦¬à¦°à§\8dতনà¦\97à§\81লি à¦\9fà§\87à¦\95à§\8dসà¦\9f à¦\8fলাà¦\95ার à¦¨à¦¿à¦\9aà§\87র à¦\85à¦\82শà§\87 à¦¦à§\87à¦\96ানà§\8b à¦¹à¦¯à¦¼à§\87à¦\9bà§\87।\nà¦\86পনাà¦\95à§\87 à¦\86পনার à¦ªà¦°à¦¿à¦¬à¦°à§\8dতনà¦\97à§\81লি à¦¬à¦°à§\8dতমানà§\87 à¦¬à¦¿à¦¦à§\8dযমান à¦\9fà§\87à¦\95à§\8dসà¦\9fà§\87র à¦¸à¦¾à¦¥à§\87 à¦®à¦¿à¦²à¦¿à¦¯à¦¼à§\87 à¦¦à¦¿à¦¤à§\87 à¦¹à¦¬à§\87।\nà¦\86পনি \"সà¦\82রà¦\95à§\8dষণ\" à¦\9aাপলà§\87 '''শà§\81ধà§\81মাতà§\8dর''' à¦\9fà§\87à¦\95à§\8dসà¦\9f এলাকার উপরের অংশটি সংরক্ষিত হবে।",
+       "explainconflict": "à¦\86পনি à¦ªà¦¾à¦¤à¦¾à¦\9fি à¦¸à¦®à§\8dপাদনা à¦¶à§\81রà§\81 à¦\95রার à¦ªà¦° à¦\85নà§\8dয à¦\95à§\87à¦\89 à¦ªà¦¾à¦¤à¦¾à¦\9fিতà§\87 à¦ªà¦°à¦¿à¦¬à¦°à§\8dতন à¦\8fনà§\87à¦\9bà§\87।\nপাঠà§\8dয à¦\8fলাà¦\95ার à¦\89পরà§\87র à¦\85à¦\82শà§\87 à¦¬à¦°à§\8dতমানà§\87 à¦ªà¦¾à¦  à¦¯à§\87ভাবà§\87 à¦\86à¦\9bà§\87 à¦¤à¦¾ à¦¦à§\87à¦\96ানà§\8b à¦¹à¦¯à¦¼à§\87à¦\9bà§\87।\nà¦\86পনার à¦ªà¦°à¦¿à¦¬à¦°à§\8dতনà¦\97à§\81লি à¦ªà¦¾à¦ à§\8dয à¦\8fলাà¦\95ার à¦¨à¦¿à¦\9aà§\87র à¦\85à¦\82শà§\87 à¦¦à§\87à¦\96ানà§\8b à¦¹à¦¯à¦¼à§\87à¦\9bà§\87।\nà¦\86পনাà¦\95à§\87 à¦\86পনার à¦ªà¦°à¦¿à¦¬à¦°à§\8dতনà¦\97à§\81লি à¦¬à¦°à§\8dতমানà§\87 à¦¬à¦¿à¦¦à§\8dযমান à¦ªà¦¾à¦ à§\8dযà§\87র à¦¸à¦¾à¦¥à§\87 à¦®à¦¿à¦²à¦¿à¦¯à¦¼à§\87 à¦¦à¦¿à¦¤à§\87 à¦¹à¦¬à§\87।\nà¦\86পনি \"{{int:savearticle}}\" à¦\9aাপলà§\87 <strong>শà§\81ধà§\81মাতà§\8dর</strong> à¦ªà¦¾à¦ à§\8dয এলাকার উপরের অংশটি সংরক্ষিত হবে।",
        "yourtext": "আপনার লেখা বিষয়বস্তু",
        "storedversion": "সংরক্ষিত সংস্করণ",
        "nonunicodebrowser": "'''সতর্কীকরণ: আপনার ব্রাউজার ইউনিকোড-বন্ধুভাবাপন্ন নয়। আপনি যাতে বিপদ ছাড়াই পাতা সম্পাদনা করতে পারেন, সে জন্য সমাধান আছে: অ-আস্কি ক্যারেক্টারগুলি হেক্সাডেসিমাল কোড হিসেবে দেখানো হবে।'''",
        "copyrightwarning2": "অনুগ্রহ করে লক্ষ করুন: {{SITENAME}}-এর এই ভুক্তিতে আপনার লেখা বা অবদান অন্যান্য ব্যবহারকারীরা পরিবর্তন বা পরিবর্ধন করতে, এমনকি মুছে ফেলতে পারবেন। {{SITENAME}} এ আপনার সকল লেখালেখি/অবদান গনু ফ্রি ডকুমেন্টেশনের ($1) আওতায় বিনামূল্যে প্রাপ্য ও হস্তান্তরযোগ্য। আপনার জমা দেয়া লেখা যে কেউ হৃদয়হীনভাবে সম্পাদনা করতে এবং যথেচ্ছভাবে ব্যবহার করতে পারেন। আপনি যদি এ ব্যাপারে একমত না হন, তাহলে এখানে আপনার লেখা জমা দেবেন না। আপনি আরো প্রতিজ্ঞা করছেন যে, এই লেখাগুলো আপনি নিজে লিখেছেন (তবে কোন মৌলিক গবেষণা নয়) বা সাধারণের ব্যবহারের জন্য উন্মুক্ত কোন উৎস থেকে সংগ্রহ করেছেন। '''স্বত্ব সংরক্ষিত কোন লেখা স্বত্বাধিকারীর অনুমতি ছাড়া এখানে জমা দেবেন না।'''",
        "editpage-cannot-use-custom-model": "এই পাতার বিষয়বস্তুর রূপ পরিবর্তন করা যাবে না।",
        "longpageerror": "'''ত্রুটি:  আপনার জমা দেয়া টেক্সটের পরিমাণ {{PLURAL:$1|এক কিলোবাইট|$1 কিলোবাইট}}, যা সর্বোচ্চ সীমা {{PLURAL:$2|এক কিলোবাইটের|$2 কিলোবাইটের}} চেয়ে বেশি।'''\nএটি সংরক্ষণ করা সম্ভব নয়।",
-       "readonlywarning": "<strong>সতরà§\8dà¦\95à§\80à¦\95রণ: à¦°à¦\95à§\8dষণাবà§\87à¦\95à§\8dষণà§\87র à¦\9cনà§\8dয à¦¡à¦¾à¦\9fাবà§\87à¦\9c à¦\85বরà§\81দà§\8dধ à¦°à¦¾à¦\96া à¦¹à¦¯à¦¼à§\87à¦\9bà§\87, à¦¤à¦¾à¦\87 à¦\8fà¦\87 à¦®à§\81হà§\82রà§\8dতà§\87 à¦\86পনি à¦\86পনার à¦¸à¦®à§\8dপাদনা à¦¸à¦\82রà¦\95à§\8dষণ à¦\95রতà§\87 à¦ªà¦¾à¦°à¦¬à§\87ন à¦¨à¦¾à¥¤</strong>\nà¦\86পনি à¦\9aাà¦\87লà§\87 à¦²à§\87à¦\96াà¦\9fি à¦\85নà§\81লিপি à¦\95রà§\87 à¦\93 à¦\95à§\8bন à¦\9fà§\87à¦\95à§\8dসà¦\9f à¦«à¦¾à¦\87লà§\87 à¦ªà§\8dরতিলà§\87পন à¦\95রার à¦¦à§\8dবারা à¦­à¦¬à¦¿à¦·à§\8dযতà§\87র à¦\9cনà§\8dয à¦¸à¦\82রà¦\95à§\8dষণ à¦\95রতà§\87 à¦ªà¦¾à¦°à§\87ন।\n\nসিসà§\8dà¦\9fà§\87ম à¦ªà§\8dরশাসà¦\95 à¦¯à¦¿à¦¨à¦¿ à¦\8fà¦\9fি à¦¬à¦¨্ধ করেছেন তিনি এই ব্যাখ্যা দিয়েছেন: $1",
+       "readonlywarning": "<strong>সতরà§\8dà¦\95বারà§\8dতা: à¦°à¦\95à§\8dষণাবà§\87à¦\95à§\8dষণà§\87র à¦\9cনà§\8dয à¦¡à¦¾à¦\9fাবà§\87à¦\9c à¦\85বরà§\81দà§\8dধ à¦°à¦¾à¦\96া à¦¹à¦¯à¦¼à§\87à¦\9bà§\87, à¦¤à¦¾à¦\87 à¦\8fà¦\87 à¦®à§\81হà§\82রà§\8dতà§\87 à¦\86পনি à¦\86পনার à¦¸à¦®à§\8dপাদনা à¦¸à¦\82রà¦\95à§\8dষণ à¦\95রতà§\87 à¦ªà¦¾à¦°à¦¬à§\87ন à¦¨à¦¾à¥¤</strong>\nà¦\86পনি à¦\9aাà¦\87লà§\87 à¦²à§\87à¦\96াà¦\9fি à¦ªà§\8dরতিলিপি à¦\95রà§\87 à¦\95à§\8bন à¦\9fà§\87à¦\95à§\8dসà¦\9f à¦«à¦¾à¦\87লà§\87 à¦¸à§\87à¦\81à¦\9fà§\87 à¦­à¦¬à¦¿à¦·à§\8dযতà§\87র à¦\9cনà§\8dয à¦¸à¦\82রà¦\95à§\8dষণ à¦\95রতà§\87 à¦ªà¦¾à¦°à§\87ন।\n\nযà§\87 à¦¸à¦¿à¦¸à§\8dà¦\9fà§\87ম à¦ªà§\8dরশাসà¦\95 à¦¡à¦¾à¦\9fাবà§\87à¦\9cà¦\9fি  à¦\85বরà§\81দ্ধ করেছেন তিনি এই ব্যাখ্যা দিয়েছেন: $1",
        "protectedpagewarning": "'''সতর্কীকরণ: এই পাতাটি বন্ধ করা হয়েছে; কেবলমাত্র প্রশাসক মর্যাদার ব্যবহারকারীরাই এটি সম্পাদনা করতে পারবেন।'''\nআপনার সুবিধার্থে পাতাটির সাম্প্রতিক সংরক্ষণ লগের বিবরণ নিচে দেওয়া হলো।",
        "semiprotectedpagewarning": "'''নোট:''' এই পাতাটির ব্যবহার নিয়ন্ত্রণ করা হয়েছে তাই নিবন্ধনকৃত ব্যবহারকারী এটি সম্পাদনা করতে পারবেন।\nআপনার সুবিধার্থে পাতাটির সাম্প্রতিক সংরক্ষণ লগের বিবরণ নিচে দেওয়া হলো।",
        "cascadeprotectedwarning": "<strong>সতর্কীকরণ:</strong> এই পাতাটি সুরক্ষিত, ফলে এটি শুধুমাত্র প্রশাসক অধিকারপ্রাপ্ত ব্যবহারকারীগণ সম্পাদনা করতে পারেন, কারণ এটি নিচের প্রপাতাকার-সুরক্ষিত {{PLURAL:$1|পাতায়|পাতাসমূহে}} অন্তর্ভুক্ত আছে:",
        "edittools": "<!-- সম্পাদনা এবং আপলোড ফরমের নীচে এখানের লেখা দেখানো হবে। -->",
        "edittools-upload": "-",
        "nocreatetext": "{{SITENAME}}-এ নতুন পাতা সৃষ্টি করার ক্ষমতা সীমাবদ্ধ করা হয়েছে।\nআপনি ফিরে গিয়ে ইতিমধ্যে বিদ্যমান কোন পাতা সম্পাদনা করতে পারেন, অথবা [[Special:UserLogin|অ্যাকাউন্টে প্রবেশ কিংবা অ্যাকাউন্ট সৃষ্টি করতে পারেন]]।",
-       "nocreate-loggedin": "নতà§\81ন à¦ªà¦¾à¦¤à¦¾ à¦¤à§\88রিতà§\87 à¦\86পনাà¦\95à§\87 à¦\85নà§\81মà§\8bতি à¦¦à§\87à¦\93য়া à¦¹à¦¯à¦¼à¦¨à¦¿।",
+       "nocreate-loggedin": "à¦\86পনার à¦¨à¦¤à§\81ন à¦ªà¦¾à¦¤à¦¾ à¦¤à§\88রি à¦\95রার à¦\85নà§\81মà§\8bদন à¦¨à§\87à¦\87।",
        "sectioneditnotsupported-title": "অনুচ্ছেদ সম্পাদনা সমর্থন করে না",
        "sectioneditnotsupported-text": "এই সম্পাদনা পাতায় অনুচ্ছেদ সম্পাদনা সমর্থন করে না",
        "permissionserrors": "অনুমতি ত্রুটিসমূহ",
-       "permissionserrorstext": "à¦\86পনার à¦\8fà¦\9fা à¦\95রার à¦\85নà§\81মতি à¦¨à§\87à¦\87, à¦¨à¦¿à¦\9aà§\87র {{PLURAL:$1|à¦\9fি à¦\95ারণà§\87র|à¦\9fি à¦\95ারণà§\87র}} à¦\9cনà§\8dয:",
-       "permissionserrorstext-withaction": "আপনার $2 অনুমতি নেই, যার {{PLURAL:$1|কারণ|কারণসমূহ}} হল:",
+       "permissionserrorstext": "নিনà§\8dমলিà¦\96িত {{PLURAL:$1|à¦\95ারণà¦\9fির|à¦\95ারণà¦\97à§\81লির}} à¦\9cনà§\8dয à¦\86পনার à¦\8fà¦\9fা à¦\95রার à¦\85নà§\81মতি à¦¨à§\87à¦\87:",
+       "permissionserrorstext-withaction": "আপনার $2 অনুমতি নেই, যার {{PLURAL:$1|কারণটি|কারণগুলি}} হল:",
        "contentmodelediterror": "আপনি এই পুনর্বিবেচনা সম্পাদনা করতে পারবেন না কারণ এর বিষয়বস্তু মডেল <code>$1</code>, যা বর্তমান বিষয়বস্তু মডেল <code>$2</code>-এর থেকে ভিন্ন।",
        "recreate-moveddeleted-warn": "'''সতর্কীকরণ: আপনি এমন একটি পাতা পুনরায় তৈরি করছেন যা পূর্বে অপসারণ করা হয়েছিল।'''\n\nআপনি পাতাটি সম্পাদনা চালিয়ে যাওয়া ঠিক হবে কিনা, তা বিবেচনা করুন।\nআপনার সুবিধার্থে পাতাটির অপলুপ্তি লগ এখানে দেয়া হলো:",
        "moveddeleted-notice": "এই পাতাটি অপসারণ করা হয়েছে।\nসূত্র হিসেবে নিচে এ পাতার অবলুপ্তি লগ দেওয়া হলো।",
        "moveddeleted-notice-recent": "দুঃখিত, এই পাতাটি সাম্প্রতি অপসারিত হয়েছে (সর্বশেষ ২৪ ঘণ্টায়)।\nসূত্র হিসেবে নিচে এই পাতা অপসারণ ও স্থানান্তর লগ দেয়া হয়েছে।",
-       "log-fulllog": "সমà§\8dপà§\82রà§\8dণ à¦²à¦\97 à¦¦à§\87à¦\96াà¦\93",
+       "log-fulllog": "সমà§\8dপà§\82রà§\8dণ à¦²à¦\97 à¦¦à§\87à¦\96à§\81ন",
        "edit-hook-aborted": "হূক দ্বারা সম্পাদনা পরিত্যক্ত হয়েছে।\nএর কোন ব্যাখ্যা নাই।",
        "edit-gone-missing": "পাতাটি হালনাগাদ হয়নি।\nসম্ভবতঃ পাতাটি মুছে ফেলা হয়েছে।",
        "edit-conflict": "সম্পাদনা সংঘাত।",
        "edit-no-change": "আপনার সম্পাদনাটি উপেক্ষা করা হয়েছে, কারণ লেখাতে কোনো পরিবর্তন করা হয়নি।",
-       "postedit-confirmation-created": "পাতাটি তৈরি হয়েছে।",
+       "postedit-confirmation-created": "পাতাà¦\9fি à¦¤à§\88রি à¦\95রা à¦¹à¦¯à¦¼à§\87à¦\9bà§\87।",
        "postedit-confirmation-restored": "পাতাটি পুনরুদ্ধার করা হয়েছে।",
        "postedit-confirmation-saved": "আপনার সম্পাদনা সংরক্ষিত হয়েছে।",
        "edit-already-exists": "নতুন পাতা সৃষ্টি করা যায়নি।\nপাতাটি ইতিমধ্যেই বিদ্যমান।",
        "post-expand-template-argument-warning": "' ' ' সাবধান: ' ' ' এই পাতাটিতে অন্তত একটি ফর্মা যুক্তি আছে যা একটি খুব বড় বিস্তার আকার ধারণ করেছে।\nতাই এই আর্গুমেন্টটি বাদ দেওয়া হয়েছে।",
        "post-expand-template-argument-category": "বাদ ফর্মা আর্গুমেন্ট ধারণকারী পাতা",
        "parser-template-loop-warning": "টেমপ্লেট লুপ সনাক্ত হয়েছে: [[$1]]",
-       "parser-template-recursion-depth-warning": "টেমপ্লেট পুনরাবৃত্তি (রিকার্শন) ডেপথ্‌ সীমা অতক্রম করেছে ($1)",
-       "language-converter-depth-warning": "ভাষা পরিবর্তন ডেপথ্‌ সীমা অতক্রম করেছে ($1)",
+       "template-loop-category": "টেমপ্লেট লুপসহ পাতা",
+       "template-loop-category-desc": "এই পাতায় একটি টেমপ্লেট লুপ আছে, অর্থাৎ এটি এমন একটি টেমপ্লেট যা নিজেকেই পুনরাবৃত্তভাবে আহ্বান করে।",
+       "parser-template-recursion-depth-warning": "টেমপ্লেট পুনরাবৃত্তি (রিকার্শন) গভীরতা সীমা অতক্রম করেছে ($1)",
+       "language-converter-depth-warning": "ভাষা পরিবর্তন গভীরতা সীমা অতক্রম করেছে ($1)",
        "node-count-exceeded-category": "যে সকল পাতার নোড কাউন্ট সীমানা পার হয়েছে",
        "node-count-exceeded-category-desc": "পাতার সর্বোচ্চ নোড কাউন্ট সীমানা অতিক্রম করেছে।",
        "node-count-exceeded-warning": "পাতাটি নোড কাউন্ট সীমানা পার করেছে",
        "expansion-depth-exceeded-warning": "পাতাটি এক্সেপশন সীমানা অতিক্রম করেছে",
        "parser-unstrip-loop-warning": "ত্রুটিপূর্ণ লুপ খুঁজে পাওয়া গিয়েছে",
        "parser-unstrip-recursion-limit": "লুপ রিকারশন সীমানা অতিক্রম করেছে ($1)",
-       "converter-manual-rule-error": "ভাষা à¦ªà¦°à¦¿à¦¬à¦°à§\8dতন à¦°à§\81লে ত্রুটি পাওয়া গিয়েছে",
+       "converter-manual-rule-error": "মà§\8dযানà§\81য়াল à¦­à¦¾à¦·à¦¾ à¦°à§\82পানà§\8dতর à¦¨à¦¿à¦¯à¦¼à¦®ে ত্রুটি পাওয়া গিয়েছে",
        "undo-success": "সম্পাদনাটি বাতিল করা যাবে। অনুগ্রহ করে নিচের তুলনাটি পরীক্ষা করে দেখুন ও নিশ্চিত করুন যে এটাই আপনি করতে চান, এবং তারপর নিচের সম্পাদনাগুলি সংরক্ষণ করে সম্পাদনাটির বাতিল প্রক্রিয়া সমাপ্ত করুন।",
        "undo-failure": "এ সম্পাদনা মধ্যবর্তী সম্পাদনাসমূহের কারণে পূর্বাবস্থায় ফিরিয়ে নেওয়া যাবে না।",
        "undo-norev": "সম্পাদনাটি বাতিল করা যাচ্ছেনা কারণ এটি আর নেই বা মুছে ফেলা হয়েছে।",
        "undo-nochange": "সম্পাদনাটি পূর্বেই বাতিল করা হয়েছে।",
        "undo-summary": "[[Special:Contributions/$2|$2]] ([[User talk:$2|আলাপ]])-এর সম্পাদিত $1 নম্বর সংশোধনটি বাতিল করা হয়েছে",
-       "undo-summary-username-hidden": "à¦\8fà¦\95à¦\9cন à¦²à§\81à¦\95ানà§\8b à¦¬à§\8dযবহারà¦\95ারà§\80 $1 à¦¸à¦\82শà§\8bধন à¦ªà§\81নরায় à¦«à¦¿à¦°à¦¿à¦¯à¦¼à§\87 à¦\8fনà§\87à¦\9bà§\87ন",
+       "undo-summary-username-hidden": "à¦\8fà¦\95à¦\9cন à¦²à§\81à¦\95ায়িত à¦¬à§\8dযবহারà¦\95ারà§\80র à¦\95রা $1 à¦¨à¦\82 à¦¸à¦\82শà§\8bধনà¦\9fি à¦¬à¦¾à¦¤à¦¿à¦² à¦\95রা à¦¹à¦¯à¦¼à§\87à¦\9bà§\87",
        "cantcreateaccount-text": "[[User:$3|$3]] এই আইপি ঠিকানা('''$1''') থেকে অ্যাকাউন্ট সৃষ্টিতে বাধা দিয়েছেন।\n\n$3-এর দেয়া কারণ হল ''$2''",
        "cantcreateaccount-range-text": "[[User:$3|$3]] কর্তৃক আইপি ঠিকানার ব্যাপ্তি <strong>$1</strong>-এর মধ্যে অ্যাকাউন্ট তৈরি করা অবরুদ্ধ করা হয়েছে। যাতে আপনার আইপি ঠিকানাও (<strong>$4</strong>) রয়েছে। \n\n$3 কর্তৃক <em>$2</em> কারণ দেখানো হয়েছে।",
        "viewpagelogs": "এই পাতার জন্য লগগুলো দেখুন",
        "nohistory": "এই পাতার কোন সম্পাদনার ইতিহাস নেই।",
        "currentrev": "সর্বশেষ সংস্করণ",
-       "currentrev-asof": "$1 à¦¤à¦¾à¦°à¦¿à¦\96à§\87 à¦¸à¦®à§\8dপাদিত à¦¬à¦°à§\8dতমান সংস্করণ",
-       "revisionasof": "$1 তারিখে সংস্করণ",
-       "revision-info": "$2 কর্তৃক $1 পর্যন্ত সংস্করণে $7",
-       "previousrevision": "←পুর্বের সংস্করণ",
-       "nextrevision": "পরবর্তী সংস্করণ→",
+       "currentrev-asof": "$1 à¦¤à¦¾à¦°à¦¿à¦\96à§\87 à¦¸à¦®à§\8dপাদিত à¦¸à¦°à§\8dবশà§\87ষ সংস্করণ",
+       "revisionasof": "$1 তারিখে সংশোধিত সংস্করণ",
+       "revision-info": "{{GENDER:$6|$2}} কর্তৃক $1 তারিখে সংশোধিত সংস্করণ$7",
+       "previousrevision": "← পূর্বের সংস্করণ",
+       "nextrevision": "পরবর্তী সংস্করণ →",
        "currentrevisionlink": "সর্বশেষ সংস্করণ",
        "cur": "বর্তমান",
        "next": "পরবর্তী",
        "last": "পূর্ববর্তী",
        "page_first": "প্রথম",
        "page_last": "শেষ",
-       "histlegend": "পারà§\8dথà¦\95à§\8dয à¦¨à¦¿à¦°à§\8dবাà¦\9aন: à¦¯à§\87 à¦¸à¦\82সà§\8dà¦\95রণà¦\97à§\81লà§\8b à¦¤à§\81লনা à¦\95রতà§\87 à¦\9aান, à¦¸à§\87à¦\97à§\81লà§\8b à¦\9aিহà§\8dনিত à¦\95রà§\87 à¦\8fনà§\8dà¦\9fার à¦¬à¦¾ à¦¨à¦¿à¦\9aà§\87র à¦¬à§\8bতামà¦\9fি à¦\9fিপà§\81ন।<br />\nনিরà§\8dদà§\87শিà¦\95া: (বরà§\8dতমান) = à¦¬à¦°à§\8dতমান à¦¸à¦\82সà§\8dà¦\95রণà§\87র à¦¸à¦¾à¦¥à§\87 à¦ªà¦¾à¦°à§\8dথà¦\95à§\8dয, (পà§\82রà§\8dববরà§\8dতà§\80) =  à¦ªà§\82রà§\8dবà§\87র à¦¸à¦\82সà§\8dà¦\95রণà§\87র à¦¸à¦¾à¦¥à§\87 à¦ªà¦¾à¦°à§\8dথà¦\95à§\8dয, à¦\85 = অনুল্লেখ্য সম্পাদনা।",
-       "history-fieldset-title": "বà§\8dরাà¦\89à¦\9c à¦\87তিহাস",
-       "history-show-deleted": "শà§\81ধà§\81মাতà§\8dর à¦\85পসারণ",
+       "histlegend": "পারà§\8dথà¦\95à§\8dয à¦¨à¦¿à¦°à§\8dবাà¦\9aন: à¦¯à§\87 à¦¸à¦\82সà§\8dà¦\95রণà¦\97à§\81লি à¦¤à§\81লনা à¦\95রতà§\87 à¦\9aান, à¦¸à§\87à¦\97à§\81লি à¦\9aিহà§\8dনিত à¦\95রà§\87 à¦\8fনà§\8dà¦\9fার à¦¬à¦¾ à¦¨à¦¿à¦\9aà§\87র à¦¬à§\8bতামà¦\9fি à¦\9fিপà§\81ন।<br />\nনিরà§\8dদà§\87শিà¦\95া: <strong>({{int:cur}})</strong> = à¦¬à¦°à§\8dতমান à¦¸à¦\82সà§\8dà¦\95রণà§\87র à¦¸à¦¾à¦¥à§\87 à¦ªà¦¾à¦°à§\8dথà¦\95à§\8dয, <strong>({{int:last}})</strong> = à¦ªà§\82রà§\8dবà§\87র à¦¸à¦\82সà§\8dà¦\95রণà§\87র à¦¸à¦¾à¦¥à§\87 à¦ªà¦¾à¦°à§\8dথà¦\95à§\8dয,  <strong>{{int:minoreditletter}}</strong> = অনুল্লেখ্য সম্পাদনা।",
+       "history-fieldset-title": "সà¦\82শà§\8bধিত à¦¸à¦\82সà§\8dà¦\95রণà§\87র à¦\9cনà§\8dয à¦\85নà§\81সনà§\8dধান à¦\95রà§\81ন",
+       "history-show-deleted": "শà§\81ধà§\81মাতà§\8dর à¦\85পসারিত à¦¸à¦\82শà§\8bধন",
        "histfirst": "সবচেয়ে পুরনো",
        "histlast": "সবচেয়ে নতুন",
        "historysize": "({{PLURAL:$1|১ বাইট|$1 বাইট}})",
        "historyempty": "(খালি)",
-       "history-feed-title": "সংশোধন ইতিহাস",
-       "history-feed-description": "এ উইকিতে এই পাতার সংশোধনের ইতিহাস",
+       "history-feed-title": "সংশোধনের ইতিহাস",
+       "history-feed-description": "এ উইকিতে এই পাতার সংশোধনের ইতিহাস",
        "history-feed-item-nocomment": "$2-এ $1",
        "history-feed-empty": "অনুরোধকৃত পাতাটির কোন অস্তিত্ব নেই।\nহয়ত পাতাটি উইকি থেকে মুছে ফেলা হয়েছে, কিংবা নতুন নামকরণ করা হয়েছে।\nপ্রাসঙ্গিক নতুন পাতাগুলির জন্য [[Special:Search|উইকি অনুসন্ধানের]] চেষ্টা করুন।",
        "history-edit-tags": "নির্বাচিত সংশোধনের ট্যাগ সম্পাদনা করুন",
        "rev-deleted-comment": "(সম্পাদনা সারাংশ অপসারিত)",
        "rev-deleted-user": "(ব্যবহারকারীর নাম সরিয়ে নেওয়া হয়েছে)",
        "rev-deleted-event": "(লগ তথ্য সরানো হয়েছে)",
-       "rev-deleted-user-contribs": "ব্যবহারকারীর নাম অথবা আইপি ঠিকানা অপসারিত হয়েছে - অবদান থেকে সম্পাদনা আড়াল করা হয়েছে",
+       "rev-deleted-user-contribs": "[ব্যবহারকারীর নাম অথবা আইপি ঠিকানা সরানো হয়েছে - অবদান থেকে সম্পাদনা লুকিয়ে রাখা হয়েছে]",
        "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": "পাতার এই সংস্করণটি '''অপসারিত''' হয়েছে।\nবিস্তারিত কারণ এর [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} অপসারণ লগে] পাওয়া যেতে পারে।\nআপনি ইচ্ছা পোষণ করলে [$1 এই সংস্করণটি দেখতে পারেন]।",
        "rev-showdeleted": "দেখাও",
        "revisiondelete": "অবলুপ্ত/পুনঃস্থাপন সংশোধনসমূহ",
        "revdelete-nooldid-title": "বেঠিক লক্ষ্য সংশোধন",
-       "revdelete-nooldid-text": "à¦\8fà¦\87 à¦\95াà¦\9cà¦\9fি à¦¸à¦®à§\8dপনà§\8dন à¦\95রার à¦\9cনà§\8dয à¦\86পনি à¦\95à§\8bন à¦²à¦\95à§\8dষà§\8dয à¦¸à¦\82শà§\8bধন à¦¨à¦¿à¦°à§\8dবাà¦\9aন à¦\95রà§\87ননি à¦¯à§\87à¦\96ানà§\87 à¦\8fà¦\87 à¦\95াà¦\9cà¦\9fি à¦¸à¦®à§\8dপাদন à¦\95রা à¦¹à¦¬à§\87, à¦\85থবা à¦¨à¦¿à¦°à§\8dবাà¦\9aিত à¦¸à¦\82শà§\8bধনà¦\9fি à¦¨à§\87à¦\87, à¦\85থবা à¦\86পনি à¦¬à¦°à§\8dতমান à¦¸à¦\82শà§\8bধন à¦\86ড়াল à¦\95রার চেষ্টা করছেন।",
+       "revdelete-nooldid-text": "à¦\8fà¦\87 à¦\95াà¦\9cà¦\9fি à¦¸à¦®à§\8dপনà§\8dন à¦\95রার à¦\9cনà§\8dয à¦\86পনি à¦\95à§\8bন à¦²à¦\95à§\8dষà§\8dয à¦¸à¦\82শà§\8bধন à¦¨à¦¿à¦°à§\8dবাà¦\9aন à¦\95রà§\87ননি à¦¯à§\87à¦\96ানà§\87 à¦\8fà¦\87 à¦\95াà¦\9cà¦\9fি à¦¸à¦®à§\8dপাদন à¦\95রা à¦¹à¦¬à§\87, à¦\85থবা à¦¨à¦¿à¦°à§\8dবাà¦\9aিত à¦¸à¦\82শà§\8bধনà¦\9fি à¦¨à§\87à¦\87, à¦\85থবা à¦\86পনি à¦¬à¦°à§\8dতমান à¦¸à¦\82শà§\8bধন à¦²à§\81à¦\95িয়à§\87 à¦°à¦¾à¦\96ার চেষ্টা করছেন।",
        "revdelete-no-file": "নির্ধারিত ফাইলটি নেই।",
        "revdelete-show-file-confirm": "আপনি কি নিশ্চিত যে \"<nowiki>$1</nowiki>\" ফাইলের $2 তারিখের $3 টার অপসারণ লগ দেখানো হবে?",
        "revdelete-show-file-submit": "হ্যাঁ",
        "revdelete-text-text": "অপসারিত সংস্করণসমূহ এখনও পাতা ইতিহাসে প্রদর্শিত হয়, কিন্তু সেই বিষয়বস্তুর অংশগুলি সর্বসাধারণ দেখতে পারবে না।",
        "revdelete-text-file": "অপসারিত ফাইলের সংস্করণসমূহ এখনও ফাইল ইতিহাসে প্রদর্শিত হয়, কিন্তু সেই বিষয়বস্তুর অংশগুলি সর্বসাধারণ দেখতে পারবে না।",
        "logdelete-text": "অপসারিত লগ ইভেন্টসমূহ এখনও লগে প্রদর্শিত হয়, কিন্তু সেই বিষয়বস্তুর অংশগুলি সর্বসাধারণ দেখতে পারেবে না।",
-       "revdelete-text-others": "à¦\85নà§\8dযানà§\8dয à¦ªà§\8dরশাষà¦\95à¦\97ণ à¦\8fà¦\87 à¦²à§\81à¦\95ানà§\8b à¦¤à¦¥à§\8dয à¦\97à§\81লà§\8b দেখতে পারবেন এবং প্রয়োজনে সেগুলো ফিরিয়ে আনতে পারবেন, যদি অন্যান্য কোনো বাধা না থাকে।",
+       "revdelete-text-others": "à¦\85নà§\8dযানà§\8dয à¦ªà§\8dরশাসà¦\95à§\87রা à¦¤à¦¾à¦° à¦ªà¦°à§\87à¦\93 à¦\8fà¦\87 à¦²à§\81à¦\95ানà§\8b à¦¬à¦¿à¦·à¦¯à¦¼à¦¬à¦¸à§\8dতà§\81à¦\97à§\81লি দেখতে পারবেন এবং প্রয়োজনে সেগুলো ফিরিয়ে আনতে পারবেন, যদি অন্যান্য কোনো বাধা না থাকে।",
        "revdelete-confirm": "অনুগ্রহ করে নিশ্চিত করুন যে আপনি এটি করতে চাচ্ছিলেন, আপনি এর ফলাফল সম্পর্কে অবগত আছেন, এবং [[{{MediaWiki:Policy-url}}|নীতিমালার]] উপর ভিত্তি করেই এই কাজটি করছেন।",
        "revdelete-suppress-text": "নিচের বিষয়গুলোর ক্ষেত্রেই '''কেবলমাত্র'''  চাপাচাপি করা যাবে:\n* সম্ভাব্য মানহানিকর তথ্য\n* ভুল ব্যক্তিগত তথ্য\n*: ''বাসার ঠিকানা এবং ফোন নম্বর, সোসাল সিকিউরিটি নম্বর, ইত্যাদি।''",
        "revdelete-legend": "দৃষ্টিপাত সীমাবদ্ধ করো",
-       "revdelete-hide-text": "সà¦\82সà§\8dà¦\95রণের লেখা",
-       "revdelete-hide-image": "ফাà¦\87লà§\87র à¦¬à¦¿à¦·à¦¯à¦¼à¦¬à¦¸à§\8dতà§\81 à¦\86ড়াল à¦\95রà§\8b",
+       "revdelete-hide-text": "সà¦\82শà§\8bধনের লেখা",
+       "revdelete-hide-image": "ফাà¦\87লà§\87র à¦¬à¦¿à¦·à¦¯à¦¼à¦¬à¦¸à§\8dতà§\81 à¦²à§\81à¦\95িয়à§\87 à¦°à¦¾à¦\96া à¦¹à§\8bà¦\95",
        "revdelete-hide-name": "লক্ষ্য ও প্যারামিটার আড়াল করো",
        "revdelete-hide-comment": "সম্পাদনা সারাংশ",
-       "revdelete-hide-user": "সম্পাদকে ব্যবহারকারীর নাম/আইপি",
+       "revdelete-hide-user": "সম্পাদকের ব্যবহারকারী নাম/আইপি ঠিকানা",
        "revdelete-hide-restricted": "প্রশাসকবৃন্দ এবং অন্যদের ক্ষেত্রে এই ডাটা রোধ করো",
-       "revdelete-radio-same": "পরিবর্তন নয়",
-       "revdelete-radio-set": "লà§\81à¦\95ানà§\8b",
+       "revdelete-radio-same": "(পরিবর্তন করবেন না)",
+       "revdelete-radio-set": "লà§\81à¦\95ায়িত",
        "revdelete-radio-unset": "দৃশ্যমান",
        "revdelete-suppress": "সব প্রশাসক ও অন্যান্যদের কাছ থেকে উপাত্ত লুকিয়ে রাখা হোক।",
        "revdelete-unsuppress": "সংশোধন পুনঃস্থাপনের উপর সীমাবদ্ধতা দূর করো",
        "revdel-restore": "দৃশ্যমানতা পরিবর্তন করো",
        "pagehist": "পাতার ইতিহাস",
        "deletedhist": "ইতিহাস মুছে ফেলো",
-       "revdelete-hide-current": "$2, $1 সময়ের বিষয়টি লুকানো যাচ্ছে না: এটি বর্তমান সংস্করণ।\nএটি লুকানো সম্ভব নয়।",
+       "revdelete-hide-current": "$2 সময় ও $1 তারিখের আইটেমটি লুকানো যাচ্ছে না: এটি বর্তমান সংস্করণ।\nএটি লুকানো সম্ভব নয়।",
        "revdelete-show-no-access": "$2, $1 তারিখের ছবিটি দেখাতে সমস্যা হচ্ছে: এটি ''রেসট্রিটেড'' হিসাবে চিহ্নিত করা রয়েছে।\nআপনার এটি দেখার অনুমতি নেই।",
        "revdelete-modify-no-access": "$2, $1 তারিখের ছবিটি সম্পাদনা করতে সমস্যা হচ্ছে: এটি ''রেসট্রিটেড'' হিসাবে চিহ্নিত করা রয়েছে।\nআপনার এটি দেখার অনুমতি নেই।",
        "revdelete-modify-missing": "$1 আইডি সম্বলিত তথ্যটি সম্পাদনা করা যাচ্ছে না: এটি ডাটাবেজ থেকে হারিয়ে গিয়েছে!",
        "revdelete-edit-reasonlist": "অপসারণের কারণ সম্পাদনা",
        "revdelete-offender": "সংশোধন লেখক:",
        "suppressionlog": "দমন লগ",
-       "suppressionlogtext": "নিà¦\9aà§\87র à¦¤à¦¾à¦²à¦¿à¦\95ায় à¦ªà§\8dরশাসà¦\95দà§\87র à¦¥à§\87à¦\95à§\87 à¦²à§\81à¦\95ানà§\8b à¦°à¦¯à¦¼à§\87à¦\9bà§\87 à¦\8fমন à¦¤à¦¥à§\8dযসহ à¦\85নà§\8dযনà§\8dয অপসারণ এবং বাধাদানের লগ রয়েছে।\nঅনুগ্রহ করে অস্থায়ী ব্যান এবং বাধাদানের লগ সম্পর্কে বিস্তারিত জানতে [[Special:BlockList|বাধাদানের লগ দেখুন]]।",
+       "suppressionlogtext": "নিà¦\9aà§\87র à¦¤à¦¾à¦²à¦¿à¦\95ায় à¦ªà§\8dরশাসà¦\95দà§\87র à¦\95াà¦\9b à¦¥à§\87à¦\95à§\87 à¦²à§\81à¦\95ানà§\8b à¦°à¦¯à¦¼à§\87à¦\9bà§\87 à¦\8fমন à¦¤à¦¥à§\8dযসহ অপসারণ এবং বাধাদানের লগ রয়েছে।\nঅনুগ্রহ করে অস্থায়ী ব্যান এবং বাধাদানের লগ সম্পর্কে বিস্তারিত জানতে [[Special:BlockList|বাধাদানের লগ দেখুন]]।",
        "mergehistory": "পাতার ইতিহাসগুলি একত্র করা হোক",
        "mergehistory-header": "এই পাতাটির মাধ্যমে আপনি একটি উৎস পাতার ইতিহাস একটি নতুনতর পাতার সাথে একত্র করতে পারবেন।\nপাতার ইতিহাসের পারম্পর্য যেন রক্ষা পায়, সে ব্যাপারটি নিশ্চিত করুন।",
        "mergehistory-box": "দুইটি পাতার একত্রীকরণ সংশোধনগুলি:",
        "mergehistory-list": "একীকরণযোগ্য সম্পাদনা ইতিহাস",
        "mergehistory-merge": "[[:$1]]-এর নিচের সংশোধনগুলি [[:$2]]-এর সাথে একত্র করা যাবে। রেডিও বোতাম কলামটি ব্যবহার করে কেবলমাত্র নির্দেশিত সময় ও তার আগের সমস্ত সংশোধন একত্র করুন। লক্ষ্য করুন, পরিভ্রমণ সংযোগ ব্যবহার করলে কলামটি আদি অবস্থায় ফেরত যাবে।",
        "mergehistory-go": "একত্রীকরণযোগ্য সম্পাদনাগুলি দেখানো হোক",
-       "mergehistory-submit": "সংশোধনগুলি একত্র করা হোক",
+       "mergehistory-submit": "সংশোধনগুলি একত্রীত করুন",
        "mergehistory-empty": "কোন সংশোধন একত্র করা যাবে না.",
        "mergehistory-done": "$1-এর $3{{PLURAL:$3|টি সংশোধন}} [[:$2]]-এর সাথে একত্রিত করা হয়েছে।",
        "mergehistory-fail": "ইতিহাস একত্র করা গেল না। অনুগ্রহ করে পাতাটি ও সময়ের প্যারামিটারগুলি আবার পরীক্ষা করে দেখুন।",
        "mergehistory-fail-no-change": "ইতিহাস একত্রীকরণ কোন পুনর্বিবেচনা একত্রিত করে না। দয়া করে পাতা এবং সময় পরামিতি আবার পরীক্ষা করুন।",
        "mergehistory-fail-permission": "ইতিহাস একত্রীকরণের জন্য পর্যাপ্ত অনুমতি নেই।",
        "mergehistory-fail-self-merge": "উৎস এবং গন্তব্য পাতা একই।",
+       "mergehistory-fail-timestamps-overlap": "উৎসের সংশোধনগুলি হয় সম্পূর্ণ আলাদা নয় অথবা ঈপ্সিত সংশোধনগুলির পরে এসেছে।",
        "mergehistory-fail-toobig": "ইতিহাস থেকে আগের পাতাগুলো একীকরণ সম্ভব নয়, কারণ এর ফলে সর্বোচ্চ $1 টি {{PLURAL:$1|সংস্করণ}} স্থানান্তরের সীমানা অতিক্রম করবে।",
        "mergehistory-no-source": "$1 বলে কোন উৎস পাতার অস্তিত্ব নেই।",
        "mergehistory-no-destination": "$1 বলে কোন গন্তব্য পাতার অস্তিত্ব নেই।",
        "mergehistory-invalid-source": "উৎস পাতার অবশ্যই একটি বৈধ শিরোনাম থাকতে হবে।",
        "mergehistory-invalid-destination": "গন্তব্য পাতার একটি বৈধ শিরোনাম থাকতে হবে।",
-       "mergehistory-autocomment": "[[:$1]] à¦\95à§\87 [[:$2]] -à¦\8f à¦\8fà¦\95তà§\8dরà§\80ত করা হয়েছে",
-       "mergehistory-comment": "[[:$1]] à¦\95à§\87 [[:$2]] -à¦\8f à¦\8fà¦\95তà§\8dরà§\80ত করা হয়েছে: $3",
+       "mergehistory-autocomment": "[[:$1]] à¦ªà¦¾à¦¤à¦¾à¦\9fিà¦\95à§\87 [[:$2]] à¦ªà¦¾à¦¤à¦¾à¦\9fির à¦¸à¦¾à¦¥à§\87 à¦\8fà¦\95তà§\8dরিত করা হয়েছে",
+       "mergehistory-comment": "[[:$1]] à¦ªà¦¾à¦¤à¦¾à¦\9fিà¦\95à§\87 [[:$2]] à¦ªà¦¾à¦¤à¦¾à¦\9fির à¦¸à¦¾à¦¥à§\87 à¦\8fà¦\95তà§\8dরিত করা হয়েছে: $3",
        "mergehistory-same-destination": "উৎস এবং গন্তব্য পাতা একই হতে পারবে না",
        "mergehistory-reason": "কারণ:",
        "mergelog": "একত্রীকরণ লগ",
        "revertmerge": "একত্রীকরণ বাতিল",
        "mergelogpagetext": "নিচে সবচেয়ে সাম্প্রতিক ঘটা এক পাতার ইতিহাসের সাথে অন্য পাতার ইতিহাসের একত্রীকরণের একটি তালিকা দেওয়া হল।",
-       "history-title": "\"$1\" à¦\8fর সংশোধনের ইতিহাস",
-       "difference-title": "\"$1\"-এর বিভিন্ন সংস্করণের মধ্যে পার্থক্য",
-       "difference-title-multipage": "\"$1\" ও \"$2\"-পাতার মধ্যে পার্থক্য",
-       "difference-multipage": "পাতাগুলোর মধ্যে পার্থক্য",
+       "history-title": "\"$1\" à¦ªà¦¾à¦¤à¦¾à¦\9fির সংশোধনের ইতিহাস",
+       "difference-title": "\"$1\" পাতাটির দুইটি সংশোধিত সংস্করণের মধ্যে পার্থক্য",
+       "difference-title-multipage": "\"$1\" ও \"$2\" পাতাগুলির মধ্যে পার্থক্য",
+       "difference-multipage": "(পাতাগুলির মধ্যে পার্থক্য)",
        "lineno": "$1 নং লাইন:",
-       "compareselectedversions": "নিরà§\8dবাà¦\9aিত à¦¸à¦\82সà§\8dà¦\95রণà¦\97à§\81লà§\8b à¦¤à§\81লনা à¦\95রà§\8b",
-       "showhideselectedversions": "নিরà§\8dবাà¦\9aিত à¦¸à¦\82শà§\8bধনà¦\97à§\81লà§\8b দেখাও/লুকাও",
-       "editundo": "পà§\82রà§\8dবাবসà§\8dথায় à¦\86নà§\8b",
+       "compareselectedversions": "নিরà§\8dবাà¦\9aিত à¦¸à¦\82শà§\8bধিত à¦¸à¦\82সà§\8dà¦\95রণà¦\97à§\81লির à¦¤à§\81লনা",
+       "showhideselectedversions": "নিরà§\8dবাà¦\9aিত à¦¸à¦\82শà§\8bধনà¦\97à§\81লি দেখাও/লুকাও",
+       "editundo": "পà§\82রà§\8dবাবসà§\8dথায় à¦«à§\87রত",
        "diff-empty": "(কোন পার্থক্য নেই)",
        "diff-multi-sameuser": "(একই ব্যবহারকারী দ্বারা সম্পাদিত {{PLURAL:$1|একটি মধ্যবর্তী সংশোধন|$1টি মধ্যবর্তী সংশোধন}} দেখানো হচ্ছে না)",
        "diff-multi-otherusers": "({{PLURAL:$2|একজন|$2 জন}} ব্যবহারকারী দ্বারা সম্পাদিত {{PLURAL:$1|একটি|$1টি}} মধ্যবর্তী সংশোধন দেখানো হচ্ছে না)",
-       "diff-multi-manyusers": "($2 জন {{PLURAL:$2|ব্যবহারাকারীর}} সম্পাদিত {{PLURAL:$1|একটি সাম্প্রতিক সংস্করণ|$1 টি সাম্প্রতিক সংস্করণ}} প্রদর্শিত হচ্ছে না)",
-       "difference-missing-revision": "$1 পার্থক্যের {{PLURAL:$2|একটি সংস্করণ|$2টি সংস্করণ}} খুঁজে পাওয়া যাচ্ছে না।\n\nসাধারণত মুছে ফেলা হয়েছে এমন পাতার মেয়াদ উত্তীর্ণ ইতিহাস পাতার লিংক খোলার কারণে এটি হতে পারে। \n[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} অপসারণ লগে] বিস্তারিত তথ্য জানা যাবে।",
+       "diff-multi-manyusers": "($2 জনের বেশি {{PLURAL:$2|ব্যবহারকারীর}} সম্পাদিত {{PLURAL:$1|একটি মধ্যবর্তী সংশোধন|$1টি মধ্যবর্তী সংশোধন}} প্রদর্শিত হচ্ছে না)",
+       "difference-missing-revision": "এই পার্থক্যের ($1) অন্তর্গত {{PLURAL:$2|একটি সংশোধিত সংস্করণ|$2টি সংশোধিত সংস্করণ}} খুঁজে পাওয়া যাচ্ছে না।\n\nসাধারণত মুছে ফেলা হয়েছে এমন পাতার মেয়াদ উত্তীর্ণ ইতিহাস পাতার লিংক খোলার কারণে এটি হতে পারে। \n[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} পাতা অবলুপ্তি লগে] বিস্তারিত তথ্য জানা যাবে।",
        "searchresults": "অনুসন্ধানের ফলাফল",
        "searchresults-title": "\"$1\" অনুসন্ধানের ফলাফল",
        "titlematches": "নিবন্ধের শিরোনাম মিলেছে",
        "textmatches": "পাতার লেখার সাথে মিলেছে",
-       "notextmatches": "কোন পাতার লেখার সাথে মিলে নেই",
+       "notextmatches": "কোন পাতার লেখার সাথে মিলেনি",
        "prevn": "পূর্ববর্তী {{PLURAL:$1|$1}}টি",
        "nextn": "পরবর্তী {{PLURAL:$1|$1}}টি",
        "prev-page": "পূর্ববর্তী পাতা",
        "prevn-title": "পূর্ববর্তী $1{{PLURAL:$1|টি ফলাফল}}",
        "nextn-title": "পরবর্তী $1টি {{PLURAL:$1|ফলাফল}}",
        "shown-title": "প্রতি পাতায় $1টি {{PLURAL:$1|ফলাফল}} দেখাও",
-       "viewprevnext": "($1 {{int:pipe-separator}} $2) ($3) à¦¦à§\87à¦\96ানà§\8b à¦¹à§\8bà¦\95।",
+       "viewprevnext": "($1 {{int:pipe-separator}} $2) ($3) à¦¦à§\87à¦\96à§\81ন",
        "searchmenu-exists": "'''এই উইকিতে \"[[:$1]]\" নামে একটি পাতা রয়েছে'''",
-       "searchmenu-new": "<strong>\"[[:$1]]\" পাতাটি এই উইকিতে তৈরি করুন!</strong> {{PLURAL:$2|0=|এছাড়া আপনার অনুসন্ধানের সাথে পাওয়া পাতা দেখুন।|এছাড়া অনুসন্ধানে পাওয়া ফলাফলগুলি দেখুন।}}",
-       "searchprofile-articles": "বিষয়বসà§\8dতà§\81র পাতা",
+       "searchmenu-new": "<strong>\"[[:$1]]\" পাতাটি এই উইকিতে তৈরি করুন!</strong> {{PLURAL:$2|0=|এছাড়া আপনার অনুসন্ধানের সাথে পাওয়া পাতাটি দেখুন।|এছাড়া অনুসন্ধানে পাওয়া ফলাফলগুলিও দেখুন।}}",
+       "searchprofile-articles": "বিষয়বসà§\8dতà§\81সমà§\83দà§\8dধ পাতা",
        "searchprofile-images": "মাল্টিমিডিয়া",
        "searchprofile-everything": "সমস্তকিছু",
-       "searchprofile-advanced": "à¦\89à¦\9aà§\8dà¦\9aতর",
+       "searchprofile-advanced": "à¦\89নà§\8dনত",
        "searchprofile-articles-tooltip": "$1 এ অনুসন্ধান",
        "searchprofile-images-tooltip": "ফাইলের জন্য অনুসন্ধান",
-       "searchprofile-everything-tooltip": "সà¦\95ল à¦¬à¦¿à¦·à¦¯à¦¼à¦¬à¦¸à§\8dতà§\81 à¦\85নà§\81সনà§\8dধান à¦\95রà§\8b (à¦\86লাপà§\87র à¦ªà¦¾à¦¤à¦¾ সহ)",
-       "searchprofile-advanced-tooltip": "সà§\8dবনিরà§\8dধারিত à¦¨à¦¾à¦®à¦¸à§\8dথানà§\87 à¦\85নà§\81সনà§\8dধান à¦\95রà§\8b",
+       "searchprofile-everything-tooltip": "সà¦\95ল à¦¬à¦¿à¦·à¦¯à¦¼à¦¬à¦¸à§\8dতà§\81 à¦\85নà§\81সনà§\8dধান à¦\95রà§\81ন (à¦\86লাপà§\87র à¦ªà¦¾à¦¤à¦¾সহ)",
+       "searchprofile-advanced-tooltip": "সà§\8dবনিরà§\8dধারিত à¦¨à¦¾à¦®à¦¸à§\8dথানà§\87 à¦\85নà§\81সনà§\8dধান à¦\95রà§\81ন",
        "search-result-size": "$1 ({{PLURAL:$2|১টি শব্দ|$2টি শব্দ}})",
-       "search-result-category-size": "{{PLURAL:$1 |১টি সদস্য |$1টি সদস্য}} ({{PLURAL:$2 |১টি উপবিষয়শ্রেণী|$2টি উপবিষয়শ্রেণী}}, {{PLURAL:$3 |১টি ফাইল |$3টি ফাইল}})",
+       "search-result-category-size": "{{PLURAL:$1|১টি সদস্য|$1টি সদস্য}} ({{PLURAL:$2|১টি উপবিষয়শ্রেণী|$2টি উপবিষয়শ্রেণী}}, {{PLURAL:$3|১টি ফাইল |$3টি ফাইল}})",
        "search-redirect": "($1 থেকে পুনর্নির্দেশিত)",
-       "search-section": "(অনুচ্ছেদ $1)",
-       "search-category": "(বিষয়শ্রেণী $1)",
-       "search-file-match": "(নথির à¦¬à¦¿à¦·à¦¯à¦¼à¦¬à¦¸à§\8dতà§\81 মিলে যায়)",
-       "search-suggest": "à¦\86পনি à¦¸à¦®à§\8dভবত à¦¬à§\81à¦\9dাতà§\87 à¦\9aাà¦\87à¦\9bà§\87ন: $1",
-       "search-rewritten": "$1-এর জন্য ফলাফল দেখানো হচ্ছে। এর পরিবর্তে $2-এর জন্য অনুসন্ধান করুন।",
+       "search-section": "($1 পরিচ্ছেদ)",
+       "search-category": "($1 বিষয়শ্রেণী)",
+       "search-file-match": "(ফাà¦\87লà§\87র à¦¬à¦¿à¦·à¦¯à¦¼à¦¬à¦¸à§\8dতà§\81র à¦¸à¦¾à¦¥à§\87 মিলে যায়)",
+       "search-suggest": "à¦\86পনি à¦\95ি \"$1\" à¦¬à§\8bà¦\9dাতà§\87 à¦\9aাà¦\9aà§\8dà¦\9bà§\87ন?",
+       "search-rewritten": "$1-à¦\8fর à¦\9cনà§\8dয à¦\85নà§\81সনà§\8dধানà§\87র à¦«à¦²à¦¾à¦«à¦² à¦¦à§\87à¦\96ানà§\8b à¦¹à¦\9aà§\8dà¦\9bà§\87। à¦\8fর à¦ªà¦°à¦¿à¦¬à¦°à§\8dতà§\87 $2-à¦\8fর à¦\9cনà§\8dয à¦\85নà§\81সনà§\8dধান à¦\95রà§\81ন।",
        "search-interwiki-caption": "সহপ্রকল্পসমূহ",
-       "search-interwiki-default": "$1 থেকে ফলাফলসমূহ:",
+       "search-interwiki-default": "$1 à¦¥à§\87à¦\95à§\87 à¦ªà§\8dরাপà§\8dত à¦«à¦²à¦¾à¦«à¦²à¦¸à¦®à§\82হ:",
        "search-interwiki-more": "(আরও)",
        "search-interwiki-more-results": "আরও ফলাফল",
        "search-relatedarticle": "সম্পর্কিত",
        "searchall": "সমস্ত",
        "showingresults": "নিচে '''$2''' নং থেকে শুরু করে {{PLURAL:$1|'''1''' ফলাফল|'''$1''' ফলাফলসমূহ}} দেখানো হল।",
        "showingresultsinrange": "#<strong>$2</strong> থেকে #<strong>$3</strong> পরিসীমার মধ্যে {{PLURAL:$1|<strong>১টি</strong> ফলাফল|<strong>$1টি</strong> ফলাফল}} নিচে দেখানো হচ্ছে।",
-       "search-showingresults": "{{PLURAL:$4|<strong>$3</strong>-এর মধ্যে <strong>$1</strong>টি ফলাফল|<strong>$3</strong>-এর মধ্যে <strong>$1 - $2</strong>টি ফলাফল}}",
-       "search-nonefound": "à¦\96à§\8bà¦\81à¦\9cà¦\95à§\83ত à¦ªà¦¾à¦¤ার সাথে মিলে যায় এমন কোনো ফলাফল নেই।",
-       "search-nonefound-thiswiki": "à¦\96à§\8bà¦\81à¦\9c à¦\95রার সাথে মিলে যায় এমন কোনো ফলাফল এই সাইটে নেই।",
+       "search-showingresults": "মোট {{PLURAL:$4|<strong>$3</strong>টি ফলাফলের মধ্যে <strong>$1</strong>টি ফলাফল|<strong>$3</strong>টি ফলাফলের মধ্যে <strong>$1 - $2</strong>টি ফলাফল}}",
+       "search-nonefound": "à¦\85নà§\81সনà§\8dধানà¦\95à§\83ত à¦\9cিà¦\9cà§\8dà¦\9eাসার সাথে মিলে যায় এমন কোনো ফলাফল নেই।",
+       "search-nonefound-thiswiki": "à¦\85নà§\81সনà§\8dধানà¦\95à§\83ত à¦\9cিà¦\9cà§\8dà¦\9eাসার সাথে মিলে যায় এমন কোনো ফলাফল এই সাইটে নেই।",
        "powersearch-legend": "উন্নত অনুসন্ধান",
-       "powersearch-ns": "নামসà§\8dথানà§\87 à¦\85নà§\81সনà§\8dধান à¦\95রà§\8b:",
-       "powersearch-togglelabel": "পরà§\80à¦\95à§\8dষা:",
-       "powersearch-toggleall": "সà¦\95ল",
-       "powersearch-togglenone": "à¦\95িà¦\9bà§\81 নয়",
-       "powersearch-remember": "ভবিষà§\8dযত à¦\85নà§\81সনà§\8dধানà¦\97à§\81লির à¦\9cনà§\8dয à¦¨à¦¿à¦°à§\8dবাà¦\9aন à¦®à¦¨à§\87 à¦°à¦¾à¦\96à§\81ন",
+       "powersearch-ns": "নামসà§\8dথানà¦\97à§\81লিতà§\87 à¦\85নà§\81সনà§\8dধান à¦\95রà§\81ন:",
+       "powersearch-togglelabel": "নিরà§\8dবাà¦\9aন à¦\95রà§\81ন:",
+       "powersearch-toggleall": "সবà¦\97à§\81লি",
+       "powersearch-togglenone": "à¦\95à§\8bনà¦\9fিà¦\87 নয়",
+       "powersearch-remember": "ভবিষà§\8dযত à¦\85নà§\81সনà§\8dধানà¦\97à§\81লির à¦\9cনà§\8dয à¦¨à¦¿à¦°à§\8dবাà¦\9aন à¦®à¦¨à§\87 à¦°à¦¾à¦\96া à¦¹à§\8bà¦\95",
        "search-external": "বহিঃস্থ অনুসন্ধান",
        "searchdisabled": "{{SITENAME}} অনুসন্ধান এখন নিষ্ক্রিয় আছে। আপনি গুগলের মাধ্যমে অনুসন্ধান চালাতে পারেন। লক্ষ্য করুন যে {{SITENAME}}-এর বিষয়বস্তুর উপর গুগলের ইন্ডেক্সগুলি হালনাগাদ না-ও করা থাকতে পারে।",
-       "search-error": "অনুসন্ধানের সময় একটি ত্রুটি হয়েছে: $1",
-       "search-warning": "অনুসন্ধানের সময় একটি সতর্কীকরণ দেখিয়েছে: $1",
+       "search-error": "à¦\85নà§\81সনà§\8dধানà§\87র à¦¸à¦®à¦¯à¦¼ à¦\8fà¦\95à¦\9fি à¦¤à§\8dরà§\81à¦\9fি à¦\89à§\8eপনà§\8dন à¦¹à¦¯à¦¼à§\87à¦\9bà§\87: $1",
+       "search-warning": "অনুসন্ধানের সময় একটি সতর্ক বার্তা উৎপন্ন হয়েছে: $1",
        "preferences": "আমার পছন্দ",
        "mypreferences": "পছন্দসমূহ",
        "prefs-edits": "সম্পাদনা সংখ্যা:",
-       "prefsnologintext2": "à¦\86পনার à¦ªà¦\9bনà§\8dদসমà§\82হ à¦ªà¦°à¦¿à¦¬à¦°à§\8dতন à¦\95রতে প্রবেশ করুন।",
+       "prefsnologintext2": "à¦\86পনার à¦ªà¦\9bনà§\8dদà¦\97à§\81লি à¦ªà¦°à¦¿à¦¬à¦°à§\8dতন à¦\95রতà§\87 à¦\85নà§\81à¦\97à§\8dরহ à¦\95রà§\87 à¦\85à§\8dযাà¦\95াà¦\89নà§\8dà¦\9fে প্রবেশ করুন।",
        "prefs-skin": "আবরণ",
        "skin-preview": "প্রাকদর্শন",
        "datedefault": "কোন পছন্দ নেই",
-       "prefs-labs": "পরà§\80à¦\95à§\8dষাà¦\97ার à¦¬à§\88শিষà§\8dà¦\9fসমূহ",
+       "prefs-labs": "পরà§\80à¦\95à§\8dষাà¦\97ার à¦¸à§\81বিধাসমূহ",
        "prefs-user-pages": "ব্যবহারকারীর পাতা",
        "prefs-personal": "ব্যবহারকারীর বৃত্তান্ত",
        "prefs-rc": "সাম্প্রতিক পরিবর্তনসমূহ",
        "prefs-watchlist": "নজরতালিকা",
-       "prefs-editwatchlist": "নজরতালিকা সম্পাদনা করো",
+       "prefs-editwatchlist": "নজরতালিকা সম্পাদনা",
        "prefs-editwatchlist-label": "আপনার নজরতালিকার ভুক্তিসমূহ সম্পাদনা করুন:",
-       "prefs-editwatchlist-edit": "আপনার নজরতালিকায় থাকা শিরোনাম দেখুন ও সরান",
+       "prefs-editwatchlist-edit": "আপনার নজরতালিকায় থাকা শিরোনামগুলি দেখুন ও সরিয়ে ফেলুন",
        "prefs-editwatchlist-raw": "অশোধিত নজরতালিকা সম্পাদনা করুন",
-       "prefs-editwatchlist-clear": "নà¦\9cরতালিà¦\95া à¦ªà¦°à¦¿à¦¸à§\8dà¦\95ার করুন",
-       "prefs-watchlist-days": "যত দিনের নজরতালিকা দেখানো হবে:",
+       "prefs-editwatchlist-clear": "নà¦\9cরতালিà¦\95া à¦\96ালি করুন",
+       "prefs-watchlist-days": "যতসংখ্যক দিনের নজরতালিকা দেখানো হবে:",
        "prefs-watchlist-days-max": "সর্বোচ্চ $1 {{PLURAL:$1|দিন|দিন}}",
-       "prefs-watchlist-edits": "সম্প্রসারিত নজর তালিকায় সর্বোচ্চ সংখ্যার পরিবর্তন দেখানোর জন্য:",
-       "prefs-watchlist-edits-max": "সরà§\8dবà§\8bà¦\9aà§\8dà¦\9a à¦¨à¦®à§\8dবর: ১০০০",
+       "prefs-watchlist-edits": "সম্প্রসারিত নজরতালিকায় প্রদর্শিত পরিবর্তনের সর্বোচ্চ সংখ্যা:",
+       "prefs-watchlist-edits-max": "সরà§\8dবà§\8bà¦\9aà§\8dà¦\9a à¦¸à¦\82à¦\96à§\8dযা: ১০০০",
        "prefs-watchlist-token": "নজরতালিকা টোকেন:",
        "prefs-misc": "বিবিধ",
        "prefs-resetpass": "পাসওয়ার্ড পরিবর্তন",
        "prefs-changeemail": "ইমেইল ঠিকানা পরিবর্তন বা বাতিল করুন",
-       "prefs-setemail": "একটি ই-মেইল ঠিকানা নির্ধারণ করুন",
-       "prefs-email": "ই-মেইল অপশন",
+       "prefs-setemail": "একটি ইমেইল ঠিকানা নির্ধারণ করুন",
+       "prefs-email": "ইমেইলের পছন্দগুলি",
        "prefs-rendering": "অবয়ব",
        "saveprefs": "সংরক্ষণ",
-       "restoreprefs": "সà¦\95ল à¦ªà§\82রà§\8dবনিরà§\8dধারিত à¦¸à§\87à¦\9fিà¦\82 à¦«à¦¿à¦°à¦¿à¦¯à¦¼à§\87 à¦\86নà§\8b (সà¦\95ল à¦\85নà§\81à¦\9aà§\8dà¦\9bà§\87দে)",
+       "restoreprefs": "সà¦\95ল à¦ªà§\82রà§\8dবনিরà§\8dধারিত à¦¸à§\87à¦\9fিà¦\82 à¦«à¦¿à¦°à¦¿à¦¯à¦¼à§\87 à¦\86নà§\8b (সà¦\95ল à¦\85à¦\82শে)",
        "prefs-editing": "সম্পাদনা",
        "searchresultshead": "অনুসন্ধান",
-       "stub-threshold": "à¦\85সমà§\8dপà§\82রà§\8dণ à¦²à¦¿à¦\99à§\8dà¦\95 à¦¬à¦¿à¦¨à§\8dযাসà§\87র à¦\9cনà§\8dয à¦ªà§\8dরানà§\8dতিà¦\95 à¦®à¦¾à¦ª ($1):",
+       "stub-threshold": "à¦\85সমà§\8dপà§\82রà§\8dণ à¦¨à¦¿à¦¬à¦¨à§\8dধà§\87র à¦¸à¦\82যà§\8bà¦\97 à¦«à¦°à¦®à§\8dযাà¦\9fিà¦\82-à¦\8fর à¦\9cনà§\8dয à¦\8fরà¦\95ম à¦¨à¦¿à¦¬à¦¨à§\8dধà§\87র à¦\86à¦\95ারà§\87র à¦ªà§\8dরানà§\8dতসà§\80মা ($1):",
        "stub-threshold-sample-link": "নমুনা",
        "stub-threshold-disabled": "নিস্ক্রিয়",
-       "recentchangesdays": "সাম্প্রতিক পরিবর্তনে দিনসমূহ দেখানোর জন্য:",
-       "recentchangesdays-max": "সর্বোচ্চ $1 {{PLURAL:$1|দিন|দিন}}",
-       "recentchangescount": "সাম্প্রতিক পরিবর্তনে প্রদর্শিত সম্পাদনার সংখ্যা:",
-       "prefs-help-recentchangescount": "à¦\8fতà§\87 à¦¸à¦¾à¦®à§\8dপà§\8dরতিà¦\95 à¦ªà¦°à¦¿à¦¬à¦°à§\8dতনসমà§\82হ, à¦ªà¦¾à¦¤à¦¾à¦° à¦\87তিহাস à¦\8fবà¦\82 à¦²à¦\97 অন্তর্ভুক্ত।",
-       "prefs-help-watchlist-token2": "à¦\8fà¦\9fি à¦\86পনার à¦¨à¦\9cরতালিà¦\95ার à¦\93য়à§\87ব à¦«à¦¿à¦¡à§\87র à¦\97à§\8bপন à¦\9aাবি। à¦¯à§\87 à¦\95à§\87à¦\89 à¦¯à¦¿à¦¨à¦¿ à¦\8fà¦\9fা à¦\9cানà§\87ন তিনি আপনার নজরতালিকা পড়তে সক্ষম হবেন, তাই এটি প্রকাশ করবেন না। [[Special:ResetTokens|আপনার এটি পুনঃনির্ধারণ করার প্রয়োজন হলে এখানে ক্লিক করুন]]।",
-       "savedprefs": "à¦\86পনার à¦ªà¦\9bনà§\8dদà¦\97à§\81লà§\8b সংরক্ষণ করা হয়েছে।",
+       "recentchangesdays": "সাম্প্রতিক পরিবর্তন পাতায় প্রদর্শিত দিনের সংখ্যা:",
+       "recentchangesdays-max": "সর্বোচ্চ $1 {{PLURAL:$1|দিনের}}",
+       "recentchangescount": "সামà§\8dপà§\8dরতিà¦\95 à¦ªà¦°à¦¿à¦¬à¦°à§\8dতনà§\87 à¦ªà§\8dরদরà§\8dশিত à¦¸à¦®à§\8dপাদনার à¦ªà§\82রà§\8dবনিরà§\8dধারিত à¦¸à¦\82à¦\96à§\8dযা:",
+       "prefs-help-recentchangescount": "à¦\8fতà§\87 à¦¸à¦¾à¦®à§\8dপà§\8dরতিà¦\95 à¦ªà¦°à¦¿à¦¬à¦°à§\8dতনà¦\97à§\81লি, à¦ªà¦¾à¦¤à¦¾à¦° à¦\87তিহাসà¦\97à§\81লি à¦\8fবà¦\82 à¦²à¦\97à¦\97à§\81লি অন্তর্ভুক্ত।",
+       "prefs-help-watchlist-token2": "à¦\8fà¦\9fি à¦\86পনার à¦¨à¦\9cরতালিà¦\95ার à¦\93য়à§\87ব à¦«à¦¿à¦¡à§\87র à¦\97à§\8bপন à¦\9aাবি। à¦\95à§\87à¦\89 à¦¯à¦¦à¦¿ à¦\8fà¦\9fি à¦\9cানতà§\87 à¦ªà¦¾à¦°à§\87ন, à¦¤à¦¾à¦¹à¦²à§\87 তিনি আপনার নজরতালিকা পড়তে সক্ষম হবেন, তাই এটি প্রকাশ করবেন না। [[Special:ResetTokens|আপনার এটি পুনঃনির্ধারণ করার প্রয়োজন হলে এখানে ক্লিক করুন]]।",
+       "savedprefs": "à¦\86পনার à¦ªà¦\9bনà§\8dদà¦\97à§\81লি সংরক্ষণ করা হয়েছে।",
        "savedrights": "{{GENDER:$1|$1}}-এর ব্যবহারকারী দল সংরক্ষিত হয়েছে।",
-       "timezonelegend": "সময়স্থান:",
+       "timezonelegend": "সময় অঞ্চল:",
        "localtime": "স্থানীয় সময়:",
        "timezoneuseserverdefault": "উইকির পূর্বনির্ধারিত সময় ব্যবহার করো ($1)",
        "timezoneuseoffset": "অন্য (অফসেট নির্দিষ্ট করুন)",
        "prefs-signature": "স্বাক্ষর",
        "prefs-dateformat": "তারিখ বিন্যাস",
        "prefs-timeoffset": "সময় অফসেট",
-       "prefs-advancedediting": "সাধারণ à¦\85পশন",
+       "prefs-advancedediting": "সাধারণ à¦ªà¦\9bনà§\8dদà¦\97à§\81লি",
        "prefs-editor": "সম্পাদক",
        "prefs-preview": "প্রাকদর্শন",
-       "prefs-advancedrc": "à¦\89à¦\9aà§\8dà¦\9aতর à¦\85পশন",
+       "prefs-advancedrc": "à¦\89à¦\9aà§\8dà¦\9aতর à¦ªà¦\9bনà§\8dদà¦\97à§\81লি",
        "prefs-advancedrendering": "উচ্চতর অপশন",
-       "prefs-advancedsearchoptions": "à¦\89à¦\9aà§\8dà¦\9aতর à¦\85পশন",
+       "prefs-advancedsearchoptions": "à¦\89à¦\9aà§\8dà¦\9aতর à¦ªà¦\9bনà§\8dদà¦\97à§\81লি",
        "prefs-advancedwatchlist": "উচ্চতর অপশন",
-       "prefs-displayrc": "প্রদর্শনী অপশন",
+       "prefs-displayrc": "প্রদর্শনীর পছন্দগুলি",
        "prefs-displaywatchlist": "প্রদর্শনী অপশন",
        "prefs-tokenwatchlist": "টোকেন",
        "prefs-diffs": "পার্থক্য",
        "prefs-help-prefershttps": "পরবর্তী প্রবেশের পর থেকে এই পরিবর্তনগুলো কার্যকর হবে।",
        "prefswarning-warning": "আপানি পছন্দসমূহ পাতায় পাতায় পরিবর্তন করেছেন যেগুলো সংরক্ষণ করা হয়নি। আপনি যদি এই পাতাটি ছেড়ে যাওয়ার আগে \"$1\" ক্লিক না করেন তবে পছন্দসমূহ হালনাগাদ হবে না।",
        "prefs-tabs-navigation-hint": "সাহায্য: আপনি ডান এবং বাম অ্যারো বাটন ব্যবহার করে বিভিন্ন ট্যাবগুলোতে যেতে পারবেন।",
-       "userrights": "ব্যবহারকারী অধিকার ব্যবস্থাপনা",
+       "userrights": "ব্যবহারকারী অধিকার",
        "userrights-lookup-user": "একজন ব্যবহারকারী নির্বাচন করুন",
        "userrights-user-editname": "ব্যবহারকারীর নাম লিখুন:",
        "editusergroup": "ব্যবহারকারী দল লোড করুন",
        "saveusergroups": "{{GENDER:$1|ব্যবহারকারীর}} দল সংরক্ষণ করো",
        "userrights-groupsmember": "সদস্য:",
        "userrights-groupsmember-auto": "শর্তহীন সদস্য",
-       "userrights-groups-help": "আপনি এই ব্যবহারকারীর বর্তমান দল পরিবর্তন করতে পারবেন:\n* টিক চিহ্ন দেওয়া ঘরের অর্থ ব্যবহারকারী ঐ দলের অন্তর্ভুক্ত।\n* টিক চিহ্ন বিহীন ঘরের অর্থ ব্যবহারকারী ঐ দলের অন্তর্ভুক্ত নন।\n* একটি তারকা চিহ্ন (*) দ্বারা বোঝানো হচ্ছে এই দলের অন্তর্ভুক্তির পর আপনি আর তা বাতিল করতে পারবেন না, বা তদ্বিপরীত।\n* একটি হ্যাশ চিহ্ন (#) দ্বারা বোঝানো হচ্ছে আপনি শুধুমাত্র এই দলের মেয়াদ শেষ হওয়ার সময় পিছনে নিতে পারবেন; কিন্তু সামনে নিতে পারবেন না।",
+       "userrights-groups-help": "à¦\86পনি à¦\8fà¦\87 à¦¬à§\8dযবহারà¦\95ারà§\80র à¦¬à¦°à§\8dতমান à¦¦à¦² à¦ªà¦°à¦¿à¦¬à¦°à§\8dতন à¦\95রতà§\87 à¦ªà¦¾à¦°à¦¬à§\87ন:\n* à¦\9fিà¦\95 à¦\9aিহà§\8dন à¦¦à§\87à¦\93য়া à¦\98রà§\87র à¦\85রà§\8dথ à¦¬à§\8dযবহারà¦\95ারà§\80 à¦\90 à¦¦à¦²à§\87র à¦\85নà§\8dতরà§\8dভà§\81à¦\95à§\8dত।\n* à¦\9fিà¦\95 à¦\9aিহà§\8dন à¦¬à¦¿à¦¹à§\80ন à¦\98রà§\87র à¦\85রà§\8dথ à¦¬à§\8dযবহারà¦\95ারà§\80 à¦\90 à¦¦à¦²à§\87র à¦\85নà§\8dতরà§\8dভà§\81à¦\95à§\8dত à¦¨à¦¨à¥¤\n* à¦\8fà¦\95à¦\9fি à¦¤à¦¾à¦°à¦\95া à¦\9aিহà§\8dন (*) à¦¦à§\8dবারা à¦¬à§\8bà¦\9dানà§\8b à¦¹à¦\9aà§\8dà¦\9bà§\87 à¦\8fà¦\87 à¦¦à¦²à§\87র à¦\85নà§\8dতরà§\8dভà§\81à¦\95à§\8dতির à¦ªà¦° à¦\86পনি à¦\86র à¦¤à¦¾ à¦¬à¦¾à¦¤à¦¿à¦² à¦\95রতà§\87 à¦ªà¦¾à¦°à¦¬à§\87ন à¦¨à¦¾, à¦¬à¦¾ à¦¤à¦¦à§\8dবিপরà§\80ত।\n* à¦\8fà¦\95à¦\9fি à¦¹à§\8dযাশ à¦\9aিহà§\8dন (#) à¦¦à§\8dবারা à¦¬à§\8bà¦\9dানà§\8b à¦¹à¦\9aà§\8dà¦\9bà§\87 à¦\86পনি à¦¶à§\81ধà§\81মাতà§\8dর à¦\8fà¦\87 à¦¦à¦²à§\87র à¦¸à¦¦à¦¸à§\8dযতার à¦®à§\87য়াদ à¦¶à§\87ষ à¦¹à¦\93য়ার à¦¸à¦®à¦¯à¦¼ à¦ªà¦¿à¦\9bনà§\87 à¦¨à¦¿à¦¤à§\87 à¦ªà¦¾à¦°à¦¬à§\87ন; à¦\95িনà§\8dতà§\81 à¦¸à¦¾à¦®à¦¨à§\87 à¦¨à¦¿à¦¤à§\87 à¦ªà¦¾à¦°à¦¬à§\87ন à¦¨à¦¾à¥¤",
        "userrights-reason": "কারণ (বাংলায় লিখুন):",
        "userrights-no-interwiki": "আপনার অন্য উইকিতে ব্যবহারকারী অধিকার সম্পাদনা করার অনুমতি নেই।",
        "userrights-nodatabase": "$1 ডাটাবেজটির হয় কোন অস্তিত্ব নেই অথবা এটি স্থানীয় ডাটাবেজ নয়।",
        "userrights-expiry-options": "১ দিন:1 day,১ সপ্তাহ:1 week,১ মাস:1 month,৩ মাস:3 months,৬ মাস:6 months,১ বছর:1 year",
        "userrights-invalid-expiry": "\"$1\" দলের জন্য মেয়াদোত্তীর্ণের সময় অবৈধ।",
        "userrights-expiry-in-past": "\"$1\" দলের জন্য মেয়াদোত্তীর্ণের সময় অতীতে।",
+       "userrights-cannot-shorten-expiry": "\"$1\" দলটির সদস্যতার মেয়াদোত্তীর্ণ হবার সময় ও তারিখ আপনি পূর্ববর্তী কোন সময়ে এগিয়ে নিয়ে আসতে পারবেন না। যেসব ব্যবহারকারীর এই দলটি যোগ বা অপসারণ করার অনুমতি আছে, কেবল তারাই মেয়াদোত্তীর্ণ হবার সময় ও তারিখ এগিয়ে নিয়ে আসতে পারবেন।",
        "userrights-conflict": "ব্যবহারকারী অধিকার দ্বন্দ্ব! অনুগ্রহ করে নিশ্চিত হোন এবং পুনরায় চেষ্টা করুন।",
        "group": "দল:",
        "group-user": "ব্যবহারকারীগণ",
        "grouppage-sysop": "{{ns:project}}:প্রশাসক",
        "grouppage-bureaucrat": "{{ns:project}}:ব্যুরোক্র্যাট",
        "grouppage-suppress": "{{ns:project}}:দমনকারী",
-       "right-read": "পাতাসমà§\82হ à¦ªà¦¡à¦¼à§\81ন",
-       "right-edit": "পাতা à¦¸à¦®à§\8dপাদনা à¦\95রà§\81ন",
-       "right-createpage": "পাতা à¦¤à§\88রি à¦\95রà§\8b (à¦\86লাপà§\87র à¦ªà¦¾à¦¤à¦¾ à¦¨à¦¯à¦¼)",
-       "right-createtalk": "à¦\86লà§\8bà¦\9aনা à¦ªà¦¾à¦¤à¦¾ à¦¤à§\88রি à¦\95রà§\81ন",
+       "right-read": "যà§\87à¦\95à§\8bন à¦ªà¦¾à¦¤à¦¾ à¦ªà¦¡à¦¼à¦¾",
+       "right-edit": "পাতা à¦¸à¦®à§\8dপাদনা à¦\95রা",
+       "right-createpage": "à¦\86লাপ à¦ªà¦¾à¦¤à¦¾ à¦¨à¦¯à¦¼, à¦\8fমন à¦ªà¦¾à¦¤à¦¾ à¦¤à§\88রি à¦\95রা",
+       "right-createtalk": "à¦\86লাপ à¦ªà¦¾à¦¤à¦¾ à¦¤à§\88রি à¦\95রা",
        "right-createaccount": "নতুন ব্যবহারকারীর অ্যাকাউন্ট তৈরি করুন",
        "right-autocreateaccount": "স্বয়ংক্রিয়ভাবে একটি বাহ্যিক ব্যবহারকারী অ্যাকাউন্ট দিয়ে প্রবেশ করুন",
-       "right-minoredit": "à¦\85নà§\81লà§\8dলà§\87à¦\96à§\8dয à¦¸à¦®à§\8dপাদনা à¦¹à¦¿à¦¸à§\87বà§\87 à¦\9aিহà§\8dনিত",
+       "right-minoredit": "à¦\95à§\8bনà¦\93 à¦¸à¦®à§\8dপাদনা à¦\85নà§\81লà§\8dলà§\87à¦\96à§\8dয à¦¹à¦¿à¦¸à§\87বà§\87 à¦\9aিহà§\8dনিত à¦\95রা",
        "right-move": "পাতা সরান",
        "right-move-subpages": "পাতাগুলোকে তার উপপাতাসহ সরিয়ে নিন",
        "right-move-rootuserpages": "root ব্যবহারকারীর পাতাগুলো সরিয়ে ফেলুন",
        "right-suppressredirect": "পাতা স্থানান্তরের সময় মূল পাতা থেকে পুনর্নির্দেশ তৈরী করছে না",
        "right-upload": "ফাইল আপলোড করুন",
        "right-reupload": "বিদ্যমান ফাইল প্রতিস্থাপন করো",
-       "right-reupload-own": "à¦\95ারà¦\93 à¦\86পলà§\8bডà¦\95à§\83ত à¦«à¦¾à¦\87ল à¦\93ভাররাà¦\87à¦\9f à¦\95রà§\81ন",
+       "right-reupload-own": "নিà¦\9cà§\87র à¦¦à§\8dবারা à¦\86পলà§\8bডà¦\95à§\83ত à¦«à¦¾à¦\87ল à¦¯à¦¾ à¦\87তিমধà§\8dযà§\87à¦\87 à¦¬à¦¿à¦¦à§\8dযমান, à¦¸à§\87à¦\9fি à¦®à§\81à¦\9bà§\87 à¦ªà§\81নরায় à¦¨à¦¤à§\81ন à¦\95রà§\87 à¦\86পলà§\8bড à¦\95রা",
        "right-reupload-shared": "স্থানীয়ভাবে শেয়ার্ড মিডিয়া রিপোজিটরীর ফাইল ওভাররাইড",
        "right-upload_by_url": "URL থেকে ফাইল আপলোড",
-       "right-purge": "নিশà§\8dà¦\9aিতà¦\95রণ à¦\9bাড়াà¦\87 à¦¸à¦¾à¦\87à¦\9fà§\87র à¦\95à§\8dযাশ à¦ªà¦¾à¦°à§\8dà¦\9c à¦\95রà§\81ন",
+       "right-purge": "নিশà§\8dà¦\9aিতà¦\95রণ à¦\9bাড়াà¦\87 à¦¸à¦¾à¦\87à¦\9fà§\87র à¦\95à§\8dযাশ à¦¶à§\8bধন à¦\95রা",
        "right-autoconfirmed": "অর্ধ-সুরক্ষিত পাতা সম্পাদনা",
        "right-bot": "সয়ংক্রিয় পদ্ধতি হিসাবে চিহ্নিত করণ",
        "right-nominornewtalk": "বার্তা লেখার মত আলাপ পাতায় কোনো অনুল্লেখ্য সম্পাদনা নেই",
        "right-deletedtext": "অপরাসারিত সংশোধনের অপরাসারিত লেখা এবং পরিবর্তনসমূহ দেখাও",
        "right-browsearchive": "অপসারিত পাতা অনুসন্ধান করো",
        "right-undelete": "পাতাটি পুনরুদ্ধার করুন",
-       "right-suppressrevision": "যà§\87à¦\95à§\8bন à¦¬à§\8dযবহারà¦\95ারà§\80 à¦¥à§\87à¦\95à§\87 à¦ªà¦¾à¦¤à¦¾à¦° à¦¨à¦¿à¦°à§\8dদিষà§\8dà¦\9f à¦¸à¦\82শà§\8bধন à¦¦à§\87à¦\96à§\81ন, à¦\86ড়াল à¦\95রà§\81ন à¦\8fবà¦\82 à¦\85-à¦\86ড়াল à¦\95রুন",
-       "right-viewsuppressed": "সà¦\95ল à¦¬à§\8dযবহারà¦\95ারà§\80র à¦\9cনà§\8dয à¦²à§\81à¦\95িয়াত à¦¸à¦\82শà§\8bধন à¦ªà§\8dরদরà§\8dশন à¦\95র",
+       "right-suppressrevision": "যà§\87à¦\95à§\8bন à¦¬à§\8dযবহারà¦\95ারà§\80 à¦¥à§\87à¦\95à§\87 à¦ªà¦¾à¦¤à¦¾à¦° à¦¨à¦¿à¦°à§\8dদিষà§\8dà¦\9f à¦¸à¦\82শà§\8bধন à¦¦à§\87à¦\96à§\81ন, à¦²à§\81à¦\95িয়à§\87  à¦°à¦¾à¦\96à§\81ন à¦\8fবà¦\82 à¦ªà§\8dরà¦\95াশà§\8dযà§\87 à¦\86নুন",
+       "right-viewsuppressed": "যà§\87à¦\95à§\8bন à¦¬à§\8dযবহারà¦\95ারà§\80র à¦\95াà¦\9b à¦¥à§\87à¦\95à§\87 à¦²à§\81à¦\95ায়িত à¦¸à¦\82সà§\8dà¦\95রণà¦\97à§\81লি à¦¦à§\87à¦\96à§\81ন",
        "right-suppressionlog": "ব্যক্তিগত লগ দেখাও",
        "right-block": "সম্পাদনা করতে কোনো ব্যবহারকারীকে বাঁধা দাও",
        "right-blockemail": "ই-মেইল পাঠাতে কোনো ব্যবহারকারীকে বাঁধা দাও",
        "right-rollback": "একটি নির্দিষ্ট পাতার সর্বশেষ ব্যবহারকারীর সম্পদনা পূর্বাবস্থায় ফিরিয়ে আনুন",
        "right-markbotedits": "ফেরত আনা সম্পাদনাসমূহকে বট সম্পাদনা হিসেবে চিহ্নিত করে",
        "right-noratelimit": "রেট লিমিটের ভিত্তিতে পরিবর্তন হবে না",
-       "right-import": "à¦\85নà§\8dয à¦\89à¦\87à¦\95ি à¦¥à§\87à¦\95à§\87 à¦ªà¦¾à¦¤à¦¾ à¦\86মদানà§\80 à¦\95রà§\8b",
+       "right-import": "à¦\85নà§\8dয à¦\89à¦\87à¦\95ি à¦¥à§\87à¦\95à§\87 à¦ªà¦¾à¦¤à¦¾ à¦\86মদানি à¦\95রা",
        "right-importupload": "ফাইল আপলোড থেকে এই পাতাগুলো আমদানী করো",
        "right-patrol": "অন্যের সম্পাদনা পরীক্ষিত বলে চিহ্নিত করো",
        "right-autopatrol": "কারও নিজের সম্পাদনা সয়ংক্রিয়ভাবে পরীক্ষাণ হিসাবে চিহ্নিত",
        "right-mergehistory": "পাতার ইতিহাস একীকরণ করুন।",
        "right-userrights": "সকল ব্যবহারকারী অধিকার সম্পাদনা করুন",
        "right-userrights-interwiki": "অন্যান্য উইকির ব্যবহারকারীদের অধিকারসমূহ সম্পাদনা করুন।",
-       "right-siteadmin": "ডাà¦\9fাবà§\87à¦\9c à¦¬à¦¨à§\8dধ à¦\8fবà¦\82 à¦\96à§\81লà§\81ন",
+       "right-siteadmin": "ডাà¦\9fাবà§\87à¦\9c à¦\85বরà§\81দà§\8dধ à¦\95রা à¦\8fবà¦\82 à¦\96à§\8bলা",
        "right-override-export-depth": "৫ম স্তর পর্যন্ত সংযুক্তিসহ একটি পাতা রপ্তানী করুন",
-       "right-sendemail": "অন্য ব্যবহারকারীকে ইমেইল পাঠান",
+       "right-sendemail": "অন্য ব্যবহারকারীকে ইমেইল পাঠান",
        "right-managechangetags": "[[Special:Tags|ট্যাগ]] তৈরি ও সক্রিয়/নিষ্ক্রিয় করুন",
-       "right-applychangetags": "সমà§\8dপাদনার à¦¸à¦¾à¦¥à§\87 [[Special:Tags|à¦\9fà§\8dযাà¦\97]] à¦¯à§\81à¦\95à§\8dত à¦\95রà§\81ন",
+       "right-applychangetags": "নিà¦\9cসà§\8dব à¦¸à¦®à§\8dপাদনার à¦¸à¦¾à¦¥à§\87 [[Special:Tags|à¦\9fà§\8dযাà¦\97]] à¦¯à§\81à¦\95à§\8dত à¦\95রা",
        "right-changetags": "নির্দিষ্ট সংস্করণ এবং দীর্ঘ সম্পাদনাগুলোতে [[Special:Tags|ট্যাগ]] সংযোজন ও অপসারণ করুন",
        "right-deletechangetags": "ডাটাবেজ থেকে [[Special:Tags|ট্যাগ]] অপসারণ করা",
        "grant-generic": "\"$1\" অধিকার স্তর",
        "grant-editpage": "বিদ্যমান পাতা সম্পাদনা করুন",
        "grant-editprotected": "সংরক্ষিত পাতা সম্পাদনা করুন",
        "grant-highvolume": "উচ্চ-মাত্রার সম্পাদনা",
-       "grant-oversight": "বà§\8dযবহারà¦\95ারà§\80 à¦²à§\81à¦\95ান à¦\93 à¦\87তিহাস à¦\85পসারণ",
+       "grant-oversight": "বà§\8dযবহারà¦\95ারà§\80 à¦²à§\81à¦\95িয়à§\87 à¦°à¦¾à¦\96া à¦\93 à¦¸à¦\82শà§\8bধন à¦¦à¦®à¦¨",
        "grant-patrol": "পাতার পরিবর্তনে টহল দেয়া",
        "grant-privateinfo": "ব্যক্তিগত তথ্যে প্রবেশাধিকার",
        "grant-protect": "পাতাসমূহ সুরক্ষা ও অরক্ষিত করুন",
        "action-autocreateaccount": "স্বয়ংক্রিয়ভাবে এই বাহ্যিক ব্যবহারকারী অ্যাকাউন্ট তৈরি করার",
        "action-history": "এই পাতার ইতিহাস দেখার",
        "action-minoredit": "এই সম্পাদনাটি অনুল্লেখ্য হিসেবে চিহ্নিত করার",
-       "action-move": "পাতাà¦\9fি à¦¸à¦°à¦¿à¦¯à¦¼à§\87 à¦«à§\87লà§\81ন",
-       "action-move-subpages": "পাতাà¦\9fি à¦\8fবà¦\82 à¦\8fর à¦\89পপাতাà¦\97à§\81লà§\8b à¦¸à¦°à¦¿à¦¯à¦¼à§\87 à¦«à§\87লà§\81ন",
+       "action-move": "à¦\8fà¦\87 à¦ªà¦¾à¦¤à¦¾à¦\9fি à¦¸à§\8dথানানà§\8dতর à¦\95রার",
+       "action-move-subpages": "à¦\8fà¦\87 à¦ªà¦¾à¦¤à¦¾à¦\9fি à¦\8fবà¦\82 à¦\8fর à¦\89পপাতাà¦\97à§\81লি à¦¸à§\8dথানানà§\8dতর à¦\95রার",
        "action-move-rootuserpages": "root ব্যবহারকারীর পাতাগুলো সরিয়ে ফেলুন",
-       "action-move-categorypages": "বিষয়শ্রেণী পাতাসমূহ স্থানান্তর করুন",
+       "action-move-categorypages": "বিষয়শ্রেণীর পাতা স্থানান্তর করার",
        "action-movefile": "এই ফাইল স্থানান্তর করার",
        "action-upload": "এই ফাইল আপলোড করার",
-       "action-reupload": "বিদà§\8dযমান à¦«à¦¾à¦\87ল à¦ªà§\8dরতিসà§\8dথাপন à¦\95রà§\8b",
+       "action-reupload": "à¦\8fà¦\87 à¦¬à¦¿à¦¦à§\8dযমান à¦«à¦¾à¦\87ল à¦ªà§\8dরতিসà§\8dথাপন à¦\95রার",
        "action-reupload-shared": "শেয়ার্ড রিপোজিটরীতে এই ফাইলটি হালনাগাদ করার",
-       "action-upload_by_url": "à¦\95à§\8bন à¦\87à¦\89à¦\86রà¦\8fল à¦¥à§\87à¦\95à§\87 à¦«à¦¾à¦\87লà¦\9fি à¦\86পলà§\8bড à¦\95রà§\8b",
-       "action-writeapi": "রাà¦\87à¦\9f à¦\8fপিà¦\86à¦\87 à¦¬à§\8dযবহার à¦\95রà§\81ন",
-       "action-delete": "পাতাà¦\9fি à¦®à§\81à¦\9bà§\87 à¦«à§\87লà§\8b",
+       "action-upload_by_url": "à¦\8fà¦\95à¦\9fি à¦\87à¦\89à¦\86রà¦\8fল à¦¥à§\87à¦\95à§\87 à¦\8fà¦\87 à¦«à¦¾à¦\87লà¦\9fি à¦\86পলà§\8bড à¦\95রার",
+       "action-writeapi": "à¦\8fপিà¦\86à¦\87 à¦²à§\87à¦\96া à¦¬à§\8dযবহার à¦\95রার",
+       "action-delete": "à¦\8fà¦\87 à¦ªà¦¾à¦¤à¦¾à¦\9fি à¦\85পসারণ à¦\95রার",
        "action-deleterevision": "সংশোধনটি মুছে ফেলার",
        "action-deletelogentry": "লগের ভুক্তি অপসারণ করার",
        "action-deletedhistory": "পাতার অপসারিত ইতিহাস দেখার",
        "action-deletedtext": "অপসারিত সংশোধনের লেখা দেখার",
-       "action-browsearchive": "অপসারিত পাতায় অনুসন্ধান করুন",
+       "action-browsearchive": "অপসারিত পাতা অনুসন্ধান করার",
        "action-undelete": "পাতাটি পুনরুদ্ধার করার",
        "action-suppressrevision": "লুকানো সংস্করণগুলো পর্যালোচনা এবং পুনঃস্থাপন করার",
        "action-suppressionlog": "এই ব্যক্তিগত লগ দেখার",
        "action-block": "এই ব্যবহারকারীকে সম্পাদনা করতে বাঁধা দেয়ার",
        "action-protect": "এই পাতার সুরক্ষার মাত্রা পরিবর্তন করার",
        "action-rollback": "একটি নির্দিষ্ট পাতার সর্বশেষ ব্যবহারকারীর সম্পদনা পূর্বাবস্থায় ফিরিয়ে আনুন",
-       "action-import": "à¦\85নà§\8dয à¦\89à¦\87à¦\95ি à¦¥à§\87à¦\95à§\87 à¦ªà¦¾à¦¤à¦¾ à¦\86মদানà§\80 à¦\95রà§\8b",
-       "action-importupload": "ফাà¦\87ল à¦\86পলà§\8bড à¦¥à§\87à¦\95à§\87 à¦ªà¦¾à¦¤à¦¾ à¦\86মদানà§\80 à¦\95রà§\8b",
-       "action-patrol": "à¦\85নà§\8dযদà§\87র à¦¸à¦®à§\8dপাদনা à¦ªà¦°à§\80à¦\95à§\8dষিত à¦¬à¦²à§\87 à¦\9aিহà§\8dনিত à¦\95রà§\8b",
+       "action-import": "à¦\85নà§\8dয à¦\89à¦\87à¦\95ি à¦¥à§\87à¦\95à§\87 à¦ªà¦¾à¦¤à¦¾ à¦\86মদানি à¦\95রার",
+       "action-importupload": "ফাà¦\87ল à¦\86পলà§\8bড à¦¥à§\87à¦\95à§\87 à¦ªà¦¾à¦¤à¦¾ à¦\86মদানি à¦\95রার",
+       "action-patrol": "à¦\85নà§\8dযদà§\87র à¦¸à¦®à§\8dপাদনা à¦ªà¦°à§\80à¦\95à§\8dষিত à¦¬à¦²à§\87 à¦\9aিহà§\8dনিত à¦\95রার",
        "action-autopatrol": "পরীক্ষিত বলে চিহ্নিত কি আপনি সম্পাদনা করেছেন",
-       "action-unwatchedpages": "নà¦\9cরতালিà¦\95া à¦¬à¦¹à¦¿à¦°à§\8dভà§\82ত à¦ªà¦¾à¦¤à¦¾à¦\97à§\81লির à¦¤à¦¾à¦²à¦¿à¦\95া à¦¦à§\87à¦\96াà¦\93",
+       "action-unwatchedpages": "নà¦\9cরতালিà¦\95া à¦¬à¦¹à¦¿à¦°à§\8dভà§\82ত à¦ªà¦¾à¦¤à¦¾à¦\97à§\81লির à¦¤à¦¾à¦²à¦¿à¦\95া à¦¦à§\87à¦\96ার",
        "action-mergehistory": "এই পাতার ইতিহাস একত্রিত করার",
-       "action-userrights": "সà¦\95ল à¦¬à§\8dযবহারà¦\95ারà§\80র à¦\85ধিà¦\95ার à¦¸à¦®à§\8dপাদনা à¦\95রà§\81ন",
-       "action-userrights-interwiki": "অন্যান্য উইকির ব্যবহারকারীদের অধিকারসমূহ সম্পাদনা করুন",
-       "action-siteadmin": "ডাà¦\9fাবà§\87à¦\9c à¦¬à¦¨à§\8dধ à¦\85থবা à¦\96à§\81লà§\81ন",
+       "action-userrights": "সà¦\95ল à¦¬à§\8dযবহারà¦\95ারà§\80র à¦\85ধিà¦\95ার à¦¸à¦®à§\8dপাদনা à¦\95রার",
+       "action-userrights-interwiki": "অন্য উইকিতে ব্যবহারকারীদের অধিকার সম্পাদনা করার",
+       "action-siteadmin": "ডাà¦\9fাবà§\87à¦\9c à¦\85বরà§\81দà§\8dধ à¦\95রার à¦\85থবা à¦\96à§\8bলার",
        "action-sendemail": "ই-মেইল পাঠাও",
        "action-editmyoptions": "নিজের পছন্দসমূহ সম্পাদনা করার",
        "action-editmywatchlist": "আপনার নজরতালিকা পরিবর্তন করুন",
        "action-editcontentmodel": "পাতার কন্টেন্ট মডেল সম্পাদনা করুন",
        "action-managechangetags": "ট্যাগ তৈরি ও সক্রিয়/নিষ্ক্রিয়",
        "action-applychangetags": "আপনার পরিবর্তনগুলোর সাথে ট্যাগ সংযোজন করুন",
-       "action-changetags": "নিরà§\8dদিষà§\8dà¦\9f à¦¸à¦\82সà§\8dà¦\95রণ à¦\8fবà¦\82 à¦¦à§\80রà§\8dà¦\98 à¦¸à¦®à§\8dপাদনাà¦\97à§\81লà§\8bতà§\87 à¦\9fà§\8dযাà¦\97 à¦¸à¦\82যà§\8bà¦\9cন à¦\93 à¦\85পসারণ à¦\95রà§\81ন",
+       "action-changetags": "নিরà§\8dদিষà§\8dà¦\9f à¦¸à¦\82সà§\8dà¦\95রণ à¦\8fবà¦\82 à¦²à¦\97 à¦­à§\81à¦\95à§\8dতিà¦\97à§\81লিতà§\87 à¦¯à¦¥à§\87à¦\9aà§\8dà¦\9bভাবà§\87 à¦\9fà§\8dযাà¦\97 à¦¸à¦\82যà§\8bà¦\9cন à¦\93 à¦\85পসারণ à¦\95রা",
        "action-deletechangetags": "ডাটাবেজ থেকে ট্যাগ অপসরণ করার",
        "action-purge": "এই পাতা হালনাগাদ করার",
        "nchanges": "$1টি {{PLURAL:$1|পরিবর্তন}}",
        "enhancedrc-since-last-visit": "{{PLURAL:$1|সর্বশেষ প্রদর্শনের পর}} $1টি",
        "enhancedrc-history": "ইতিহাস",
        "recentchanges": "সাম্প্রতিক পরিবর্তন",
-       "recentchanges-legend": "সামà§\8dপà§\8dরতিà¦\95 à¦ªà¦°à¦¿à¦¬à¦°à§\8dতনà§\87র à¦ªà¦\9bনà§\8dদসমà§\82হ",
+       "recentchanges-legend": "সামà§\8dপà§\8dরতিà¦\95 à¦ªà¦°à¦¿à¦¬à¦°à§\8dতনà§\87র à¦ªà¦\9bনà§\8dদà¦\97à§\81লি",
        "recentchanges-summary": "এই পাতায় উইকিটির সবচেয়ে সাম্প্রতিক পরিবর্তনগুলি অনুসরণ করুন।",
        "recentchanges-noresult": "নির্ধারিত সময়ের মধ্যে কোনো পরিবর্তন পাওয়া যায়নি।",
        "recentchanges-feed-description": "এই ফিডে উইকিটির সবচেয়ে সাম্প্রতিক পরিবর্তনগুলি অনুসরণ করুন।",
        "recentchanges-submit": "দেখাও",
        "rcfilters-activefilters": "সক্রিয় ফিল্টার",
        "rcfilters-restore-default-filters": "পূর্বনির্ধারিত ছাঁকনি পুনরুদ্ধার করুন",
-       "rcfilters-clear-all-filters": "সমসà§\8dত à¦«à¦¿à¦²à§\8dà¦\9fার à¦\85পসারণ",
+       "rcfilters-clear-all-filters": "সব à¦\9bাà¦\81à¦\95নি à¦ªà¦°à¦¿à¦·à§\8dà¦\95ার à¦\95রà§\81ন",
        "rcfilters-search-placeholder": "সাম্প্রতিক পরিবর্তনসমূহ ছাঁকুন (ব্রাউজ বা টাইপ করা শুরু করুন)",
-       "rcfilters-invalid-filter": "à¦\85à¦\95ারà§\8dযà¦\95র à¦«à¦¿à¦²à§\8dà¦\9fার",
+       "rcfilters-invalid-filter": "à¦\85à¦\95ারà§\8dযà¦\95র à¦\9bাà¦\81à¦\95নি",
        "rcfilters-empty-filter": "কোনো সক্রিয় ফিল্টার নেই। সমস্ত অবদান দেখানো হয়েছে।",
        "rcfilters-filterlist-title": "ছাঁকনি",
+       "rcfilters-filterlist-whatsthis": "এটি কী?",
        "rcfilters-filterlist-feedbacklink": "নতুন (বিটা) ছাঁকনির উপর মতামত প্রদান করুন",
-       "rcfilters-highlightbutton-title": "ফলাফল আলোকপাত করুন",
+       "rcfilters-highlightbutton-title": "ফলাফল আলোকপাত করুন",
        "rcfilters-highlightmenu-title": "একটি রং নির্বাচন করুন",
-       "rcfilters-highlightmenu-help": "এই বৈশিষ্ট্য আলোকপাত করতে একটি রঙ নির্বাচন করুন",
-       "rcfilters-filterlist-noresults": "কোনও ফিল্টার পাওয়া যায়নি",
+       "rcfilters-highlightmenu-help": "এই বৈশিষ্ট্যটিতে আলোকপাত করতে একটি রঙ নির্বাচন করুন",
+       "rcfilters-filterlist-noresults": "কোনও ছাঁকনি পাওয়া যায়নি",
+       "rcfilters-noresults-conflict": "কোনও ফলাফল পাওয়া যায়নি কারণ অনুসন্ধানের মাপকাঠিগুলির মধ্যে সংঘর্ষ আছে",
+       "rcfilters-state-message-subset": "এই ছাঁকনিটির কোন প্রভাব নেই কারণ এর ফলাফলগুলি নিম্নোক্ত বৃহত্তর পরিধির {{PLURAL:$2|ছাঁকনিটির|ছাঁকনিগুলির}} মধ্যে অন্তর্ভুক্ত আছে (আলোকপাত করে এটিকে আলাদা করে দেখার চেষ্টা করুন): $1",
+       "rcfilters-state-message-fullcoverage": "কোন দলের সমস্ত ছাঁকনি নির্বাচন করা এবং কোন ছাঁকনিই নির্বাচন না করা একই কথা, তাই এই ছাঁকনিটির কোন প্রভাব নেই। এই দলে অন্তর্ভুক্ত ছাঁকনিগুলি হল: $1",
        "rcfilters-filtergroup-registration": "ব্যবহারকারী নিবন্ধন",
        "rcfilters-filter-registered-label": "নিবন্ধিত",
        "rcfilters-filter-registered-description": "প্রবেশকৃত সম্পাদকবৃন্দ।",
        "rcfilters-filter-unregistered-label": "অনিবন্ধিত",
-       "rcfilters-filter-unregistered-description": "সম্পাদক যারা প্রবেশ করেন নি।",
-       "rcfilters-filtergroup-authorship": "কৃতি সম্পাদনা",
+       "rcfilters-filter-unregistered-description": "যেসব সম্পাদক অ্যাকাউন্টে প্রবেশ করেননি।",
+       "rcfilters-filter-unregistered-conflicts-user-experience-level": "এই ছাঁকনিটির সাথে নিম্নোক্ত ব্যবহারকারী অভিজ্ঞতা {{PLURAL:$2|ছাঁকনিটির|ছাঁকনিগুলির}} সংঘর্ষ আছে; যা কেবলমাত্র নিবন্ধিত ব্যবহারকারীদের খুঁজে বের করে: $1",
+       "rcfilters-filtergroup-authorship": "কার দ্বারা সম্পাদিত",
        "rcfilters-filter-editsbyself-label": "আপনার নিজস্ব সম্পাদনা",
-       "rcfilters-filter-editsbyself-description": "à¦\86পনার à¦¦à§\8dবারা à¦¸à¦®à§\8dপাদনা।",
-       "rcfilters-filter-editsbyother-label": "à¦\85নà§\8dযদà§\87র à¦¦à§\8dবারা à¦¸à¦®à§\8dপাদনা",
-       "rcfilters-filter-editsbyother-description": "à¦\85নà§\8dয à¦¬à§\8dযবহারà¦\95ারà§\80দà§\87র à¦¦à§\8dবারা à¦\95রা à¦¸à¦®à§\8dপাদনা (à¦\86পনার à¦¨à¦¾)।",
+       "rcfilters-filter-editsbyself-description": "à¦\86পনার à¦¸à¦®à§\8dপাদনাà¦\97à§\81লি।",
+       "rcfilters-filter-editsbyother-label": "à¦\85নà§\8dযদà§\87র à¦¸à¦®à§\8dপাদনাà¦\97à§\81লি",
+       "rcfilters-filter-editsbyother-description": "à¦\85নà§\8dয à¦¬à§\8dযবহারà¦\95ারà§\80দà§\87র à¦\95রা à¦¸à¦®à§\8dপাদনাà¦\97à§\81লি (à¦\86পনার à¦\95রা à¦¨à¦¯à¦¼)।",
        "rcfilters-filtergroup-userExpLevel": "অভিজ্ঞতার স্তর (শুধু মাত্র নিবন্ধিত ব্যবহারকারীর জন্য)",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "অভিজ্ঞতা ছাঁকনিগুলি কেবলমাত্র নিবন্ধিত ব্যবহারকারীদের খুঁজে বের করে, তাই এই ছাঁকনিটি \"অনিবন্ধিত\" ছাঁকনিটির সাথে সংঘর্ষে আছে।",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "\"অনিবন্ধিত\" ছাঁকনিটি এক বা তার অধিক অভিজ্ঞতা ছাঁকনির সাথে সংঘর্ষে আছে, যে ছাঁকনিগুলি কেবলমাত্র নিবন্ধিত ব্যবহারকারীদের খুঁজে বের করে। সংঘর্ষরত ছাঁকনিগুলিকে উপরের \"সক্রিয় ছাঁকনিসমূহ\" এলাকাতে চিহ্নিত করা হয়েছে।",
        "rcfilters-filter-user-experience-level-newcomer-label": "নতুন আগত",
-       "rcfilters-filter-user-experience-level-newcomer-description": "১০টি সম্পাদনার কম ও ৪ দিনের কার্যকলাপ।",
+       "rcfilters-filter-user-experience-level-newcomer-description": "১০টির কমসংখ্যক সম্পাদনা করেছেন ও ৪ দিনের কম সময় ধরে সক্রিয় আছেন।",
        "rcfilters-filter-user-experience-level-learner-label": "শিক্ষার্থী",
+       "rcfilters-filter-user-experience-level-learner-description": "যারা \"নবাগত\" ব্যবহারকারীদের চেয়ে বেশিসংখ্যক দিন ও বেশিবার সম্পাদনা করেছেন, কিন্তু \"অভিজ্ঞ ব্যবহারকারীদের\" চেয়ে কম করেছেন।",
        "rcfilters-filter-user-experience-level-experienced-label": "অভিজ্ঞ ব্যবহারকারী",
-       "rcfilters-filter-user-experience-level-experienced-description": "৩০ à¦¦à¦¿à¦¨à§\87র à¦¬à§\87শà§\80 à¦\95ারà§\8dযà¦\95লাপ à¦\93 à§«à§¦à§¦à¦\9fি à¦¸à¦®à§\8dপাদনা।",
+       "rcfilters-filter-user-experience-level-experienced-description": "৩০ à¦¦à¦¿à¦¨à§\87র à¦¬à§\87শি à¦¸à¦\95à§\8dরিয় à¦\86à¦\9bà§\87ন à¦\93 à§«à§¦à§¦à¦\9fির à¦¬à§\87শি à¦¸à¦®à§\8dপাদনা à¦\95রà§\87à¦\9bà§\87ন।",
        "rcfilters-filtergroup-automated": "স্বয়ংক্রিয় অবদান",
        "rcfilters-filter-bots-label": "বট",
        "rcfilters-filter-bots-description": "স্বয়ংক্রিয় সরঞ্জাম দিয়ে করা সম্পাদনা।",
        "rcfilters-filter-humans-label": "মানুষ (বট নয়)",
-       "rcfilters-filter-humans-description": "মানব à¦¸à¦®à§\8dপাদà¦\95 à¦¦à§\8dবারা করা সম্পাদনা।",
+       "rcfilters-filter-humans-description": "মানà§\81ষà§\87র করা সম্পাদনা।",
        "rcfilters-filtergroup-reviewstatus": "পর্যালোচনার অবস্থা",
        "rcfilters-filter-patrolled-label": "পরীক্ষিত",
        "rcfilters-filter-patrolled-description": "সম্পাদনা পরীক্ষিত হিসেবে চিহ্নিত করা হয়েছে।",
        "rcfilters-filter-unpatrolled-description": "সম্পাদনা পরীক্ষিত হিসেবে চিহ্নিত করা হয় নি।",
        "rcfilters-filtergroup-significance": "তাৎপর্য",
        "rcfilters-filter-minor-label": "অনুল্লেখ্য সম্পাদনা",
-       "rcfilters-filter-major-label": "অ-অনুল্লেখ্য সম্পাদনা",
+       "rcfilters-filter-minor-description": "যেসব সম্পাদনাকে লেখক অনুল্লেখ্য হিসেবে চিহ্নিত করেছেন।",
+       "rcfilters-filter-major-label": "অনুল্লেখ্য নয়, এমন সম্পাদনা",
+       "rcfilters-filter-major-description": "যেসব সম্পাদনাকে অনুল্লেখ্য হিসেবে চিহ্নিত করা হয়নি।",
        "rcfilters-filtergroup-changetype": "পরিবর্তনের ধরন",
        "rcfilters-filter-pageedits-label": "পাতার সম্পাদনা",
        "rcfilters-filter-pageedits-description": "উইকি বিষয়বস্তু, আলোচনা, বিষয়শ্রেণীর বিবরণ.... ইত্যাদিতে সম্পাদনা",
-       "rcfilters-filter-newpages-label": "পাতার সৃষ্টিকরণ",
+       "rcfilters-filter-newpages-label": "পাতা তৈরিকরণ",
        "rcfilters-filter-newpages-description": "সম্পাদনা যা নতুন পাতা তৈরি করেছে।",
        "rcfilters-filter-categorization-label": "বিষয়শ্রেণীর পরিবর্তন",
+       "rcfilters-filter-categorization-description": "বিষয়শ্রেণী পাতা সংযোজন বা অপসারণের তালিকা",
        "rcfilters-filter-logactions-label": "প্রবেশকৃত কার্য",
        "rcfilters-filter-logactions-description": "প্রশাসনিক কর্ম, অ্যাকাউন্ট সৃষ্টিকরণ, পাতা অপসারণ, আপলোড....",
+       "rcfilters-hideminor-conflicts-typeofchange-global": "\"অনুল্লেখ্য সম্পাদনা\" ছাঁকনিটির সাথে এক বা ততোধিক \"পরিবর্তনের ধরন\"-সংক্রান্ত ছাঁকনির সংঘর্ষ আছে, কারণ কিছু নির্দিষ্ট ধরনের সম্পাদনা \"অনুল্লেখ্য\" হিসেবে চিহ্নিত করা সম্ভব নয়। সংঘর্ষে থাকা ছাঁকনিগুলিকে উপরের \"সক্রিয় ছাঁকনিসমূহ\" এলাকাতে চিহ্নিত করা হয়েছে।",
+       "rcfilters-hideminor-conflicts-typeofchange": "কিছু নির্দিষ্ট ধরনের সম্পাদনা \"অনুল্লেখ্য\" হিসেবে চিহ্নিত করা সম্ভব নয়, তাই এই ছাঁকনিটির সাথে নিম্নোক্ত পরিবর্তনের ধরন ছাঁকনিগুলির সংঘর্ষ আছে: $1",
+       "rcfilters-typeofchange-conflicts-hideminor": "এই \"পরিবর্তনের ধরন\"-সংক্রান্ত ছাঁকনিটির সাথে \"অনুল্লেখ্য সম্পাদনা\" ছাঁকনিটির সংঘর্ষ আছে। কিছু নির্দিষ্ট ধরনের সম্পাদনা \"অনুল্লেখ্য\" হিসেবে চিহ্নিত করা সম্ভব নয়।",
        "rcnotefrom": "<strong>$2</strong>টা থেকে সংঘটিত পরিবর্তনগুলি (সর্বোচ্চ <strong>$1টি</strong> দেখানো হয়েছে)।",
+       "rclistfromreset": "তারিখ নির্বাচন পুনঃস্থাপন করুন",
        "rclistfrom": "$2, $3 তারিখের পর সংঘটিত নতুন পরিবর্তনগুলো দেখাও",
        "rcshowhideminor": "অনুল্লেখ্য পরিবর্তনগুলো $1",
        "rcshowhideminor-show": "দেখাও",
-       "rcshowhideminor-hide": "à¦\86ড়াল à¦\95রো",
+       "rcshowhideminor-hide": "লà§\81à¦\95িয়à§\87 à¦°à¦¾à¦\96ো",
        "rcshowhidebots": "বটগুলো $1",
        "rcshowhidebots-show": "দেখাও",
-       "rcshowhidebots-hide": "à¦\86ড়াল à¦\95রো",
+       "rcshowhidebots-hide": "লà§\81à¦\95িয়à§\87 à¦°à¦¾à¦\96ো",
        "rcshowhideliu": "নিবন্ধিত ব্যবহারকারীদের $1",
        "rcshowhideliu-show": "দেখাও",
-       "rcshowhideliu-hide": "à¦\86ড়াল à¦\95রো",
+       "rcshowhideliu-hide": "লà§\81à¦\95িয়à§\87 à¦°à¦¾à¦\96ো",
        "rcshowhideanons": "বেনামী ব্যবহারকারীদের $1",
        "rcshowhideanons-show": "দেখাও",
-       "rcshowhideanons-hide": "à¦\86ড়াল à¦\95রো",
+       "rcshowhideanons-hide": "লà§\81à¦\95িয়à§\87 à¦°à¦¾à¦\96ো",
        "rcshowhidepatr": "পরীক্ষিত সম্পাদনা $1",
        "rcshowhidepatr-show": "দেখাও",
-       "rcshowhidepatr-hide": "à¦\86ড়াল à¦\95রো",
+       "rcshowhidepatr-hide": "লà§\81à¦\95িয়à§\87 à¦°à¦¾à¦\96ো",
        "rcshowhidemine": "আমার সম্পাদনাগুলো $1",
        "rcshowhidemine-show": "দেখাও",
-       "rcshowhidemine-hide": "à¦\86ড়াল à¦\95রো",
+       "rcshowhidemine-hide": "লà§\81à¦\95িয়à§\87 à¦°à¦¾à¦\96ো",
        "rcshowhidecategorization": "পাতা শ্রেণীবদ্ধকরণ $1",
        "rcshowhidecategorization-show": "দেখাও",
-       "rcshowhidecategorization-hide": "à¦\86ড়াল à¦\95রো",
+       "rcshowhidecategorization-hide": "লà§\81à¦\95িয়à§\87 à¦°à¦¾à¦\96ো",
        "rclinks": "'''প্রদর্শনের ধরন'''<br />\n* বিগত ($2) দিনের শেষ ($1)টি পরিবর্তন দেখাও\n* $3",
        "diff": "পরিবর্তন",
        "hist": "ইতিহাস",
-       "hide": "দà§\87à¦\96িà¦\93 à¦¨à¦¾",
+       "hide": "লà§\81à¦\95িয়à§\87 à¦°à¦¾à¦\96à§\8b",
        "show": "দেখাও",
        "minoreditletter": "অ",
        "newpageletter": "ন",
        "rc-change-size-new": "পরিবর্তনের পর $1 {{PLURAL:$1|বাইট}}",
        "newsectionsummary": "/* $1 */ নতুন অনুচ্ছেদ",
        "rc-enhanced-expand": "বিস্তারিত দেখাও",
-       "rc-enhanced-hide": "বিসà§\8dতারিত à¦²à§\81à¦\95াà¦\93",
+       "rc-enhanced-hide": "বিসà§\8dতারিত à¦²à§\81à¦\95িয়à§\87 à¦°à¦¾à¦\96à§\8b",
        "rc-old-title": "মূলত \"$1\" হিসাবে তৈরী করা হয়েছিল",
        "recentchangeslinked": "সম্পর্কিত পরিবর্তন",
        "recentchangeslinked-feed": "সম্পর্কিত পরিবর্তন",
        "fileexists-shared-forbidden": "অংশীদারী ফাইল ভাণ্ডারে এই নামের একটি ফাইল ইতিমধ্যেই বিদ্যমান।\nআপনি যদি এখনো ফাইলটি আপলোড করতে চান, তবে অনুগ্রহপূর্বক পেছনে গিয়ে একটি নতুন নামে ফাইলটি আপলোড করুন।[[File:$1|thumb|center|$1]]",
        "fileexists-no-change": "আপলোডটি <strong>[[:$1]]</strong>-এর বর্তমান সংস্করণের হুবহু প্রতিলিপি।",
        "fileexists-duplicate-version": "এই আপলোডটি <strong>[[:$1]]</strong>-এর একটি {{PLURAL:$2|পুরনো সংস্করণের}} হুবহু প্রতিলিপি।",
-       "file-exists-duplicate": "এই ফাইলটি নিচের {{PLURAL:$1|ফাইল|ফাইলগুলির}} অনুলিপি:",
+       "file-exists-duplicate": "এই ফাইলটি নিচের {{PLURAL:$1|ফাইলটির|ফাইলগুলির}} অবিকল প্রতিলিপি:",
        "file-deleted-duplicate": "এই ফাইলটির মত একটি ফাইল ([[:$1]]) পূর্বে অপসারণ করা হয়েছে।\nপুনরায় আপলোড করার পূর্বে আপনার উচিত আগের ফাইলটির অপসারণের কারণ জানা।",
+       "file-deleted-duplicate-notitle": "এই ফাইলটির মত হুবহু একটি ফাইল আগেই মুছে ফেলা হয়েছে, এবং শিরোনামটিও অবলোপন করা হয়েছে। \nএই ফাইলটিকে পুনরায় আপলোড করার আগে এমন কাউকে জিজ্ঞাসা করে নিন যিনি অবলুপ্ত ফাইল উপাত্তগুলি দেখার ক্ষমতা রাখেন বলে এই পরিস্থিতিটি পর্যালোচনা করতে পারেন।",
        "uploadwarning": "আপলোড সতর্কবাণী",
        "uploadwarning-text": "অনুগ্রহ করে নিচে ফাইলের বর্ণনা পরিবর্তন করে আবার চেষ্টা করুন।",
        "savefile": "সংরক্ষণ",
        "uploaddisabledtext": "ফাইল আপলোড নিষ্ক্রিয়।",
        "php-uploaddisabledtext": "পিএইপি -এ ফাইল আপলোড নিস্ক্রিয় রয়েছে।\nঅনুগ্রহ করে file_uploads সেটিং পরীক্ষা করুন।",
        "uploadscripted": "এই ফাইলে এমন HTML বা স্ক্রিপ্ট কোড আছে যা একটি ওয়েব ব্রাউজার ভুল বুঝতে পারে।",
+       "upload-scripted-pi-callback": "এক্সএমএল-স্টাইলশিট প্রক্রিয়াকরণ নির্দেশনাবিশিষ্ট কোন ফাইল আপলোড করা সম্ভব নয়।",
+       "upload-scripted-dtd": "SVG ফাইল আপলোড করা যাবে না যা অ-মানক DTD ঘোষণা ধারণ করে।",
        "uploaded-script-svg": "আপলোডকৃত SVG ফাইলে স্ক্রিপ্টযোগ্য উপাদান \"$1\" পাওয়া গেছে।",
        "uploaded-hostile-svg": "আপলোড করা SVG ফাইলের শৈলী উপাদানে অনিরাপদ সিএসএস পাওয়া গেছে।",
+       "uploaded-event-handler-on-svg": "এসভিজি ফাইলের জন্য <code>$1=\"$2\"</code> ইভেন্ট-হ্যান্ডলার বৈশিষ্ট্যটি নির্ধারণ করা অনুমোদিত নয়।",
+       "uploaded-href-attribute-svg": "এসভিজি ফাইলের href বৈশিষ্ট্যগুলির জন্য কেবলমাত্র http:// বা https:// লক্ষ্যগুলি অনুমোদিত; কিন্তু <code>&lt;$1 $2=\"$3\"&gt;</code> পাওয়া গেছে।",
        "uploaded-href-unsafe-target-svg": "অনিরাপদ উপাত্তে href পাওয়া গেছে: আপলোডকৃত SVG ফাইলে URI লক্ষ্য ছিল <code>&lt;$1 $2=\"$3\"&gt;</code>।",
+       "uploaded-animate-svg": "\"animate\" ট্যাগটি পাওয়া গেছে যা আপলোডকৃত এসভিজি ফাইলের <code>&lt;$1 $2=\"$3\"&gt;</code> - এই \"from\" অ্যাট্রিবিউটটি ব্যবহার করে href পরিবর্তন করতে পারে।",
+       "uploaded-setting-event-handler-svg": "ইভেন্ট-হ্যান্ডলার অ্যাট্রিবিউট নির্ধারণ করতে বাধা দেওয়া হয়েছে। আপলোডকৃত এসভিজি ফাইলে <code>&lt;$1 $2=\"$3\"&gt;</code> খুঁজে পাওয়া গেছে।",
+       "uploaded-setting-href-svg": "\"set\" ট্যাগটি ব্যবহার করে \"href\" অ্যাট্রিবিউট পিতৃ-উপাদানে যোগ করতে বাধাদান করা হয়েছে।",
+       "uploaded-wrong-setting-svg": "\"set\" ট্যাগটি ব্যবহার করে যেকোন অ্যাট্রিবিউটে কোন রিমোট/ডাটা/স্ক্রিপ্ট লক্ষ্য যোগ করতে বাধা দেওয়া হয়েছে। আপলোডকৃত এসভিজি ফাইলে <code>&lt;set to=\"$1\"&gt;</code> খুঁজে পাওয়া গেছে।",
+       "uploaded-setting-handler-svg": "যে এসভিজি ফাইল রিমোট/ডাটা/স্ক্রিপ্ট দিয়ে \"handler\" অ্যাট্রিবিউটটি নির্ধারণ করে, সেটিকে বাধা দেওয়া হয়েছে। আপলোডকৃত এসভিজি ফাইলে <code>$1=\"$2\"</code> খুঁজে পাওয়া গেছে।",
+       "uploaded-remote-url-svg": "যে এসভিজি ফাইল রিমোট ইউআরএল দিয়ে যেকোন শৈলী অ্যাট্রিবিউটট নির্ধারণ করে, সেটিকে বাধা দেওয়া হয়েছে। আপলোডকৃত এসভিজি ফাইলে <code>$1=\"$2\"</code> খুঁজে পাওয়া গেছে।",
        "uploaded-image-filter-svg": "আপলোডকৃত SVG ফাইলে URL: <code>&lt;$1 $2=\"$3\"&gt;</code> সহ ছবি পরিশোধক পাওয়া গেছে।",
        "uploadscriptednamespace": "এই SVG ফাইলে অবৈধ নামস্থান \"<nowiki>$1</nowiki>\" রয়েছে",
        "uploadinvalidxml": "আপলোডকৃত ফাইলে XML পার্স করা যাবে না।",
        "destfilename": "লক্ষ্য ফাইলের নাম:",
        "upload-maxfilesize": "ফাইলের সর্বোচ্চ আকার: $1",
        "upload-description": "ফাইলের বর্ণনা",
-       "upload-options": "আপলোড-অপশন",
+       "upload-options": "আপলোডের পছন্দগুলি",
        "watchthisupload": "এই ফাইলটি নজরে রাখুন",
        "filewasdeleted": "এই নামের একটি ফাইল পূর্বে আপলোড করা হয়েছিল এবং তারপর মুছে ফেলা হয়েছিল। আপনি ফাইলটি আবার আপলোড করার আগে $1 পরীক্ষা করে দেখুন।",
+       "filename-thumb-name": "এটিকে একটি ক্ষুদ্র প্রাকপ্রদর্শনকারী চিত্রের (thumbnail) শিরোনাম বলে মনে হচ্ছে। দয়া করে একই উইকিতে ক্ষুদ্র প্রাকপ্রদর্শনকারী চিত্র পুনরায় আপলোড করবেন না। অন্যথায় অনুগ্রহ করে ফাইলের নামটি ঠিক করুন যাতে এটির অর্থ আরও বেশি বোধগম্য হয়, এবং যাতে এটির সাথে কোন ক্ষুদ্র প্রাকপ্রদর্শনকারী চিত্রের উপসর্গ না থাকে।",
        "filename-bad-prefix": "আপনি যে ফাইলটি আপলোড করছেন, তার নাম '''\"$1\"''' দিয়ে শুরু হয়েছে। এ ধরনের নাম সাধারণত ডিজিটাল ক্যামেরাগুলি স্বয়ংক্রিয়ভাবে দিয়ে থাকে এবং এগুলি ব্যাখ্যামূলক নয়। অনুগ্রহ করে আপনার ফাইলের জন্য আরও ব্যাখ্যামূলক একটি নাম পছন্দ করুন।",
        "upload-proto-error": "ভুল প্রোটোকল",
        "upload-proto-error-text": "দূরবর্তী আপলোডের জন্য URLগুলি <code>http://</code> বা <code>ftp://</code> দিয়ে শুরু হওয়া আবশ্যক।",
        "upload-too-many-redirects": "এই ইউআরএলটিতে অনেক বেশি পুনর্নির্দেশনা রয়েছে",
        "upload-http-error": "একটি এইচটিটিপি ত্রুটি দেখা দিয়েছে: $1",
        "upload-copy-upload-invalid-domain": "এই ডোমেইন থেকে আপলোড সম্ভব নয়।",
+       "upload-foreign-cant-upload": "এই উইকি থেকে অনুরোধকৃত বহিঃস্থ ফাইল সংগ্রহশালাতে ফাইল আপলোড করার ক্ষমতা পূর্বসংজ্ঞায়িত নেই।",
+       "upload-foreign-cant-load-config": "বহিঃস্থ ফাইল সংগ্রহশালাতে ফাইল আপলোড করার জন্য পূর্বনির্ধারিত সংজ্ঞাগুলি লোড করা ব্যর্থ হয়েছে।",
        "upload-dialog-disabled": "এই ডায়ালগ ব্যবহার করে ফাইল আপলোড করা এই উইকিতে নিষ্ক্রিয় করা হয়েছে।",
        "upload-dialog-title": "ফাইল আপলোড করুন",
        "upload-dialog-button-cancel": "বাতিল",
        "upload-form-label-infoform-categories": "বিষয়শ্রেণীসমূহ",
        "upload-form-label-infoform-date": "তারিখ",
        "upload-form-label-own-work-message-generic-local": "আমি নিশ্চিত করছি যে আমি {{SITENAME}}-এর পরিষেবা এবং লাইসেন্সকরণ নীতির শর্তাবলী অনুসরণ করে এই ফাইল আপলোড করছি।",
+       "upload-form-label-not-own-work-message-generic-local": "{{SITENAME}}-এর নীতিমালা অনুযায়ী যদি আপনি এই ফাইলটি আপলোড করতে না পারেন, অনুগ্রহ করে এই কথোপকথনটি বন্ধ করুন এবং অন্য একটি পদ্ধতিতে চেষ্টা করুন।",
        "upload-form-label-not-own-work-local-generic-local": "এছাড়াও আপনি [[Special:Upload|ডিফল্ট আপলোডের পাতা]] চেষ্টা করতে পারেন।",
+       "upload-form-label-own-work-message-generic-foreign": "আমি বুঝেছি যে আমি একটি শেয়ারকৃত সংগ্রহশালায় এই ফাইলটি আপলোড করতে যাচ্ছি। আমি নিশ্চিত করছি যে আমি সেখানকার সেবা এবং লাইসেন্সের নীতিমালা মেনে কাজটি করছি।",
+       "upload-form-label-not-own-work-message-generic-foreign": "যদি আপনি শেয়ারকৃত সংগ্রহশালার নীতিমালা মেনে এই ফাইলটি আপলোড করতে না পারেন, তাহলে অনুগ্রহ করে এই কথোপকথনটি বন্ধ করুন এবং অন্য একটি উপায়ে চেষ্টা করুন।",
        "upload-form-label-not-own-work-local-generic-foreign": "এছাড়াও আপনি [[Special:Upload|{{SITENAME}}-এর আপলোডের পাতা]] ব্যবহার করার চেষ্টা করতে পারেন, যদি এই ফাইলটি তাদের নীতিমালা অধীনে সেখানে আপলোড করা যায়।",
        "backend-fail-stream": "\"$1\" ফাইলের স্ট্রিম দেখানো যাচ্ছে না।",
        "backend-fail-backup": "\"$1\" ফাইলের ব্যাকআপ তৈরী সম্ভব নয়।",
        "backend-fail-describe": "\"$1\" ফাইলের মেটাডাটা পরিবর্তন সম্ভব নয়।",
        "backend-fail-alreadyexists": "\"$1\" নামের একটি ফাইল আগে থেকেই রয়েছে।",
        "backend-fail-store": "\"$2\"-এ \"$1\" ফাইলটি সংরক্ষন করা সম্ভব নয়।",
-       "backend-fail-copy": "\"$1\" à¦«à¦¾à¦\87লà¦\9fি \"$2\"-তà§\87 à¦\85নà§\81লিপি করা সম্ভব নয়।",
+       "backend-fail-copy": "\"$1\" à¦«à¦¾à¦\87লà¦\9fি \"$2\"-à¦\8f à¦ªà§\8dরতিলিপি করা সম্ভব নয়।",
        "backend-fail-move": "\"$2\"-এ \"$1\" ফাইলটি স্থানান্তর করা সম্ভব নয়।",
        "backend-fail-opentemp": "অস্থায়ী ফাইলটি খোলা যাবে না।",
        "backend-fail-writetemp": "অস্থায়ী ফাইলটিতে লেখা যাচ্ছে না।",
        "backend-fail-usable": "\"$1\" ফাইলটিতে লেখা অথবা ফাইলটি পড়া যাচ্ছে না, কারণ সঠিক অনুমতি নেই অথবা ডিরেক্টরীটি নেই।",
        "filejournal-fail-dbconnect": "\"$1\" স্টোরেজ ব্যাকেন্ডের জার্নাল ডাটাবেজের সাথে যুক্ত হওয়া যাচ্ছে না।",
        "filejournal-fail-dbquery": "\"$1\" স্টোরেজ ব্যাকেন্ডের জার্নাল ডাটাবেজ হালনাগাদ করা যাচ্ছে না।",
-       "lockmanager-notlocked": "\"$1\" à¦\86নলà¦\95 à¦\95রা à¦¯à¦¾à¦\9aà§\8dà¦\9bà§\87 à¦¨à¦¾; à¦\8fà¦\9fি à¦²à¦\95 à¦\95রা à¦°à¦¯à¦¼à§\87à¦\9bà§\87।",
+       "lockmanager-notlocked": "\"$1\" à¦\96à§\8bলা à¦¯à¦¾à¦¯à¦¼à¦¨à¦¿; à¦\8fà¦\9fিà¦\95à§\87 à¦\85বরà§\81দà§\8dধ à¦\95রা à¦¹à¦¯à¦¼à¦¨à¦¿।",
        "lockmanager-fail-closelock": "\"$1\" ফাইলটি লক করা তাই বন্ধ করা যাচ্ছে না।",
-       "lockmanager-fail-deletelock": "\"$1\" à¦²à¦\95 à¦\95রা ফাইলটি অপসারণ সম্ভব নয়।",
+       "lockmanager-fail-deletelock": "\"$1\" à¦\85বরà§\8bধনিরà§\8dদà§\87শà¦\95 ফাইলটি অপসারণ সম্ভব নয়।",
        "lockmanager-fail-acquirelock": "\"$1\" লক করা ফাইল খুজে পাওয়া যাচ্ছে না।",
-       "lockmanager-fail-openlock": "\"$1\" à¦²à¦\95 à¦\95রা ফাইলটি খোলা সম্ভব নয়।",
+       "lockmanager-fail-openlock": "\"$1\" à¦\8fà¦\87 à¦\85বরà§\8bধনিরà§\8dদà§\87শà¦\95 ফাইলটি খোলা সম্ভব নয়।",
        "lockmanager-fail-releaselock": "\"$1\" লক করা ফাইলটি ছাড়া যাচ্ছে না।",
-       "lockmanager-fail-db-bucket": "$1 à¦\8fর à¦²à¦\95 à¦\95রা ডাটাবেজের সাথে যোগাযোগ করা যাচ্ছে না।",
+       "lockmanager-fail-db-bucket": "$1 à¦¬à¦¾à¦\95à§\87à¦\9fà¦\9fিতà§\87 à¦¯à¦¥à§\87ষà§\8dà¦\9f à¦¸à¦\82à¦\96à§\8dযà¦\95 à¦\85বরà§\8bধ ডাটাবেজের সাথে যোগাযোগ করা যাচ্ছে না।",
        "lockmanager-fail-db-release": "$1 ডাটাবেজের লক খোলা যাচ্ছে না।",
-       "lockmanager-fail-svr-acquire": "$1 সার্ভারের লক পাওয়া যাচ্ছে না।",
+       "lockmanager-fail-svr-acquire": "$1 সার্ভারে অবরোধগুলি পাওয়া যায়নি।",
        "lockmanager-fail-svr-release": "$1 ডাটাবেজের লক খোলা যাচ্ছে না।",
        "zip-file-open-error": "ফাইলটির জিপ পরীক্ষা করার সময় একটি ত্রুটি দেখা দিয়েছে।",
        "zip-wrong-format": "চিহ্নিত ফাইলটি কোনো জিপ ফাইল নয়।",
        "license": "লাইসেন্সকরণ:",
        "license-header": "লাইসেন্স প্রদান",
        "nolicense": "কিছুই নির্বাচন করা হয়নি",
-       "licenses-edit": "লাইসেন্স অপশন সম্পাদনা করুন",
+       "licenses-edit": "লাইসেন্স-সংক্রান্ত পছন্দগুলি সম্পাদনা করুন",
        "license-nopreview": "(প্রাকদর্শন লভ্য নয়)",
        "upload_source_url": " (আপনি একটি বৈধ, উন্মুক্ত URL থেকে ফাইল চয়ন করেছেন)",
        "upload_source_file": "(আপনার কম্পিউটারের একটি ফাইল)",
        "duplicatesoffile": "নিচের {{PLURAL:$1|ফাইলটি|$1 ফাইলগুলো}} এই ফাইলের প্রতিলিপি ([[Special:FileDuplicateSearch/$2|বিস্তারিত দেখুন]]):",
        "sharedupload": "এই ফাইলটি $1 থেকে নেওয়া হয়েছে এবং এবং অন্যান্য প্রকল্পেও ব্যবহৃত হতে পারে।",
        "sharedupload-desc-there": "এই ফাইলটি $1 থেকে দেখানো হচ্ছে এবং হয়তো এটি অন্যান্য প্রকল্পতেও ব্যবহৃত হয়েছে।\nঅনুগ্রহ করে বিস্তারিত জানার জন্য [$2 ফাইলটির বর্ণনা পাতা] দেখুন।",
-       "sharedupload-desc-here": "à¦\8fà¦\87 à¦«à¦¾à¦\87লà¦\9fি $1 à¦¥à§\87à¦\95à§\87 à¦\8fবà¦\82 à¦\85নà§\8dযানà§\8dয à¦ªà§\8dরà¦\95লà§\8dপà§\87 à¦¬à§\8dযবহà§\83ত à¦¹à¦¤à§\87 à¦ªà¦¾à¦°à§\87।\nà¦\8fর [$2 à¦«à¦¾à¦\87ল à¦¬à¦¿à¦¬à¦°à¦£ à¦ªà§\83ষà§\8dঠা] à¦\89পর à¦¬à¦°à§\8dণনা à¦¨à¦¿à¦®à§\8dনে দেখানো হলো।",
+       "sharedupload-desc-here": "à¦\8fà¦\87 à¦«à¦¾à¦\87লà¦\9fি $1 à¦¥à§\87à¦\95à§\87 à¦\86à¦\97ত à¦\8fবà¦\82 à¦\85নà§\8dযানà§\8dয à¦ªà§\8dরà¦\95লà§\8dপà§\87 à¦¬à§\8dযবহà§\83ত à¦¹à¦¤à§\87 à¦ªà¦¾à¦°à§\87।\nসà§\87à¦\96ানà§\87 à¦¥à¦¾à¦\95া [$2 à¦«à¦¾à¦\87লà¦\9fির à¦¬à¦¿à¦¬à¦°à¦£ à¦ªà¦¾à¦¤à¦¾à¦°] à¦¬à¦¿à¦¬à¦°à¦£ à¦¨à¦¿à¦\9aে দেখানো হলো।",
        "sharedupload-desc-edit": "এই ফাইলটি $1 থেকে এবং অন্যান্য প্রকল্পে ব্যবহৃত হতে পারে।\n[$2 ফাইলটির বর্ণনা পাতা] থেকে আপনি ফাইলটি বর্ণনা সম্পাদনা করতে পারেন।",
        "sharedupload-desc-create": "This file is from $1 and may be used by other projects.\nMaybe you want to edit the description on its [$2 file description page] there.",
        "filepage-nofile": "এই নামের কোন ফাইল নেই।",
        "shared-repo-from": "$1 থেকে",
        "shared-repo": "শেয়ার্ড রিপোজিটরী",
        "shared-repo-name-wikimediacommons": "উইকিমিডিয়া কমন্স",
+       "filepage.css": "/* এখানে সন্নিবেশিত সিএসএস ফাইলের বিবরণ পৃষ্ঠায় অন্তর্ভুক্ত হবে, এছাড়া বিদেশী ক্লায়েন্ট উইকিতেও অন্তর্ভুক্ত হবে */",
        "upload-disallowed-here": "আপনি এই ফাইলটি প্রতিস্থাপন করতে পারবেন না।",
        "filerevert": "$1 পূর্বাবস্থায় ফেরত নিন",
        "filerevert-legend": "ফাইল পূর্বাবস্থায় ফেরত নিন",
        "filerevert-submit": "ফেরত যাওয়া হোক",
        "filerevert-success": "'''[[Media:$1|$1]]''' ফাইলটি  [$3, $2-এর $4 সংস্করণে] ফেরত নেওয়া হয়েছে।",
        "filerevert-badversion": "প্রদত্ত তারিখ ও সময়ের জন্য এই ফাইলটির কোন স্থানীয় সংস্করণ নেই।",
-       "filedelete": "$1 মুছে ফেলা হোক",
-       "filedelete-legend": "ফাইল মুছে ফেলা হোক",
+       "filerevert-identical": "ফাইলটির বর্তমান সংস্করণের সাথে নির্বাচিত সংস্করণটির হুবহু মিল রয়েছে।",
+       "filedelete": "$1 অপসারণ করুন",
+       "filedelete-legend": "ফাইল অপসারণ করুন",
        "filedelete-intro": "আপনি '''[[Media:$1|$1]]''' ফাইলটি এর সমস্ত ইতিহাসহ অপসারণ করছেন।",
        "filedelete-intro-old": "আপনি '''[[Media:$1|$1]]''' ফাইলটির [$4 $3, $2] সংস্করণটি মুছে ফেলছেন।",
        "filedelete-comment": "কারণ:",
        "filedelete-nofile-old": "নির্দেশিত বৈশিষ্ট্যগুলির জন্য '''$1'''-এর কোন আর্কাইভ সংস্করণ নেই।",
        "filedelete-otherreason": "অন্য/বাড়তি কারণ:",
        "filedelete-reason-otherlist": "অন্য কারণ",
-       "filedelete-reason-dropdown": "*সাধারণ à¦\85পসারণà§\87র à¦\95ারণসমà§\82হ\n** à¦\95পিরাà¦\87à¦\9f à¦²à¦\99à§\8dà¦\98ন\n** à¦«à¦¾à¦\87লà§\87র à¦\85নà§\81লিপি",
+       "filedelete-reason-dropdown": "*à¦\85পসারণà§\87র à¦¸à¦¾à¦§à¦¾à¦°à¦£ à¦\95ারণসমà§\82হ\n** à¦\95পিরাà¦\87à¦\9f à¦²à¦\99à§\8dà¦\98ন\n** à¦\85বিà¦\95ল à¦ªà§\8dরতিলিপিà¦\95à§\83ত à¦«à¦¾à¦\87ল",
        "filedelete-edit-reasonlist": "অপসারণের কারণ সম্পাদনা",
        "filedelete-maintenance": "রক্ষণাবেক্ষণের সময় ফাইল অপরাসণ এবং পুনরুদ্ধার সাময়িকভাবে নিস্ক্রিয় রয়েছে।",
        "filedelete-maintenance-title": "ফাইলটি অপসারণ করা সম্ভব নয়",
        "statistics-users": "নিবন্ধিত [[Special:ListUsers|ব্যবহারকারী]]",
        "statistics-users-active": "সক্রিয় ব্যবহারকারী",
        "statistics-users-active-desc": "ব্যবহারকারী যারা বিগত {{PLURAL:$1|দিনে|$1 দিনে}} একটি কাজ করেছেন।",
-       "pageswithprop": "পাতার à¦\89পাদান à¦¸à¦®à§\8dবলিত à¦ªà§\83ষà§\8dঠাসমূহ",
+       "pageswithprop": "পাতার à¦¬à§\88শিষà§\8dà¦\9fà§\8dয à¦¸à¦®à§\8dবলিত à¦ªà¦¾à¦¤াসমূহ",
        "pageswithprop-legend": "পাতার উপাদান সম্বলিত পৃষ্ঠাসমূহ",
        "pageswithprop-text": "একটি নির্দিষ্ট পাতার বৈশিষ্ট রয়েছে এমন পাতাসমূহের তালিকা।",
        "pageswithprop-prop": "বৈশিষ্টের নাম:",
        "uncategorizedcategories": "যেসব বিষয়শ্রেণীর শ্রেণীকরণ প্রয়োজন",
        "uncategorizedimages": "যেসব ফাইলের শ্রেণীকরণ প্রয়োজন",
        "uncategorizedtemplates": "যেসব টেমপ্লেটের বিষয়শ্রেণী নেই",
+       "uncategorized-categories-exceptionlist": "# এখানে এমন কিছু বিষয়শ্রেণীর একটি তালিকা থাকবে, যেগুলি Special:UncategorizedCategories পাতায় উল্লেখ করা উচিত নয়। প্রতি লাইনে একটি করে থাকবে, প্রতিটি লাইন \"*\" অক্ষর দিয়ে শুরু করতে হবে। যেসব লাইন অন্য কোন অক্ষর (এমনকি ফাঁকা স্থান-ও) দিয়ে শুরু হলে সেটিকে অগ্রাহ্য করা হবে। মন্তব্যের জন্য \"#\" ব্যবহার করুন।",
        "unusedcategories": "অব্যবহৃত বিষয়শ্রেণীসমূহ",
        "unusedimages": "অব্যবহৃত ফাইলসমূহ",
        "wantedcategories": "বাঞ্ছনীয় বিষয়শ্রেণীগুলি",
        "wantedpages": "বাঞ্ছনীয় পাতাগুলি",
+       "wantedpages-summary": "অন্য পাতাগুলি থেকে সবচেয়ে বেশি সংযোগ দেওয়া কিন্তু অবর্তমান পাতাগুলির তালিকা। যেসব অবর্তমান পাতাতে কেবলমাত্র পুনর্নির্দেশ থেকে সংযোগ দেওয়া আছে, সেগুলি এই তালিকাতে অন্তর্ভুক্ত নয়। যেসব অবর্তমান পাতাতে পুনর্নির্দেশগুলি থেকে সংযোগ দেওয়া আছে, সেগুলির তালিকার জন্য [[{{#special:BrokenRedirects}}|অকার্যকর পুনর্নির্দেশনাগুলির তালিকা]] দেখুন।",
        "wantedpages-badtitle": "ফলাফলে ভুল শিরনাম: $1",
        "wantedfiles": "আবশ্যিক ফাইলসমূহ",
        "wantedfiletext-cat": "নিচের ফাইলগুলো ব্যবহৃত হচ্ছে কিন্তু এগুলো অপসারিত হয়েছে। অন্যান্য রিপোজিটরী থেকে ব্যবহৃত ফাইলগুলো এভাবে প্রদর্শিত হতে পারে। এই ধরনের কোন ফাইল খুজে পেলে <del>অপসারণ করুন</del>। এছাড়া অপসারিত হয়েছে এমন ছবির সংযোগ রয়েছে এমন পাতাসমূহের লিংক পাওয়া যাবে এখানে [[:$1]]।",
+       "wantedfiletext-cat-noforeign": "নিম্নোক্ত ফাইলগুলি ব্যবহৃত হচ্ছে কিন্তু এগুলির অস্তিত্ব নেই। এছাড়া, যেসব পাতাতে অস্তিত্বহীন ফাইল গ্রথিত আছে, সেগুলির তালিকা [[:$1]]-এ পাওয়া যাবে।",
        "wantedfiletext-nocat": "নিচের ফাইলগুলো ব্যবহৃত হচ্ছে কিন্তু এগুলো অপসারিত হয়েছে। অন্যান্য রিপোজিটরী থেকে ব্যবহৃত ফাইলগুলো এভাবে প্রদর্শিত হতে পারে। এই ধরনের ভূলগুলো শিঘ্রই <del>অপসারিত হবে</del>।",
        "wantedfiletext-nocat-noforeign": "নিম্নলিখিত ফাইলসমূহ ব্যবহৃত হয়েছে কিন্তু এর অস্তিত্ব নেই।",
        "wantedtemplates": "আবশ্যিক টেমপ্লেটসমূহ",
        "protectedpages-indef": "শুধুমাত্র অসীম সুরক্ষা",
        "protectedpages-summary": "এই পাতাটি বর্তমানে সুরক্ষিত থাকা বিদ্যমান পাতগুলির তালিকা। সৃষ্টি করা থেকে সুরক্ষিত রয়েছে এমন পাতার তালিকার জন্য, [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]] দেখুন।",
        "protectedpages-cascade": "শুধুমাত্র প্রপাতাকার সুরক্ষা",
-       "protectedpages-noredirect": "পà§\81নরà§\8dনিরà§\8dদà§\87শনাà¦\97à§\81লà§\8b à¦²à§\81à¦\95াà¦\93",
+       "protectedpages-noredirect": "পà§\81নরà§\8dনিরà§\8dদà§\87শনাà¦\97à§\81লà§\8b à¦²à§\81à¦\95ান",
        "protectedpagesempty": "কোন পাতা বর্তমানে এই প্যারামিটারগুলিসহ সুরক্ষিত নয়।",
        "protectedpages-timestamp": "সময়বার্তা",
        "protectedpages-page": "পাতা",
        "apisandbox": "এপিআই খেলাঘর",
        "apisandbox-jsonly": "API খেলাঘর ব্যবহার করতে জাভাস্ক্রিপ্ট প্রয়োজন।",
        "apisandbox-api-disabled": "এপিআই এই সাইটে নিষ্ক্রিয় করা আছে।",
+       "apisandbox-intro": "<strong>মিডিয়াউইকি ওয়েব সেবা এপিআই</strong> নিয়ে পরীক্ষানিরীক্ষা চালাতে এই পাতাটি ব্যবহার করুন। \nএপিআই ব্যবহারের উপর বিস্তারিত জানতে [[mw:API:Main page|এপিআই নথিপত্র]] দেখুন।\nউদাহরণ: [https://www.mediawiki.org/wiki/API#A_simple_example প্রধান পাতার বিষয়বস্তু পান]। আরও উদাহরণ দেখার জন্য একটি কর্ম নির্বাচন করুন।\n\nলক্ষ করুন যে যদিও এটি একটি খেলাঘর, তা সত্ত্বেও এই পাতায় করা আপনার সম্পাদনাগুলি উইকিতে পরিবর্তন সাধন করতে পারে।",
        "apisandbox-fullscreen": "প্যানেল সম্প্রসারণ করুন",
        "apisandbox-fullscreen-tooltip": "ব্রাউজারের উইন্ডো পূরণ করতে খেলাঘরের প্যানেল প্রসারিত করুন।",
        "apisandbox-unfullscreen": "পাতা দেখাও",
        "apisandbox-unfullscreen-tooltip": "খেলাঘরের প্যানেল হ্রাস করুন, তাহলে মিডিয়াউইকি পরিভ্রমণ করার সংযোগগুলি পাওয়া যাবে।",
        "apisandbox-submit": "অনুরোধ রাখুন",
-       "apisandbox-reset": "পরিস্কার",
+       "apisandbox-reset": "পরিষ্কার",
        "apisandbox-retry": "পুনঃচেষ্টা করুন",
        "apisandbox-loading": "\"$1\" এপিআই মডিউলের জন্য তথ্য লোড হচ্ছে...",
        "apisandbox-load-error": "\"$1\" এপিআই মডিউলের জন্য তথ্য লোড করার সময় একটি ত্রুটি ঘটেছে: $2",
        "apisandbox-alert-page": "এই পাতার ঘরগুলো বৈধ নয়।",
        "apisandbox-alert-field": "এই ক্ষেত্রের মান বৈধ নয়।",
        "apisandbox-continue": "অব্যাহত",
-       "apisandbox-continue-clear": "পরিস্কার",
+       "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": "বà¦\87য়à§\87র à¦\89à§\8eসà§\87র à¦\9cনà§\8dয à¦\85নà§\81সনà§\8dধান à¦\95রা à¦¹à§\8bà¦\95",
+       "booksources-search-legend": "বà¦\87য়à§\87র à¦\89à§\8eসà§\87র à¦\9cনà§\8dয à¦\85নà§\81সনà§\8dধান à¦\95রà§\81ন",
        "booksources-isbn": "আইএসবিএন:",
        "booksources-search": "অনুসন্ধান",
        "booksources-text": "নতুন ও পুরাতন ব্যবহৃত বই বিক্রি করে, এমন কতগুলি সাইটের সংযোগের তালিকা নিচে দেওয়া হল, যে সাইটগুলিতে আপনার অনুসন্ধানকৃত বইগুলির উপর আরও তথ্য থাকতে পারে:",
        "magiclink-tracking-isbn": "আইএসবিএন জাদু সংযোগ ব্যবহার করা পাতা",
        "magiclink-tracking-isbn-desc": "এই পাতাটি আইএসবিএন যাদু সংযোগ ব্যবহার করে। কিভাবে মাইগ্রেট করবেন জানতে [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] দেখুন।",
        "specialloguserlabel": "সম্পাদক:",
-       "speciallogtitlelabel": "লà¦\95à§\8dষà§\8dয (শিরà§\8bনাম à¦¬à¦¾ {{ns:user}}:বà§\8dযবহারà¦\95ারà§\80র à¦\9cনà§\8dয ব্যবহারকারী নাম):",
+       "speciallogtitlelabel": "লà¦\95à§\8dষà§\8dয (বà§\8dযবহারà¦\95ারà§\80র à¦\9cনà§\8dয à¦¶à¦¿à¦°à§\8bনাম à¦¬à¦¾ {{ns:user}}:ব্যবহারকারী নাম):",
        "log": "লগগুলি",
        "logeventslist-submit": "দেখাও",
        "all-logs-page": "সব প্রকাশ্য লগ",
        "allpagesprefix": "এই উপসর্গবিশিষ্ট পাতাগুলো দেখাও:",
        "allpagesbadtitle": "প্রদত্ত পাতার শিরোনামটি অবৈধ ছিল অথবা এটিতে কোন আন্তঃভাষা বা আন্তঃউইকি উপসর্গ ছিল। এটিতে এক বা একাধিক ক্যারেক্টার থাকতে পারে যা শিরোনামে ব্যবহার করা সম্ভব নয়।",
        "allpages-bad-ns": "{{SITENAME}}-এ \"$1\" নামের কোন নামস্থান নেই।",
-       "allpages-hide-redirects": "পà§\81নরà§\8dনিরà§\8dদà§\87শনাà¦\97à§\81লà§\8b à¦²à§\81à¦\95াà¦\93",
+       "allpages-hide-redirects": "পà§\81নরà§\8dনিরà§\8dদà§\87শনাà¦\97à§\81লà§\8b à¦²à§\81à¦\95ান",
        "cachedspecial-viewing-cached-ttl": "আপনি এই পৃষ্ঠায় একটি ক্যাশে সংস্করণ দেখছেন, যা $1 দিনের পুরানো হতে পারে।",
        "cachedspecial-viewing-cached-ts": "আপনি এই পৃষ্ঠায় একটি ক্যাশে সংস্করণ দেখছেন, যা সম্পূর্ণরূপে হালনাগাদকৃত নাও হতে পারে।",
        "cachedspecial-refresh-now": "সাম্প্রতিকগুলো প্রদর্শন করো।",
        "listusersfrom": "সেই সব ব্যবহারকারী দেখাও যাদের নাম এই অক্ষর দিয়ে শুরু:",
        "listusers-submit": "দেখাও",
        "listusers-noresult": "কোন ব্যবহারকারী খুঁজে পাওয়া যায়নি।",
-       "listusers-blocked": "(বà§\8dলà¦\95à¦\95à§\83ত)",
+       "listusers-blocked": "(বাধাপà§\8dরাপà§\8dত)",
        "activeusers": "সক্রিয় ব্যবহারকারী তালিকা",
        "activeusers-intro": "এটি ব্যবহারকারী তালিকা যাদের $1 {{PLURAL:$1|দিনে|দিনে}} যেকোন কর্মকান্ড রয়েছে।",
        "activeusers-count": "গত {{PLURAL:$3|কালে|$3 দিনে}} সর্বমোট {{PLURAL:$1|কর্মের}} সংখ্যা $1টি",
        "activeusers-excludegroups": "এই দলভুক্ত ব্যবহারকারী বাদ দিন:",
        "activeusers-noresult": "কোনো ব্যবহারকারী পাওয়া যায়নি।",
        "activeusers-submit": "সক্রিয় ব্যবহারকারী প্রদর্শন করুন",
-       "listgrouprights": "দলà¦\97ত à¦¬à§\8dযবহারà¦\95ারà§\80 অধিকার",
-       "listgrouprights-summary": "à¦\8fà¦\87 à¦\89à¦\87à¦\95ির à¦¬à§\8dযবহারà¦\95ারà§\80দà§\87র à¦\8fà¦\95à¦\9fি à¦\97à§\8dরà§\81পà¦\97à§\81লà§\8bর à¦¤à¦¾à¦²à¦¿à¦\95া à¦¦à§\87à¦\96ানà§\8b à¦¹à¦\9aà§\8dà¦\9bà§\87, à¦¸à¦¾à¦¥à§\87 à¦\97à§\8dরà§\81পà§\87র à¦\95ারà§\8dযপরিধিà¦\93 à¦\89লà§\8dলà§\87à¦\96 à¦\95রা à¦¹à¦¯à¦¼à§\87à¦\9bà§\87।\nনিরà§\8dদিষà§\8dà¦\9f à¦\97à§\8dরà§\81পà§\87র à¦\95ারà§\8dযপরিধি à¦¸à¦®à§\8dপরà§\8dà¦\95à§\87 à¦\9cানতà§\87 [[{{MediaWiki:Listgrouprights-helppage}}|à¦\85তিরিà¦\95à§\8dত à¦¤à¦¥à§\8dয]] à¦¦à§\87à¦\96à§\81ন।",
-       "listgrouprights-key": "লিà¦\9cà§\87নà§\8dড:\n* <span class=\"listgrouprights-granted\">à¦\85নà§\81মà§\8bদিত à¦\85ধিà¦\95ার</span>\n* <span class=\"listgrouprights-revoked\">বাধাপà§\8dরাপà§\8dত অধিকার</span>",
+       "listgrouprights": "বà§\8dযবহারà¦\95ারà§\80র à¦¦à¦²à¦\97ত অধিকার",
+       "listgrouprights-summary": "à¦\8fà¦\87 à¦\89à¦\87à¦\95িতà§\87 à¦¸à¦\82à¦\9cà§\8dà¦\9eায়িত à¦¬à§\8dযবহারà¦\95ারà§\80 à¦¦à¦²à¦\97à§\81লির à¦\8fà¦\95à¦\9fি à¦¤à¦¾à¦²à¦¿à¦\95া à¦¨à¦¿à¦\9aà§\87 à¦¦à§\87à¦\96ানà§\8b à¦¹à¦\9aà§\8dà¦\9bà§\87, à¦¸à¦¾à¦¥à§\87 à¦¦à¦²à§\87র à¦¸à¦¾à¦¥à§\87 à¦¸à¦\82শà§\8dলিষà§\8dà¦\9f à¦\85ধিà¦\95ারসমà§\82হà¦\93 à¦\89লà§\8dলà§\87à¦\96 à¦\95রা à¦¹à¦¯à¦¼à§\87à¦\9bà§\87।\nনিরà§\8dদিষà§\8dà¦\9f à¦¬à§\8dযà¦\95à§\8dতির à¦\85ধিà¦\95ারà¦\97à§\81লি à¦¸à¦®à§\8dপরà§\8dà¦\95à§\87 [[{{MediaWiki:Listgrouprights-helppage}}|à¦\85তিরিà¦\95à§\8dত à¦¤à¦¥à§\8dয]] à¦¥à¦¾à¦\95তà§\87 à¦ªà¦¾à¦°à§\87।",
+       "listgrouprights-key": "বà§\8dযাà¦\96à§\8dযা:\n* <span class=\"listgrouprights-granted\">à¦\85নà§\81মà§\8bদিত à¦\85ধিà¦\95ার</span>\n* <span class=\"listgrouprights-revoked\">পà§\8dরতà§\8dযাহারà¦\95à§\83ত অধিকার</span>",
        "listgrouprights-group": "দল",
        "listgrouprights-rights": "অধিকারসমূহ",
        "listgrouprights-helppage": "Help:দলের অধিকার",
        "listgrouprights-removegroup-self-all": "নিজের অ্যাকাউন্ট থেকে সকল দল অপসারণ",
        "listgrouprights-namespaceprotection-header": "নামস্থান নিষেধাজ্ঞাসমূহ",
        "listgrouprights-namespaceprotection-namespace": "নামস্থান",
-       "listgrouprights-namespaceprotection-restrictedto": "à¦\85ধিà¦\95ার à¦¯à¦¾ à¦¬à§\8dযবহারà¦\95ারà§\80à¦\95à§\87 সম্পাদনা করার অনুমতি দেয়",
+       "listgrouprights-namespaceprotection-restrictedto": "à¦\8fà¦\87 à¦\85ধিà¦\95ারà¦\9fি à¦¬à§\8dযবহারà¦\95ারà§\80à¦\95à§\87 à¦¯à¦¾ সম্পাদনা করার অনুমতি দেয়",
        "listgrants": "কার্যভার",
        "listgrants-summary": "নিম্নে ব্যবহারকারী অধিকারের সাথে যুক্ত প্রবেশাধিকারসহ তাদের কার্যভারের একটি তালিকা দেয়া হয়েছে। ব্যবহারকারীরা তাদের অ্যাকাউন্ট ব্যবহার করতে অ্যাপ্লিকেশনকে অনুমোদন দিতে পারে, কিন্তু কার্যভারের উপর ভিত্তি করে সীমিত অনুমতি ব্যবহারকারীরা অ্যাপ্লিকেশনকে দিতে পারবেন। মূলত, একটি অ্যাপ্লিকেশন একজন ব্যবহারকারীর দেয়া অধিকারের অতিরিক্ত অধিকার ব্যবহার করতে পারবে না। পৃথক অধিকার সম্পর্কে [[{{MediaWiki:Listgrouprights-helppage}}|অতিরিক্ত তথ্য]] দেখুন।",
        "listgrants-grant": "কার্যভার",
        "listgrants-rights": "অধিকারসমূহ",
        "trackingcategories": "বিষয়শ্রেণীসমূহ অনুসরণ করা হচ্ছে",
+       "trackingcategories-summary": "এই পাতাতে মিডিয়াউইকি সফটওয়্যার দ্বারা স্বয়ংক্রিয়ভাবে সৃষ্ট অনুসরণকারী বিষয়শ্রেণীগুলির তালিকা আছে। সংশ্লিষ্ট সিস্টেম বার্তাগুলিকে {{ns:8}} নামস্থানে পরিবর্তন করে এগুলির নাম পরিবর্তন করা যাবে।",
        "trackingcategories-msg": "বিষয়শ্রেণী অনুসরণ করা হচ্ছে",
        "trackingcategories-name": "বার্তা নাম",
        "trackingcategories-desc": "বিষয়শ্রেণী অন্তর্ভুক্তির মানদণ্ড",
        "restricted-displaytitle-ignored": "উপেক্ষিত প্রদর্শন শিরোনামসহ পাতা",
        "restricted-displaytitle-ignored-desc": "পাতাটি একটি <code><nowiki>{{DISPLAYTITLE}}</nowiki></code> উপেক্ষা করেছে কারণ এটা পাতাটির আসল শিরোনামের সাথে সমতুল্য নয়।",
+       "noindex-category-desc": "এই পাতাটি রোবটদের দ্বারা সূচীভুক্ত করা হয়নি কারণ এটিতে <code><nowiki>__NOINDEX__</nowiki></code> জাদুশব্দটি আছে এবং এটি এমন একটি নামস্থানে আছে যেখানে এই ধরনের চিহ্নিতকরণ অনুমোদিত।",
+       "index-category-desc": "এই পাতাটিতে একটি <code><nowiki>__INDEX__</nowiki></code> আছে (এবং পাতাটি এমন একটি নামস্থানে অবস্থিত যেখানে এই ধরনের চিহ্নিতকরণ সম্ভব) এবং এ কারণে রোবটগুলি এ পাতাটিকে তাদের সূচীভূক্ত করে, যদিও সাধারণত এমনটি হবার কথা নয়।",
+       "post-expand-template-inclusion-category-desc": "সবগুলি টেমপ্লেট প্রসারিত করলে পাতার আকার <code>$wgMaxArticleSize</code>-এর চেয়ে বেশি হয়ে যায়, তাই কিছু টেমপ্লেট প্রসারিত করা হয়নি।",
+       "post-expand-template-argument-category-desc": "একটি টেমপ্লেট আর্গুমেন্ট সম্প্রসারণ করার পর (<code>{{{Foo}}}</code> এরকম করে তিনটি দ্বিতীয় বন্ধনীতে আবদ্ধ কোনওকিছু) পাতাটি <code>$wgMaxArticleSize</code>-এর চেয়ে বেশি বড় হয়ে গেছে।",
+       "expensive-parserfunction-category-desc": "পাতাটি অতিরিক্ত সংখ্যক ব্যয়বহুল পার্সার ফাংশন (<code>#ifexist</code>-এর মত) ব্যবহার করছে। [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit] দেখুন।",
        "broken-file-category-desc": "এই পাতায় একটি ভাঙ্গা ফাইলের লিঙ্ক রয়েছে (একটি ফাইল এম্বেড করার জন্য একটি লিঙ্ক যখন ফাইলটির অস্তিত্ব নেই)",
        "hidden-category-category-desc": "এই বিষয়শ্রেণীটির পাতার বিষয়বস্তুর মধ্যে <code><nowiki>__HIDDENCAT__</nowiki></code> উপস্থিত রয়েছে, যা পূর্ব-নির্ধারিতভাবে পাতার বিষয়শ্রেণীর সংযোগে দেখায় না।",
        "trackingcategories-nodesc": "কোন বর্ণনা নেই।",
        "emailsubject": "বিষয়:",
        "emailmessage": "বার্তা:",
        "emailsend": "প্রেরণ করো",
-       "emailccme": "à¦\86মার à¦¬à¦¾à¦°à§\8dতার à¦\8fà¦\95à¦\9fি à¦\85নà§\81লিপি à¦\86মাà¦\95à§\87 à¦\87-মেইল করা হোক।",
-       "emailccsubject": "আপনার বার্তার অনুলিপি $1-কে: $2",
+       "emailccme": "à¦\86মার à¦¬à¦¾à¦°à§\8dতার à¦\8fà¦\95à¦\9fি à¦ªà§\8dরতিলিপি à¦\86মাà¦\95à§\87 à¦\87মেইল করা হোক।",
+       "emailccsubject": "$1-কে আপনার বার্তার প্রতিলিপি: $2",
        "emailsent": "ই-মেইল প্রেরণ করা হয়েছে",
        "emailsenttext": "আপনার ই-মেইল বার্তা প্রেরণ করা হয়েছে।",
        "emailuserfooter": "এই ইমেইলটি {{SITENAME}} সাইটের \"{{int:emailuser}}\" সুবিধা ব্যবহার করে $1-এর পক্ষ থেকে {{GENDER:$2|$2}}-এর নিকট {{GENDER:$1|পাঠানো হয়েছে}}। যদি {{GENDER:$2|আপনি}} এই ইমেইলটির উত্তর দেন, তাহলে {{GENDER:$2|আপনার}} উত্তরের ইমেইলটি সরাসরি {{GENDER:$1|মূল প্রেরকের}} কাছে পাঠানো হবে, সেই সাথে {{GENDER:$2|আপনার}} ইমেল ঠিকানা {{GENDER:$1|তাঁর}} কাছে প্রকাশ করা হবে।",
        "wlheader-showupdated": "আপনার শেষ আগমনের পর থেকে যেসব পাতায় পরিবর্তন হয়েছে সেগুলি '''গাঢ়''' করে দেখানো হয়েছে।",
        "wlnote": "নিচে $3, $4 তারিখ থেকে বিগত {{PLURAL:$2|১ ঘন্টায়|<strong>$2</strong> ঘন্টায়}} সংঘটিত {{PLURAL:$1|শেষ ১টি পরিবর্তন|শেষ <strong>$1টি</strong> পরিবর্তন}} দেখানো হল।",
        "wlshowlast": "সর্বশেষ $1 ঘণ্টা $2 দিনে দেখাও",
-       "watchlist-hide": "à¦\86ড়াল à¦\95রà§\8b",
+       "watchlist-hide": "লà§\81à¦\95িয়à§\87 à¦°à¦¾à¦\96া à¦¹à§\8bà¦\95",
        "watchlist-submit": "দেখাও",
        "wlshowtime": "প্রদর্শনের সময় কাল:",
        "wlshowhideminor": "অনুল্লেখ্য সম্পাদনা",
        "wlshowhidepatr": "পরীক্ষিত সম্পাদনা",
        "wlshowhidemine": "আমার সম্পাদনা",
        "wlshowhidecategorization": "পাতা শ্রেণীবদ্ধকরণ",
-       "watchlist-options": "নজর তালিকা পছন্দসমূহ",
+       "watchlist-options": "নজর তালিকার পছন্দগুলি",
        "watching": "নজর রাখা হচ্ছে...",
        "unwatching": "নজর তুলে নেওয়া হচ্ছে...",
        "watcherrortext": "\"$1\" এর নজরতালিকা পরিবর্তনের সময় একটি ত্রুটি হয়েছে।",
        "changecontentmodel-submit": "পরিবর্তন করুন",
        "changecontentmodel-success-title": "বিষয়বস্তুর প্রতিরূপ পরিবর্তিত হয়েছিলো",
        "changecontentmodel-success-text": "[[:$1]]-এর বিষয়বস্তুর ধরণ পরিবর্তন হয়েছে।",
+       "changecontentmodel-cannot-convert": "[[:$1]] পাতার বিষয়বস্তু $2-এর ধরনে রূপান্তরিত করা সম্ভব নয়।",
        "changecontentmodel-nodirectediting": "$1 বিষয়বস্তুর রূপ সরাসরি সম্পাদনা করা সমর্থন করে না",
        "changecontentmodel-emptymodels-title": "কোন বিষয়বস্তুর রূপ উপলব্ধ নয়",
+       "changecontentmodel-emptymodels-text": "[[:$1]] পাতার বিষয়বস্তু কোন ধরনেই রূপান্তরিত করা সম্ভব নয়।",
        "log-name-contentmodel": "বিষয়বস্তুর রূপ পরিবর্তন লগ",
+       "log-description-contentmodel": "এই পাতাতে পাতাগুলির বিষয়বস্তুর মডেলের পরিবর্তনের একটি তালিকা আছে। এছাড়াও পূর্বনির্ধারিত মডেল ব্যতীত অন্য মডেলে তৈরি করা পাতাগুলিও তালিকাতে দেওয়া আছে।",
+       "logentry-contentmodel-new": "$1 পূর্বনির্ধারিত নয় এমন একটি বিষয়বস্তুর রূপ \"$5\" ব্যবহার $3 পাতাটি {{GENDER:$2|তৈরি করেছেন}}",
        "logentry-contentmodel-change": "$1 $3 পাতার বিষয়বস্তুর রূপ \"$4\" থেকে \"$5\"-এ {{GENDER:$2|পরিবর্তন করেছেন}}",
        "logentry-contentmodel-change-revertlink": "প্রত্যাবর্তন",
        "logentry-contentmodel-change-revert": "প্রত্যাবর্তন",
        "protectexpiry": "মেয়াদোত্তীর্ণ হবে:",
        "protect_expiry_invalid": "মেয়াদোত্তীর্ণ সময় অবৈধ।",
        "protect_expiry_old": "মেয়াদোত্তীর্ণ সময় অতীতে অবস্থিত।",
-       "protect-unchain-permissions": "সà§\81রà¦\95à§\8dষিত à¦\95রার à¦\85নà§\8dযনà§\8dয à¦\85পশনà¦\97à§\81লà§\8b à¦\86নলà¦\95 à¦\95রুন",
+       "protect-unchain-permissions": "সà§\81রà¦\95à§\8dষার à¦\85নà§\8dযানà§\8dয à¦ªà¦\9bনà§\8dদà¦\97à§\81লি à¦¦à§\87à¦\96ার à¦\9cনà§\8dয à¦¤à¦¾à¦²à¦¾ à¦\96à§\81লুন",
        "protect-text": "'''$1''' পাতাটির জন্য সুরক্ষার স্তর আপনি এখানে দেখতে ও পরিবর্তন করতে পারেন।",
        "protect-locked-blocked": "বাধাপ্রাপ্ত অবস্থায় আপনি পাতাটির সুরক্ষা স্তর পরিবর্তন করতে পারবেন না। এখানে '''$1''' পাতাটির বর্তমান সেটিংস দেওয়া হল:",
-       "protect-locked-dblock": "ডাà¦\9fাবà§\87à¦\9c à¦¬à¦¨্ধ থাকায় সুরক্ষা স্তর পরিবর্তন করা যাবে না।\nএখানে '''$1''' পাতাটির বর্তমান সেটিংস দেওয়া হল:",
+       "protect-locked-dblock": "ডাà¦\9fাবà§\87à¦\9c à¦\85বরà§\81দ্ধ থাকায় সুরক্ষা স্তর পরিবর্তন করা যাবে না।\nএখানে '''$1''' পাতাটির বর্তমান সেটিংস দেওয়া হল:",
        "protect-locked-access": "আপনার অ্যাকাউন্ট থেকে পাতার সুরক্ষা স্তর পরিবর্তন করার অনুমতি নেই।\nএখানে '''$1''' পাতাটির বর্তমান সেটিংস দেওয়া হল:",
        "protect-cascadeon": "এই পাতাটি বর্তমানে সুরক্ষিত আছে, কারণ পাতাটি নিচের {{PLURAL:$1|পাতায়|পাতাগুলিতে}} অন্তর্ভুক্ত, {{PLURAL:$1|যাতে|যেগুলিতে}} প্রপাতাকার সুরক্ষা চালু আছে। আপনি এই পাতাটির সুরক্ষা স্তর পরিবর্তন করতে পারেন, তবে এটি প্রপাতাকার সুরক্ষাটিতে কোন পরিবর্তন সাধন করবে না।",
        "protect-default": "সমস্ত ব্যবহারকারীর জন্য",
        "pagesize": "(বাইট)",
        "restriction-edit": "সম্পাদনা",
        "restriction-move": "সরিয়ে নেওয়া",
-       "restriction-create": "সà§\83ষà§\8dà¦\9fি à¦\95রা à¦¹à§\8bà¦\95",
+       "restriction-create": "তà§\88রি à¦\95রà§\81ন",
        "restriction-upload": "আপলোড",
        "restriction-level-sysop": "সম্পূর্ণ সুরক্ষিত",
        "restriction-level-autoconfirmed": "অর্ধ-সুরক্ষিত",
        "undeletepage": "মুছে ফেলা পাতাগুলি দেখুন ও ফিরিয়ে আনুন",
        "undeletepagetitle": "'''[[:$1|$1]] এর অপসারিত সংস্করণগুলোর সমন্বয়ে দেখানো হচ্ছে'''।",
        "viewdeletedpage": "মুছে ফেলা হয়েছে, এমন পাতাগুলো দেখুন",
-       "undeletepagetext": "নিচের {{PLURAL:$1|পাতা মুছে ফেলা হয়েছে কিন্তু|$1 পাতাগুলি মুছে ফেলা হয়েছে কিন্তু}} এগুলি এখনও আর্কাইভে আছে ও পুনরুদ্ধার করা সম্ভব। আর্কাইভ পর্যায়ক্রমিকভাবে পরিস্কার করা হতে পারে।",
+       "undeletepagetext": "নিচের {{PLURAL:$1|পাতাটি মুছে ফেলা হয়েছে কিন্তু এটি|$1 পাতাগুলি মুছে ফেলা হয়েছে কিন্তু এগুলি}} এখনও আর্কাইভে আছে ও পুনরুদ্ধার করা সম্ভব। আর্কাইভ পর্যায়ক্রমিকভাবে পরিষ্কার করা হতে পারে।",
        "undelete-fieldset-title": "সংশোধন পুনরুদ্ধার",
        "undeleteextrahelp": "সম্পূর্ণ পাতাটি পুনরুদ্ধার করার জন্য সবগুলি টিকবাক্স অনির্বাচিত করুন এবং '''''{{int:undeletebtn}}''''' বোতামে ক্লিক করুন।\nনির্বাচিত পুনরুদ্ধারের জন্য যেসব সংশোধন পুনরুদ্ধার করতে চান, তার পাশের বাক্সে টিক দিন এবং '''''{{int:undeletebtn}}''''' বোতামে ক্লিক করুন।",
        "undeleterevisions": "$1{{PLURAL:$1|টি সংশোধন}} অপসারিত",
        "undeleteviewlink": "দেখাও",
        "undeleteinvert": "ব্যুত্ক্রমে নির্বাচন",
        "undeletecomment": "কারণ:",
-       "undeletedrevisions": "{{PLURAL:$1|১টি সংশোধন|$1টি সংশোধন}} পুনরুদ্ধার করা হয়েছে",
-       "undeletedrevisions-files": "{{PLURAL:$1|১টি সংশোধন|$1টি সংশোধন}} এবং {{PLURAL:$2|১টি ফাইল|$2টি ফাইল}} পুনরুদ্ধার করা হয়েছে",
-       "undeletedfiles": "{{PLURAL:$1|১টি ফাইল|$1টি ফাইল}} পুনরুদ্ধার করা হয়েছে",
        "cannotundelete": "কিছু বা সব পুনরুদ্ধার করা যায়নি:\n$1",
        "undeletedpage": "'''$1 পুনরুদ্ধার করা হয়েছে'''\n\nসাম্প্রতিক মুছে ফেলা ও পুনরুদ্ধারের ঘটনাগুলির জন্য [[Special:Log/delete|অবলুপ্তি লগ]] দেখুন।",
        "undelete-header": "সাম্প্রতিক সময়ে মুছে ফেলা পাতাগুলি দেখতে [[Special:Log/delete|অবলুপ্তি লগ]] দেখুন।",
        "undelete-show-file-submit": "হ্যাঁ",
        "namespace": "নামস্থান:",
        "invert": "বিপরীতক্রমে নির্বাচন",
-       "tooltip-invert": "যà§\87 à¦¸à¦\95ল à¦¨à¦¾à¦®à¦¸à§\8dথানà§\87র à¦ªà¦¾à¦¤à¦¾à¦\97à§\81লà§\8bর à¦ªà¦°à¦¿à¦¬à¦°à§\8dতনসমà§\82হর à¦¦à§\87à¦\96তà§\87 à¦\9aাà¦\9aà§\8dà¦\9bà§\87ন à¦¨à¦¾ à¦¸à§\87à¦\97à§\81লà§\8bর à¦¨à¦¾à¦®à§\87র à¦ªà¦¾à¦¶à§\87 à¦\9fিà¦\95 à¦¦à¦¿à¦¨",
+       "tooltip-invert": "নিরà§\8dবাà¦\9aিত à¦¨à¦¾à¦®à¦¸à§\8dথানà¦\9fির (à¦\8fবà¦\82 à¦¸à¦\82শà§\8dলিষà§\8dà¦\9f à¦¨à¦¾à¦®à¦¸à§\8dথানà¦\9fি, à¦¯à¦¦à¦¿ à¦¨à¦¿à¦°à§\8dবাà¦\9aিত à¦¹à¦¯à¦¼à§\87 à¦¥à¦¾à¦\95à§\87) à¦\85নà§\8dতরà§\8dà¦\97ত à¦ªà¦¾à¦¤à¦¾à¦\97à§\81লির à¦ªà¦°à¦¿à¦¬à¦°à§\8dতনসমà§\82হ à¦²à§\81à¦\95িয়à§\87 à¦°à¦¾à¦\96তà§\87 à¦\9aাà¦\87লà§\87 à¦\8fà¦\87 à¦¬à¦¾à¦\95à§\8dসà§\87 à¦\9fিà¦\95 à¦¦à¦¿à¦¨à¥¤",
        "tooltip-whatlinkshere-invert": "নির্বাচিত নামস্থানের পাতা থেকে লিঙ্ক আড়াল করতে এই বাক্সে টিক দিন।",
        "namespace_association": "সংশ্লিষ্ট নামস্থান",
        "tooltip-namespace_association": "এখানে টিক দেয়ার মাধ্যমে সংশ্লিষ্ট নামস্থান এবং আলাপপাতাসমূহ অন্তর্ভুক্ত করছেন",
        "sp-contributions-username": "আইপি (IP) ঠিকানা অথবা ব্যবহারকারীর নাম:",
        "sp-contributions-toponly": "শুধুমাত্র সেই সম্পাদনাগুলি দেখাও যেগুলো সাম্প্রতিক সংস্করণের অন্তর্ভুক্ত",
        "sp-contributions-newonly": "শুধুমাত্র পাতা সৃষ্টি করা সম্পাদনাগুলি দেখাও",
-       "sp-contributions-hideminor": "à¦\85নà§\81লà§\8dলà§\87à¦\96à§\8dয à¦ªà¦°à¦¿à¦¬à¦°à§\8dতন à¦\86ড়াল à¦\95রà§\81ন",
+       "sp-contributions-hideminor": "à¦\85নà§\81লà§\8dলà§\87à¦\96à§\8dয à¦¸à¦®à§\8dপাদনাà¦\97à§\81লি à¦²à§\81à¦\95িয়à§\87 à¦°à¦¾à¦\96া à¦¹à§\8bà¦\95",
        "sp-contributions-submit": "অনুসন্ধান",
        "whatlinkshere": "সংযোগকারী পাতাসমূহ",
        "whatlinkshere-title": "যে পাতাগুলি থেকে \"$1\"-এর প্রতি সংযোগ আছে",
        "whatlinkshere-hidetrans": "অন্তর্ভুক্তকরণ $1",
        "whatlinkshere-hidelinks": "সংযোগ $1",
        "whatlinkshere-hideimages": "ফাইল সংযোগ $1",
-       "whatlinkshere-filters": "à¦\9bাà¦\95নà§\80",
+       "whatlinkshere-filters": "à¦\9bাà¦\81à¦\95নি",
        "whatlinkshere-submit": "চলো",
        "autoblockid": "স্বয়ংক্রিয় বাধা #$1",
        "block": "ব্যবহারকারীকে বাধা দাও",
        "unblock": "ব্যবহারকারীর উপর থেকে বাধা অপসারণ",
        "blockip": "{{GENDER:$1|ব্যবহারকারীকে}} বাধা দাও",
-       "blockip-legend": "বà§\8dযবহারà¦\95ারà§\80à¦\95à§\87 à¦¬à¦¾à¦§à¦¾ à¦¦à§\87à¦\93য়া à¦¹à§\8bà¦\95",
-       "blockiptext": "কোন নির্দিষ্ট আইপি ঠিকানা বা ব্যবহারকারীর লেখার অধিকারে বাধা দিতে নিচের ফর্মটি ব্যবহার করুন।\nএটি কেবলমাত্র ধ্বংসপ্রবণতা প্রতিরোধে ও [[{{MediaWiki:Policy-url}}|নীতিমালা]] মেনে সম্পাদন করা উচিত।\nনিচে একটি নির্দিষ্ট কারণ দিন (উদাহরণস্বরূপ, যেসব পাতার ধ্বংসসাধন করা হয়েছে, সেগুলি উল্লেখ করতে পারেন)।",
+       "blockip-legend": "বà§\8dযবহারà¦\95ারà§\80à¦\95à§\87 à¦¬à¦¾à¦§à¦¾ à¦¦à¦¿à¦¨",
+       "blockiptext": "কোন নির্দিষ্ট আইপি ঠিকানা বা ব্যবহারকারীর লেখার অধিকারে বাধা দিতে নিচের ফর্মটি ব্যবহার করুন।\nএটি কেবলমাত্র ধ্বংসপ্রবণতা প্রতিরোধে ও [[{{MediaWiki:Policy-url}}|নীতিমালা]] মেনে সম্পাদন করা উচিত।\nনিচে একটি নির্দিষ্ট কারণ দিন (উদাহরণস্বরূপ, যেসব পাতার ধ্বংসসাধন করা হয়েছে, সেগুলি উল্লেখ করতে পারেন)।\nআপনি একটি নির্দিষ্ট সীমার অন্তর্গত একাধিক আইপি ঠিকানাকে বাধা দিতে পারেন; এজন্য [https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing CIDR] সিনট্যাক্স বা পদবিন্যাসবিধি ব্যবহার করুন; এরকম বৃহত্তম অনুমোদিত সীমা হচ্ছে IPv4-এর ক্ষেত্রে /$1 এবং IPv6-এর ক্ষেত্রে /$2।",
        "ipaddressorusername": "আইপি ঠিকানা বা ব্যবহারকারীর নাম:",
        "ipbexpiry": "যখন মেয়াদোত্তীর্ণ হবে:",
        "ipbreason": "কারণ:",
-       "ipbreason-dropdown": "*বাধা দানের সাধারণ কারণ\n** মিথ্যা তথ্য ঢোকানো\n** পাতা থেকে বিষয়বস্তু মুছে ফেলা\n** বাইরের কোন সাইটের সংযোগ স্প্যাম করা\n** পাতাগুলিতে অর্থহীন বিষয়বস্তু ঢোকানো\n** ভীতি উদ্রেককারী আচরণ/হয়রানি\n** একাধিক অ্যাকাউন্টের অপব্যবহার\n** ব্যবহারকারী নাম অ-গ্রহণযোগ্য",
+       "ipbreason-dropdown": "*বাধা দানের সাধারণ কারণগুলি\n** মিথ্যা তথ্য যোগ করা\n** পাতা থেকে বিষয়বস্তু মুছে ফেলা\n** অবাঞ্ছিত বহিঃস্থ কোন সাইটের প্রতি সংযোগ বারংবার যোগ করা\n** পাতাগুলিতে অর্থহীন বিষয়বস্তু যোগ করা\n** ভীতি উদ্রেককারী আচরণ/হয়রানি\n** একাধিক অ্যাকাউন্টের অপব্যবহার\n** ব্যবহারকারী নাম অগ্রহণযোগ্য",
        "ipb-hardblock": "এই আইপি ঠিকানা থেকে লগ-ইনকৃত ব্যবহারকারীদেরকে সম্পাদনায় বাধা দাও",
        "ipbcreateaccount": "অ্যাকাউন্ট সৃষ্টিতে বাধা দেওয়া হোক",
        "ipbemailban": "ব্যবহারকারীকে ই-মেইল পাঠাতে বাধা দেওয়া হোক",
-       "ipbenableautoblock": "এই ব্যবহারকারীর ব্যবহার করা সর্বশেষ আইপি ঠিকানা, এবং পরবর্তী যেসব আইপি ঠিকানা থেকে সম্পাদনার চেষ্টা করা হবে, সেগুলিকেও স্বয়ংক্রিয়ভাবে বাধা দেয়া হোক",
-       "ipbsubmit": "à¦\8fà¦\87 à¦¬à§\8dযবহারà¦\95ারà§\80à¦\95à§\87 à¦¬à¦¾à¦§à¦¾ à¦¦à§\87য়া à¦¹à§\8bà¦\95",
+       "ipbenableautoblock": "এই ব্যবহারকারীর ব্যবহার করা সর্বশেষ আইপি ঠিকানা, এবং পরবর্তী যেসব আইপি ঠিকানা থেকে সম্পাদনার চেষ্টা করা হবে, সেগুলিকেও স্বয়ংক্রিয়ভাবে বাধা দেয়া হোক",
+       "ipbsubmit": "à¦\8fà¦\87 à¦¬à§\8dযবহারà¦\95ারà§\80à¦\95à§\87 à¦¬à¦¾à¦§à¦¾ à¦¦à¦¿à¦¨",
        "ipbother": "অন্য সময়:",
        "ipboptions": "২ ঘণ্টা:2 hours,১ দিন:1 day,৩ দিন:3 days,১ সপ্তাহ:1 week,২ সপ্তাহ:2 weeks,১ মাস:1 month,৩ মাস:3 months,৬ মাস:6 months,১ বছর:1 year,অসীম:infinite",
        "ipbhidename": "সম্পাদনা ও তালিকা থেকে ব্যবহারকারী নাম লুকিয়ে রাখা হোক",
        "ipbwatchuser": "এই ব্যবহাকারীর পাতা এবং আলাপের পাতা নজরতালিকায় রাখো",
        "ipb-disableusertalk": "এই ব্যবহারকারীকে বাধাদানকৃত অবস্থায় নিজের আলাপ পাতায় সম্পাদনা করা থেকে বিরত রাখো",
-       "ipb-change-block": "à¦\8fà¦\87 à¦\8fà¦\95à¦\87 à¦¸à§\87à¦\9fিà¦\82সসহ à¦¬à§\8dযবহারà¦\95ারà§\80à¦\95à§\87 à¦\86বারà¦\93 à¦¬à¦¾à¦§à¦¾ à¦ªà§\8dরদান à¦\95রà§\8b",
+       "ipb-change-block": "à¦\8fà¦\95à¦\87 à¦¸à§\87à¦\9fিà¦\82সসহ à¦¬à§\8dযবহারà¦\95ারà§\80à¦\95à§\87 à¦ªà§\81নà¦\83বাধা à¦¦à¦¿à¦¨",
        "ipb-confirm": "বাধা নিশ্চিতকরণ",
        "badipaddress": "আইপি (IP) ঠিকানাটি অগ্রহনযোগ্য",
        "blockipsuccesssub": "বাধা সফল",
        "ipb-confirmhideuser": "\"hide user\" ক্ষমতার মাধ্যমে আপনি একজন ব্যবহারকারীকে বাধা দিতে যাচ্ছেন। এর মাধ্যমে এই ব্যবহারকারীর নাম সকল লিস্ট এবং লগএন্ট্রি থেকে সরিয়ে ফেলা হবে। আপনি কি নিশ্চিতভাবে এটি করতে চান?",
        "ipb-confirmaction": "আপনি যদি নিশ্চিত হন আপনি এটি সত্যিকার অর্থেই করতে চান তাহলে অনুগ্রহ করে উপরের \"{{int:ipb-confirm}}\" ঘরটি দেখুন।",
        "ipb-edit-dropdown": "বাধাদানের কারণ সম্পাদনা করুন",
-       "ipb-unblock-addr": "$1-à¦\8fর à¦\89পর à¦¥à§\87à¦\95à§\87 à¦¬à¦¾à¦§à¦¾ à¦¤à§\81লà§\87 à¦¨à§\87à¦\93য়া à¦¹à§\8bà¦\95",
+       "ipb-unblock-addr": "$1-à¦\8fর à¦¬à¦¾à¦§à¦¾ à¦¤à§\81লà§\87 à¦¨à¦¿à¦¨",
        "ipb-unblock": "ব্যবহারকারী বা আইপি ঠিকানার উপর থেকে বাধা তুলে নেওয়া হোক",
        "ipb-blocklist": "বিদ্যমান বাধাগুলি দেখুন",
        "ipb-blocklist-contribs": "{{GENDER:$1|$1}}-এর অবদানসমূহ",
        "ipb-blocklist-duration-left": "$1 বাকি",
        "unblockip": "ব্যবহারকারীর উপর থেকে বাধা তুলে নেওয়া হোক",
        "unblockiptext": "নিচের ফর্মটি ব্যবহার করে পূর্বে বাধা দেওয়া কোন আইপি ঠিকানা বা ব্যবহারকারীর সাইটে লেখার অধিকার পুনঃপ্রতিষ্ঠা করুন।",
-       "ipusubmit": "বাধা à¦¤à§\81লà§\87 à¦¨à§\87à¦\93য়া à¦¹à§\8bà¦\95",
+       "ipusubmit": "à¦\8fà¦\87 à¦¬à¦¾à¦§à¦¾ à¦¤à§\81লà§\87 à¦¨à¦¿à¦¨",
        "unblocked": "[[User:$1|$1]]-এর উপর বাধা তুলে নেওয়া হয়েছে",
        "unblocked-range": "$1 -এর থেকে বাধা সরিয়ে নেওয়া হয়েছে",
        "unblocked-id": "$1 বাধাটি তুলে নেওয়া হয়েছে",
        "blocklist": "বাধাপ্রাপ্ত ব্যবহারকারী",
        "ipblocklist": "বাধাপ্রাপ্ত ব্যবহারকারী",
        "ipblocklist-legend": "বাধা দেওয়া কোন ব্যবহারকারীকে অনুসন্ধান করুন",
-       "blocklist-userblocks": "à¦\85à§\8dযাà¦\95াà¦\89নà§\8dà¦\9f à¦¬à¦¾à¦§à¦¾ à¦²à§\81à¦\95াà¦\93",
+       "blocklist-userblocks": "à¦\85à§\8dযাà¦\95াà¦\89নà§\8dà¦\9f à¦¬à¦¾à¦§à¦¾ à¦²à§\81à¦\95ানà§\8b à¦¹à§\8bà¦\95",
        "blocklist-tempblocks": "অস্থায়ী বাধা লুকাও",
-       "blocklist-addressblocks": "à¦\8fà¦\95à¦\95 à¦\86à¦\87পি à¦¬à¦¾à¦§à¦¾ à¦²à§\81à¦\95াà¦\93",
+       "blocklist-addressblocks": "à¦\8fà¦\95à¦\95 à¦\86à¦\87পি à¦¬à¦¾à¦§à¦¾ à¦²à§\81à¦\95ানà§\8b à¦¹à§\8bà¦\95",
        "blocklist-rangeblocks": "রেঞ্জ ব্লকসমূহ লুকান",
        "blocklist-timestamp": "সময়বার্তা",
        "blocklist-target": "লক্ষ্য",
        "ipblocklist-empty": "বাধাতালিকা খালি।",
        "ipblocklist-no-results": "অনুরুদ্ধ আইপি ঠিকানা বা ব্যবহারকারী নামটির উপর কোন বাধা নেই।",
        "blocklink": "বাধা দাও",
-       "unblocklink": "বাধা à¦¤à§\81লà§\87 à¦¨à§\87à¦\93য়া à¦¹à§\8bà¦\95",
+       "unblocklink": "বাধা à¦¤à§\81লà§\81ন",
        "change-blocklink": "বাধা পরিবর্তন করুন",
        "contribslink": "অবদান",
        "emaillink": "ই-মেইল পাঠাও",
        "ipb_hide_invalid": "এই অ্যাকাউন্ট বাধা দেয়া সম্ভব নয়; এটি {{PLURAL:$1|একের অধিক|$1টি}} সম্পাদনা করেছে।",
        "ipb_already_blocked": "\"$1\" ইতিমধ্যে ব্লক",
        "ipb-needreblock": "$1 ইতিমধ্যেই বাধাপ্রাপ্ত আছেন। আপনি কি সেটিংস পরিবর্তন করতে চান?",
-       "ipb-otherblocks-header": "অন্যান্য {{PLURAL:$1|বাধাঁ|বাধাঁসমূহ}}",
+       "ipb-otherblocks-header": "অন্যান্য {{PLURAL:$1|বাধা|বাধাসমূহ}}",
        "unblock-hideuser": "আপনি এই ব্যবহারকারীকে বাধা মুক্ত করতে পারবেন না, কারণ এই ব্যবহারকারীদের ব্যবহারকারী নাম লুকানো রয়েছে।",
        "ipb_cant_unblock": "ত্রুটি: $1 ব্লক আইডি খুঁজে পাওয়া যায়নি। হয়ত ইতিমধ্যেই এটির উপর থেকে বাধা তুলে নেওয়া হয়েছে।",
        "ipb_blocked_as_range": "ত্রুটি: $1 আইপি ঠিকানাটিকে সরাসরি বাধা দেওয়া হয়নি এবং বাধা তুলে নেওয়া যাবে না। তবে ঠিকানাটি $2 সীমার অন্তর্ভুক্ত এবং সেটি থেকে বাধা তুলে নেওয়া সম্ভব।",
        "cant-see-hidden-user": "আপনি যে ব্যবহারকারীকে ব্লক বা লুকিয়ে রাখতে চাচ্ছেন তাকে আগে থেকেই ব্লক বা লুকিয়ে রাখা হয়েছে। এছাড়া আপনার Hideuser অধিকার নেই, তাই আপনি ব্যবহারকারীর অবস্থা পরিবর্তন করতে পারবেন না।",
        "ipbblocked": "আপনি অন্য কোন ব্যবহারকরীকে ব্লক বা আনব্লক করতে পারবেন না, কারণ আপনি নিজেই ব্লক রয়েছেন",
        "ipbnounblockself": "আপনি নিজেকে আনব্লক করতে পারবেন না",
-       "lockdb": "ডাà¦\9fাবà§\87à¦\9c à¦¬à¦¨à§\8dধ à¦\95রà§\87 à¦¦à§\87à¦\93য়া হোক",
+       "lockdb": "ডাà¦\9fাবà§\87à¦\9c à¦\85বরà§\81দà§\8dধ à¦\95রা হোক",
        "unlockdb": "ডাটাবেজ খুলে দেওয়া হোক",
-       "lockdbtext": "ডাà¦\9fাবà§\87à¦\9c à¦¬à¦¨à§\8dধ à¦\95রà§\87 à¦¦à¦¿à¦²à§\87 à¦\95à§\8bন à¦¬à§\8dযবহারà¦\95ারà§\80 à¦ªà¦¾à¦¤à¦¾ à¦¸à¦®à§\8dপাদনা à¦\95রতà§\87, à¦¤à¦¾à¦¦à§\87র à¦ªà¦\9bনà§\8dদ à¦ªà¦°à¦¿à¦¬à¦°à§\8dতন à¦\95রতà§\87, à¦¤à¦¾à¦¦à§\87র à¦¨à¦\9cরতালিà¦\95া à¦¸à¦®à§\8dপাদনা à¦\95রতà§\87, এবং ডাটাবেজে পরিবর্তন আনে এমন কোন কিছু করতে পারবেন না।\nঅনুগ্রহ করে নিশ্চিত করুন যে আপনি এটাই করতে চান, এবং আপনার রক্ষণাবেক্ষণ শেষ হবার পর ডাটাবেজ আবার খুলে দেবেন।",
+       "lockdbtext": "ডাà¦\9fাবà§\87à¦\9c à¦\85বরà§\81দà§\8dধ à¦\95রà§\87 à¦¦à¦¿à¦²à§\87 à¦\95à§\8bনà§\8b à¦¬à§\8dযবহারà¦\95ারà§\80à¦\87 à¦ªà¦¾à¦¤à¦¾ à¦¸à¦®à§\8dপাদনা à¦\95রতà§\87, à¦¤à¦¾à¦¦à§\87র à¦ªà¦\9bনà§\8dদ à¦ªà¦°à¦¿à¦¬à¦°à§\8dতন à¦\95রতà§\87, à¦¤à¦¾à¦¦à§\87র à¦¨à¦\9cরতালিà¦\95া à¦¸à¦®à§\8dপাদনা à¦\95রতà§\87 এবং ডাটাবেজে পরিবর্তন আনে এমন কোন কিছু করতে পারবেন না।\nঅনুগ্রহ করে নিশ্চিত করুন যে আপনি এটাই করতে চান, এবং আপনার রক্ষণাবেক্ষণ শেষ হবার পর ডাটাবেজ আবার খুলে দেবেন।",
        "unlockdbtext": "ডাটাবেজ খুলে দিলে সব ব্যবহারকারী পাতা সম্পাদনা করতে, তাদের পছন্দ পরিবর্তন করতে, তাদের নজরতালিকা সম্পাদনা করতে, এবং ডাটাবেজে পরিবর্তন সাধন করে, এমন অন্যান্য কাজ করতে পারবেন।\nঅনুগ্রহ করে নিশ্চিত করুন যে আপনি এটাই করতে চান।",
-       "lockconfirm": "হà§\8dযাà¦\81, à¦\86মি à¦\86সলà§\87à¦\87 à¦¡à¦¾à¦\9fাবà§\87à¦\9c à¦¬à¦¨à§\8dধ à¦\95রতে চাই।",
+       "lockconfirm": "হà§\8dযাà¦\81, à¦\86মি à¦\86সলà§\87à¦\87 à¦¡à¦¾à¦\9fাবà§\87à¦\9c à¦\85বরà§\81দà§\8dধ à¦\95রà§\87 à¦¦à¦¿তে চাই।",
        "unlockconfirm": "হ্যাঁ, আমি আসলেই ডাটাবেজ খুলে দিতে চাই।",
-       "lockbtn": "ডাà¦\9fাবà§\87à¦\9c à¦¬à¦¨্ধ করা হোক",
+       "lockbtn": "ডাà¦\9fাবà§\87à¦\9c à¦\85বরà§\81দ্ধ করা হোক",
        "unlockbtn": "ডাটাবেজ খুলে দেওয়া হোক",
        "locknoconfirm": "আপনি নিশ্চিতকরণ বাক্সে টিক দেননি।",
-       "lockdbsuccesssub": "ডাà¦\9fাবà§\87à¦\9c à¦¸à¦«à¦²à¦­à¦¾à¦¬à§\87 à¦¬à¦¨্ধ করে দেওয়া হয়েছে",
+       "lockdbsuccesssub": "ডাà¦\9fাবà§\87à¦\9c à¦¸à¦«à¦²à¦­à¦¾à¦¬à§\87 à¦\85বরà§\81দ্ধ করে দেওয়া হয়েছে",
        "unlockdbsuccesssub": "ডাটাবেজ খুলে দেওয়া হয়েছে",
-       "lockdbsuccesstext": "ডাà¦\9fাবà§\87à¦\9c à¦¬à¦¨à§\8dধ à¦\95রা à¦¹à¦¯à¦¼à§\87à¦\9bà§\87\n<br />আপনার রক্ষণাবেক্ষণ সম্পন্ন হবার পর [[Special:UnlockDB|ডাটাবেজ খুলে দিতে]] ভুলবেন না।",
+       "lockdbsuccesstext": "ডাà¦\9fাবà§\87à¦\9c à¦\85বরà§\81দà§\8dধ à¦\95রা à¦¹à¦¯à¦¼à§\87à¦\9bà§\87।<br />\nআপনার রক্ষণাবেক্ষণ সম্পন্ন হবার পর [[Special:UnlockDB|ডাটাবেজ খুলে দিতে]] ভুলবেন না।",
        "unlockdbsuccesstext": "ডাটাবেজ খুলে দেওয়া হয়েছে।",
-       "lockfilenotwritable": "ডাà¦\9fাবà§\87à¦\9c à¦¬à¦¨à§\8dধ à¦\95রার à¦«à¦¾à¦\87লà¦\9fি à¦²à¦¿à¦\96নযà§\8bà¦\97à§\8dয à¦¨à¦¯à¦¼à¥¤ à¦¡à¦¾à¦\9fাবà§\87à¦\9c à¦¬à¦¨্ধ করতে বা খুলতে চাইলে ফাইলটিকে ওয়েব সার্ভার কর্তৃক লিখনযোগ্য হতে হবে।",
-       "databaselocked": "ডাà¦\9fাবà§\87সà¦\9fি à¦\87তিমধà§\8dযà§\87à¦\87 à¦¤à¦¾à¦²à¦¾à¦¬দ্ধ।",
+       "lockfilenotwritable": "ডাà¦\9fাবà§\87à¦\9c à¦\85বরà§\8bধনিরà§\8dদà§\87শà¦\95 à¦«à¦¾à¦\87লà¦\9fি à¦²à¦¿à¦\96নযà§\8bà¦\97à§\8dয à¦¨à¦¯à¦¼à¥¤ à¦¡à¦¾à¦\9fাবà§\87à¦\9c à¦\85বরà§\81দ্ধ করতে বা খুলতে চাইলে ফাইলটিকে ওয়েব সার্ভার কর্তৃক লিখনযোগ্য হতে হবে।",
+       "databaselocked": "ডাà¦\9fাবà§\87à¦\9cà¦\9fি à¦\87তিমধà§\8dযà§\87à¦\87 à¦\85বরà§\81দ্ধ।",
        "databasenotlocked": "ডাটাবেজ বন্ধ নয়।",
        "lockedbyandtime": "({{GENDER:$1|$1}} $2 এর $3 সময়ে)",
        "move-page": "$1 স্থানান্তর",
        "allmessagescurrent": "বর্তমান টেক্সট",
        "allmessagestext": "এটি মিডিয়াউইকি নামস্থানে অন্তর্ভুক্ত সিস্টেম বার্তাগুলোর একটি তালিকা।\nআপনি যদি সাধারণ মিডিয়াউইকির স্থানীয়করণে অবদান রাখতে আগ্রহী হন, অনুগ্রহ করে [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation মিডিয়াউইকি স্থানীয়করণ] এবং [https://translatewiki.net translatewiki.net] দেখুন।",
        "allmessagesnotsupportedDB": "এই পাতা ব্যবহার করা যাবে না কারণ '''$wgUseDatabaseMessages''' বন্ধ করে রাখা আছে।",
-       "allmessages-filter-legend": "à¦\9bাà¦\95নà§\80",
+       "allmessages-filter-legend": "à¦\9bাà¦\81à¦\95নি",
        "allmessages-filter": "Filter by customization state:",
        "allmessages-filter-unmodified": "অপরিবর্তিত",
        "allmessages-filter-all": "সমস্ত",
        "thumbnail_image-type": "চিত্রের ধরন সমর্থন করে না",
        "thumbnail_gd-library": "অসম্পূর্ণ জিডি লাইব্রেরী কনফিগারেশন: $1 ফাংশন নেই",
        "thumbnail_image-missing": "ফাইলটি খুজে পাওয়া যাচ্ছে না: $1",
+       "thumbnail_image-failure-limit": "সাম্প্রতিককালে এই ক্ষুদ্র প্রাকপ্রদর্শনমূলক চিত্রটিকে (thumbnail) রেন্ডার করার চেষ্টা অত্যধিকবার ($1 বা তার বেশিবার) ব্যর্থ হয়েছে। অনুগ্রহ করে কিছুক্ষণ পরে আবার চেষ্টা করুন।",
        "import": "পাতা আমদানি",
        "importinterwiki": "অন্য উইকি থেকে আমদানী",
        "import-interwiki-text": "আমদানির জন্য একটি উইকি ও পাতার শিরোনাম নির্বাচন করুন।\nসংশোধনের তারিখগুলি এবং সম্পাদকদের নামগুলি সংরক্ষণ করা হবে।\nঅন্যান্য উইকি থেকে সমস্ত আমদানি [[Special:Log/import|আমদানি লগে]] লিপিবদ্ধ আছে।",
        "import-interwiki-sourcewiki": "উত্স উইকি:",
        "import-interwiki-sourcepage": "উৎস পাতা:",
-       "import-interwiki-history": "à¦\8fà¦\87 à¦ªà¦¾à¦¤à¦¾à¦° à¦¸à¦®à¦¸à§\8dত à¦\87তিহাসà§\87র à¦¸à¦\82সà§\8dà¦\95রণà§\87র à¦\85নà§\81লিপি করা হোক",
-       "import-interwiki-templates": "সà¦\95ল à¦\9fà§\87মà§\8dপলà§\87à¦\9f à¦\85নà§\8dতরà§\8dভà§\81à¦\95à§\8dত",
+       "import-interwiki-history": "à¦\8fà¦\87 à¦ªà¦¾à¦¤à¦¾à¦° à¦\87তিহাসà§\87র à¦¸à¦®à¦¸à§\8dত à¦¸à¦\82সà§\8dà¦\95রণà§\87র à¦ªà§\8dরতিলিপি করা হোক",
+       "import-interwiki-templates": "সà¦\95ল à¦\9fà§\87মপà§\8dলà§\87à¦\9f à¦\85নà§\8dতরà§\8dভà§\81à¦\95à§\8dত à¦\95রà§\81ন",
        "import-interwiki-submit": "আমদানি",
        "import-mapping-default": "পূর্বনির্ধারিত অবস্থানে আমদানি করুন",
        "import-mapping-namespace": "একটি নামস্থানে আমদানি করুন:",
        "import-error-special": "\"$1\" পাতাটি আমদানি করা যায়নি কারণ এটি একটি বিশেষ নামস্থানকে নির্দেশ করে যেটি সম্পাদনার জন্য অনুমোদিত নয়।",
        "import-error-invalid": "\"$1\" পাতাটি আমদানি করা যায়নি কারণ নামটি সঠিক নয়।",
        "import-error-unserialize": "$1 পাতার $2 সংস্করণটি সিরিয়ালাইজ করা যাচ্ছে না। এই রিভিশনে $4 হিসাবে $3 কন্টেন্ট মডেলে সিরিয়ালাইজ করা আছে।",
-       "import-options-wrong": "ভুল {{PLURAL:$2|অপশন|অপশনসমূহ}}: <nowiki>$1</nowiki>",
+       "import-error-bad-location": "বিষয়বস্তু মডেল $3 ব্যবহার করে সম্পাদিত $2 নং সংশোধনটি \"$1\" পাতায় সংরক্ষণ করা যাবে না, কারণ ঐ মডেলটি ঐ পাতাতে প্রযোজ্য নয়।",
+       "import-options-wrong": "{{PLURAL:$2|পছন্দ}} নির্বাচনে ভুল: <nowiki>$1</nowiki>",
        "import-rootpage-invalid": "মূল পাতার ভুল শিরনাম দেয়া হয়েছে।",
        "import-rootpage-nosubpage": "মূল পাতার \"$1\" নামস্থানে উপপাতা তৈরী অনুমোদিত নয়।",
        "importlogpage": "আমদানি লগ",
        "tooltip-ca-protect": "এই পাতাকে সুরক্ষিত করো",
        "tooltip-ca-unprotect": "এই পাতার সুরক্ষা পরিবর্তন করো",
        "tooltip-ca-delete": "পাতাটি মুছে ফেলো",
-       "tooltip-ca-undelete": "পাতাà¦\9fি à¦®à§\81à¦\9bà§\87 à¦«à§\87লার à¦\86à¦\97à§\87 à¦¯à§\87 à¦¸à¦®à§\8dপাদনাà¦\97à§\81লি à¦\95রা à¦¹à¦¯à¦¼à§\87à¦\9bিল, à¦¸à§\87à¦\97à§\81লি à¦\89দà§\8dধার à¦\95রা à¦¹à§\8bà¦\95।",
+       "tooltip-ca-undelete": "পাতাà¦\9fি à¦\85পসারণà§\87র à¦\86à¦\97à§\87 à¦¯à§\87 à¦¸à¦®à§\8dপাদনাà¦\97à§\81লি à¦\95রা à¦¹à¦¯à¦¼à§\87à¦\9bিল à¦¸à§\87à¦\97à§\81লি à¦\89দà§\8dধার à¦\95রা à¦¹à§\8bà¦\95",
        "tooltip-ca-move": "পাতাটি স্থানান্তর করুন",
        "tooltip-ca-watch": "এই পাতাটি আপনার নজরতালিকায় যোগ করুন",
        "tooltip-ca-unwatch": "এই পাতাটি আপনার নজরতালিকা থেকে সরিয়ে ফেলুন",
        "tooltip-search": "{{SITENAME}} অনুসন্ধান",
        "tooltip-search-go": "যদি থাকে, তবে ঠিক এই নামের পাতায় চলো",
-       "tooltip-search-fulltext": "à¦\8fà¦\87 à¦\9fà§\87à¦\95à§\8dসà¦\9fà§\87র à¦\9cনà§\8dয à¦ªà¦¾à¦¤à¦¾à¦\97à§\81লিতà§\87 à¦\85নà§\81সনà§\8dধান à¦\95রা à¦¹à§\8bà¦\95",
+       "tooltip-search-fulltext": "à¦\8fà¦\87 à¦²à§\87à¦\96ার à¦\9cনà§\8dয à¦ªà¦¾à¦¤à¦¾à¦\97à§\81লিতà§\87 à¦\85নà§\81সনà§\8dধান à¦\95রà§\81ন",
        "tooltip-p-logo": "প্রধান পাতা পরিদর্শন করুন",
        "tooltip-n-mainpage": "প্রধান পাতায় যান",
        "tooltip-n-mainpage-description": "প্রধান পাতা পরিদর্শন করুন",
        "tooltip-ca-nstab-help": "সাহায্য পাতাটি দেখুন",
        "tooltip-ca-nstab-category": "বিষয়শ্রেণী পাতাটি দেখুন",
        "tooltip-minoredit": "এটিকে অনুল্লেখ্য সম্পাদনা হিসেবে চিহ্নিত করা হোক",
-       "tooltip-save": "à¦\86পনার à¦ªà¦°à¦¿à¦¬à¦°à§\8dতনà¦\97à§\81লি à¦¸à¦\82রà¦\95à§\8dষিত à¦¹à§\8bà¦\95",
+       "tooltip-save": "à¦\86পনার à¦ªà¦°à¦¿à¦¬à¦°à§\8dতনà¦\97à§\81লি à¦¸à¦\82রà¦\95à§\8dষিত à¦\95রà§\81ন",
        "tooltip-publish": "আপনার পরিবর্তন প্রকাশ করুন",
        "tooltip-preview": "অনুগ্রহ করে সংরক্ষণের আগে আপনার পরিবর্তনগুলি প্রাকদর্শন করুন!",
-       "tooltip-diff": "à¦\86পনি à¦\9fà§\87à¦\95à§\8dসà¦\9fà§\87 à¦\95à§\80 à¦\95à§\80 à¦ªà¦°à¦¿à¦¬à¦°à§\8dতন à¦\95রà§\87à¦\9bà§\87ন, à¦¤à¦¾ à¦¦à§\87à¦\96ানà§\8b à¦¹à§\8bà¦\95।",
+       "tooltip-diff": "লà§\87à¦\96ায় à¦\95à§\80 à¦\95à§\80 à¦ªà¦°à¦¿à¦¬à¦°à§\8dতন à¦\95রà§\87à¦\9bà§\87ন à¦¤à¦¾ à¦¦à§\87à¦\96à§\81ন",
        "tooltip-compareselectedversions": "এই পাতার দুইটি নির্বাচিত সংস্করণের মধ্যে তুলনা দেখুন।",
        "tooltip-watch": "এই পাতাটি আমার নজরতালিকায় যোগ করো",
        "tooltip-watchlistedit-normal-submit": "শিরোনাম অপসারণ",
        "tooltip-preferences-save": "পছন্দ সংরক্ষণ",
        "tooltip-summary": "একটি সংক্ষিপ্ত সারাংশ দিন",
        "interlanguage-link-title": "$1 - $2",
-       "common.css": "/* এখানে সিএসএস নিবেশিত করা হলে তা সব স্কিনে প্রয়োগ করা হবে */",
+       "common.css": "/* এখানে সন্নিবেশিত সিএসএস সব আবরণে প্রয়োগ করা হবে */",
+       "print.css": "/* এখানে সন্নিবেশিত সিএসএস মুদ্রণের আউটপুটকে প্রভাবিত করবে */",
+       "noscript.css": "/* এখানে সন্নিবেশিত সিএসএস জাভাস্ক্রিপ্ট নিষ্ক্রিয় করা ব্যবহারকারীদের প্রভাবিত করবে */",
+       "group-autoconfirmed.css": "/* এখানে সন্নিবেশিত সিএসএস শুধু স্বয়ংনিশ্চিতকৃত ব্যবহারকারীদের প্রভাবিত করবে */",
+       "group-user.css": "/* এখানে সন্নিবেশিত সিএসএস শুধু নিবন্ধিত ব্যবহারকারীদের প্রভাবিত করবে */",
+       "group-bot.css": "/* এখানে সন্নিবেশিত সিএসএস শুধু বটকে প্রভাবিত করবে */",
+       "group-sysop.css": "/* এখানে সন্নিবেশিত সিএসএস শুধু প্রশাসকদের প্রভাবিত করবে */",
+       "group-bureaucrat.css": "/* এখানে সন্নিবেশিত সিএসএস শুধু ব্যুরোক্র্যাটদের প্রভাবিত করবে */",
+       "common.js": "/* এখানে সন্নিবেশিত জাভাস্ক্রিপ্ট সকল ব্যবহারকারীর জন্য সকল পাতায় লোড হবে। */",
+       "group-autoconfirmed.js": "/* এখানে সন্নিবেশিত জাভাস্ক্রিপ্ট শুধু স্বয়ংনিশ্চিতকৃত ব্যবহারকারীদের জন্য লোড হবে */",
+       "group-user.js": "/* এখানে সন্নিবেশিত জাভাস্ক্রিপ্ট শুধু নিবন্ধিত ব্যবহারকারীদের জন্য লোড হবে */",
+       "group-bot.js": "/* এখানে সন্নিবেশিত জাভাস্ক্রিপ্ট শুধু বটের জন্য লোড হবে */",
+       "group-sysop.js": "/* এখানে সন্নিবেশিত জাভাস্ক্রিপ্ট শুধু প্রশাসকদের জন্য লোড হবে */",
+       "group-bureaucrat.js": "/* এখানে সন্নিবেশিত জাভাস্ক্রিপ্ট শুধু ব্যুরোক্র্যাটদের জন্য লোড হবে */",
        "anonymous": "{{SITENAME}} এর বেনামী {{PLURAL:$1|ব্যবহারকারী|ব্যবহারকারীবৃন্দ}}",
        "siteuser": "{{SITENAME}} ব্যবহারকারী $1",
        "anonuser": "{{SITENAME}} বেনামী ব্যবহারকারী $1",
        "anonusers": "{{SITENAME}} বেনামী {{PLURAL:$2|ব্যবহারকারী|ব্যবহারকারীগণ}} $1",
        "creditspage": "পাতার স্বীকৃতি",
        "nocredits": "এই পাতাটির জন্য কোন কৃতিত্ব-সম্পর্কিত তথ্য নেই।",
-       "spamprotectiontitle": "সà§\8dপà§\8dযাম à¦ªà§\8dরতিরà¦\95à§\8dষা à¦«à¦¿à¦²à§\8dà¦\9fার",
-       "spamprotectiontext": "à¦\86পনি à¦¯à§\87 à¦ªà¦¾à¦¤à¦¾à¦\9fি à¦¸à¦\82রà¦\95à§\8dষণ à¦\95রতà§\87 à¦\9aà§\87য়à§\87à¦\9bà§\87ন, à¦¤à¦¾ à¦¸à§\8dপà§\8dযাম à¦«à¦¿à¦²à§\8dà¦\9fার à¦¬à¦¾à¦§à¦¾ à¦¦à¦¿à¦¯à¦¼à§\87à¦\9bà§\87। à¦¸à¦®à§\8dভবত à¦\95ালà§\8b à¦¤à¦¾à¦²à¦¿à¦\95াভà§\81à¦\95à§\8dত à¦¬à¦¹à¦¿à¦\83সà§\8dথ à¦\95à§\8bন à¦¸à¦¾à¦\87à¦\9fà§\87র à¦¸à¦\82যà§\8bà¦\97à§\87র à¦\95ারণà§\87 à¦\8fমনà¦\9fা ঘটেছে।",
-       "spamprotectionmatch": "নিà¦\9aà§\87র à¦\9fà§\87à¦\95à§\8dসà¦\9fà¦\9fি à¦\86মাদà§\87র à¦¸à§\8dপà§\8dযাম à¦«à¦¿à¦²à§\8dà¦\9fারকে সক্রিয় করেছে: $1",
-       "spambot_username": "মিডিয়াà¦\89à¦\87à¦\95ি à¦¸à§\8dপà§\8dযাম à¦ªà¦°à¦¿à¦¸à§\8dà¦\95ার",
+       "spamprotectiontitle": "সà§\8dপà§\8dযাম à¦ªà§\8dরতিরà¦\95à§\8dষা à¦\9bাà¦\81à¦\95নি",
+       "spamprotectiontext": "à¦\86পনি à¦¯à§\87 à¦ªà¦¾à¦¤à¦¾à¦\9fি à¦¸à¦\82রà¦\95à§\8dষণ à¦\95রতà§\87 à¦\9aà§\87য়à§\87à¦\9bà§\87ন, à¦¤à¦¾ à¦¸à§\8dপà§\8dযাম à¦\9bাà¦\81à¦\95নি à¦¬à¦¾à¦§à¦¾ à¦¦à¦¿à¦¯à¦¼à§\87à¦\9bà§\87। à¦¸à¦®à§\8dভবত à¦\95ালà§\8bতালিà¦\95াভà§\81à¦\95à§\8dত à¦¬à¦¹à¦¿à¦\83সà§\8dথ à¦\95à§\8bন à¦¸à¦¾à¦\87à¦\9fà§\87র à¦¸à¦\82যà§\8bà¦\97à§\87র à¦\95ারণà§\87 à¦\8fমনà¦\9fি ঘটেছে।",
+       "spamprotectionmatch": "নিà¦\9aà§\87র à¦²à§\87à¦\96াà¦\9fি à¦\86মাদà§\87র à¦¸à§\8dপà§\8dযাম à¦\9bাà¦\81à¦\95নিকে সক্রিয় করেছে: $1",
+       "spambot_username": "মিডিয়াà¦\89à¦\87à¦\95ি à¦¸à§\8dপà§\8dযাম à¦ªà¦°à¦¿à¦·à§\8dà¦\95ারà¦\95রণ",
        "spam_reverting": "$1-এর প্রতি কোন সংযোগ নেই, এমন সর্বশেষ সংস্করণে ফেরত নেওয়া হচ্ছে।",
        "spam_blanking": "$1-এর প্রতি সংযোগ অন্তর্ভুক্ত আছে এমন সমস্ত সংশোধন খালি করা হচ্ছে",
        "spam_deleting": "$1-এর প্রতি সংযোগ অন্তর্ভুক্ত আছে এমন সমস্ত সংশোধন অপসারণ করা হচ্ছে",
        "newimages": "নতুন ফাইলের গ্যালারি",
        "imagelisttext": "নিচে '''$1''' {{PLURAL:$1|ফাইলের|ফাইলের}} একটি তালিকা যা $2 এ সংরক্ষিত রয়েছে।",
        "newimages-summary": "এই বিশেষ পাতা সর্বশেষ আপলোডকৃত ফাইল দেখাবে।",
-       "newimages-legend": "à¦\9bাà¦\95নà§\80",
+       "newimages-legend": "à¦\9bাà¦\81à¦\95নি",
        "newimages-label": "ফাইলের নাম (অথবা এর কোন অংশ):",
+       "newimages-user": "আইপি ঠিকানা বা ব্যবহারকারী নাম",
        "newimages-showbots": "বটের আপলোড গুলো দেখাও।",
-       "newimages-hidepatrolled": "à¦\9fহলà¦\95à§\83ত à¦\86পলà§\8bড à¦\86ড়াল à¦\95রà§\8b",
+       "newimages-hidepatrolled": "à¦\9fহলà¦\95à§\83ত à¦\86পলà§\8bড à¦²à§\81à¦\95ানà§\8b à¦¹à§\8bà¦\95",
        "noimages": "দেখার মত কিছু নেই।",
        "gallery-slideshow-toggle": "থাম্বনেল ভাসান",
        "ilsubmit": "অনুসন্ধান",
        "metadata": "অধি-উপাত্ত",
        "metadata-help": "এই ফাইলে অতিরিক্ত কিছু তথ্য আছে। সম্ভবত যে ডিজিটাল ক্যামেরা বা স্ক্যানারের মাধ্যমে এটি তৈরি বা ডিজিটায়িত করা হয়েছিল, সেটি কর্তৃক তথ্যগুলি যুক্ত হয়েছে। যদি ফাইলটি তার আদি অবস্থা থেকে পরিবর্তিত হয়ে থাকে, কিছু কিছু বিবরণ পরিবর্তিত ফাইলটির জন্য প্রযোজ্য না-ও হতে পারে।",
        "metadata-expand": "সম্প্রসারিত সবিস্তারে দেখাও",
-       "metadata-collapse": "সমà§\8dপà§\8dরসারিত à¦¸à¦¬à¦¿à¦¸à§\8dতারà§\87 à¦¦à§\87à¦\96িà¦\93 à¦¨à¦¾",
-       "metadata-fields": "à¦\8fà¦\87 à¦¬à¦¾à¦°à§\8dতায় à¦¤à¦¾à¦²à¦¿à¦\95াভà§\81à¦\95à§\8dত à¦\9aিতà§\8dর à¦®à§\87à¦\9fাডাà¦\9fা à¦\95à§\8dষà§\87তà§\8dরà¦\97à§\81লি à¦\9bবির à¦ªà¦¾à¦¤à¦¾à¦¯à¦¼ à¦ªà§\8dরদরà§\8dশন à¦\95রা à¦¹à¦¬à§\87, à¦¯à¦\96ন à¦\85ধি-à¦\89পাতà§\8dত সারণিটি সংকুচিত করা হবে। অন্য ক্ষেত্রগুলি স্বাভাবিক অবস্থায় লুকায়িত থাকবে।\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-collapse": "সমà§\8dপà§\8dরসারিত à¦¬à¦¿à¦¬à¦°à¦£ à¦¦à§\87à¦\96ান",
+       "metadata-fields": "à¦\8fà¦\87 à¦¬à¦¾à¦°à§\8dতায় à¦¤à¦¾à¦²à¦¿à¦\95াভà§\81à¦\95à§\8dত à¦\9aিতà§\8dর à¦®à§\87à¦\9fাডাà¦\9fা à¦\95à§\8dষà§\87তà§\8dরà¦\97à§\81লি à¦\9bবির à¦ªà¦¾à¦¤à¦¾à¦¯à¦¼ à¦ªà§\8dরদরà§\8dশন à¦\95রা à¦¹à¦¬à§\87, à¦¯à¦\96ন à¦®à§\87à¦\9fাডাà¦\9fা সারণিটি সংকুচিত করা হবে। অন্য ক্ষেত্রগুলি স্বাভাবিক অবস্থায় লুকায়িত থাকবে।\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
        "exif-imagewidth": "চওড়া",
        "exif-imagelength": "লম্বা",
        "exif-bitspersample": "উপাদানপ্রতি বিট",
        "exif-copyrighted-false": "কপিরাইট সংক্রান্ত তথ্য নেই",
        "exif-photometricinterpretation-0": "কালো এবং সাদা (সাদা হল 0)",
        "exif-photometricinterpretation-1": "কালো এবং সাদা (কালো হল 0)",
+       "exif-photometricinterpretation-3": "প্যালেট",
+       "exif-photometricinterpretation-4": "স্বচ্ছতা মাস্ক",
+       "exif-photometricinterpretation-5": "পৃথকীকৃত (সম্ভবত CMYK)",
        "exif-unknowndate": "অজানা তারিখ",
        "exif-orientation-1": "সাধারণ",
        "exif-orientation-2": "অনুভূমিকভাবে উল্টানো",
        "invalidateemail": "ইমেইল নিশ্চিতকরণ বাতিল করুন",
        "notificationemail_subject_changed": "{{SITENAME}}-এ নিবন্ধীকৃত ইমেল ঠিকানা পরিবর্তন করা হয়েছে",
        "notificationemail_subject_removed": "{{SITENAME}}-এ নিবন্ধীকৃত ইমেল ঠিকানা সরানো হয়েছে",
+       "notificationemail_body_changed": "কেউ, সম্ভবত আপনি-ই, $1 আইপি ঠিকানাটি থেকে {{SITENAME}}-এর \"$2\" নামক অ্যাাকাউন্টের সাথে সংশ্লিষ্ট ই-মেইল ঠিকানাটি \"$3\"-এ পরিবর্তন করেছেন।\n\nযদি এটি আপনি না করে থাকেন তাহলে, অবিলম্বে সাইট প্রশাসকের সাথে যোগাযোগ করুন।",
+       "notificationemail_body_removed": "কেউ, সম্ভবত আপনি-ই, $1 আইপি ঠিকানা থেকে  {{SITENAME}}-এর \"$2\" নামক অ্যাকাউন্টের সাথে সংশ্লিষ্ট ই-মেইল ঠিকানাটি মুছে দিয়েছেন।\n\nযদি এটি আপনি না করে থাকেন তাহলে, অবিলম্বে সাইট প্রশাসকের সাথে যোগাযোগ করুন।",
        "scarytranscludedisabled": "[আন্তঃউইকি আন্তঃভুক্তি নিষ্ক্রিয়]",
        "scarytranscludefailed": "[$1 এর জন্য টেমপ্লেট আনা অসফল হয়েছে]",
        "scarytranscludefailed-httpstatus": "[$1: HTTP $2 এর জন্য টেমপ্লেট আনা বিফল হয়েছে]",
        "recreate": "পুনরায় তৈরি করো",
        "confirm_purge_button": "ঠিক আছে",
        "confirm-purge-top": "এই পাতার ক্যাশে পরিষ্কার করতে চান?",
-       "confirm-purge-bottom": "à¦\95à§\8dযাশà§\87 à¦ªà¦°à¦¿à¦¸্কারের মাধ্যমে পাতাটির সবচেয়ে সাম্প্রতিক সংস্করণটি প্রদর্শিত হবে।",
+       "confirm-purge-bottom": "à¦\95à§\8dযাশà§\87 à¦ªà¦°à¦¿à¦·্কারের মাধ্যমে পাতাটির সবচেয়ে সাম্প্রতিক সংস্করণটি প্রদর্শিত হবে।",
        "confirm-watch-button": "ঠিক আছে",
        "confirm-watch-top": "এই পাতাটি আপনার নজরতালিকায় যুক্ত করা হবে?",
        "confirm-unwatch-button": "ঠিক আছে",
        "watchlistedit-normal-title": "নজরতালিকা সম্পাদনা করো",
        "watchlistedit-normal-legend": "নজর তালিকা থেকে শিরোনামসমূহ মুছে ফেলো",
        "watchlistedit-normal-explain": "আপনার নজরতালিকায় রাখা পাতার শিরোনামগুলি নিচে দেখানো হয়েছে।\nকোন শিরোনাম সরিয়ে নিতে চাইলে পাশের বাক্সে টিক দিন এবং \"{{int:Watchlistedit-normal-submit}}\"-এ ক্লিক করুন।\nআপনি [[Special:EditWatchlist/raw|মূল তালিকাটিও]] সম্পাদনা করতে পারেন।",
-       "watchlistedit-normal-submit": "শিরà§\8bনামà¦\97à§\81লি à¦¸à¦°à¦¿à¦¯à¦¼à§\87 à¦«à§\87লা à¦¹à§\8bà¦\95",
+       "watchlistedit-normal-submit": "শিরà§\8bনামà¦\97à§\81লি à¦¸à¦°à¦¾à¦¨",
        "watchlistedit-normal-done": "{{PLURAL:$1|1 শিরোনাম|$1 শিরোনামসমূহ}} আপনার নজর তালিকা থেকে মুছে ফেলা হয়েছে:",
        "watchlistedit-raw-title": "অশোধিত নজর তালিকা সম্পাদনা করুন",
        "watchlistedit-raw-legend": "অশোধিত নজরতালিকা সম্পাদনা করুন",
        "watchlistedit-raw-explain": "আপনার নজরতালিকায় রাখা পাতার শিরোনামগুলি নিচে দেখানো হয়েছে, এই তালিকাতে নতুন শিরোনাম যোগ করা যাবে বা শিরোনাম সরিয়ে নেওয়া যাবে;\nপ্রতিটি লাইনে একটি করে শিরনাম দেখানো হচ্ছে।\nশেষ হলে \"{{int:Watchlistedit-raw-submit}}\"-এ ক্লিক করুন।\nআপনি [[Special:EditWatchlist|আদর্শ সম্পাদনা সরঞ্জাম]]-ও ব্যবহার করতে পারেন।",
        "watchlistedit-raw-titles": "শিরোনাম:",
-       "watchlistedit-raw-submit": "নà¦\9cরতালিà¦\95া à¦¹à¦¾à¦²à¦¨à¦¾à¦\97াদ à¦\95রা à¦¹à§\8bà¦\95",
+       "watchlistedit-raw-submit": "নà¦\9cরতালিà¦\95া à¦¹à¦¾à¦²à¦¨à¦¾à¦\97াদ à¦\95রà§\81ন",
        "watchlistedit-raw-done": "আপনার নজর তালিকা হালনাগাদ করা হয়েছে।",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 শিরোনাম|$1 শিরোনামসমূহ}} যোগ করা হয়েছে:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 শিরোনাম|$1 শিরোনামসমূহ}} মুছে ফেলা হয়েছে:",
        "watchlistedit-clear-title": "নজরতালিকা পরিষ্কার করুন",
-       "watchlistedit-clear-legend": "নà¦\9cরতালিà¦\95া à¦ªà¦°à¦¿à¦¸্কার",
+       "watchlistedit-clear-legend": "নà¦\9cরতালিà¦\95া à¦ªà¦°à¦¿à¦·্কার",
        "watchlistedit-clear-explain": "সকল শিরোনামসমূহ আপনার নজরতালিকা থেকে সরিয়ে নেয়া হয়েছে।",
        "watchlistedit-clear-titles": "শিরোনামসমূহ:",
        "watchlistedit-clear-submit": "নজরতালিকা পরিষ্কার করুন (এটি স্থায়ী!)",
        "watchlistedit-clear-done": "আপনার নজরতালিকা পরিষ্কার করা হয়েছে।",
        "watchlistedit-clear-removed": "{{PLURAL:$1|১টি শিরোনাম|$1টি শিরোনাম}} সরিয়ে ফেলা হয়েছে:",
        "watchlistedit-too-many": "এখানে প্রদর্শনের জন্য অনেক পাতা রয়েছে।",
-       "watchlisttools-clear": "নà¦\9cরতালিà¦\95া à¦ªà¦°à¦¿à¦¸্কার করুন",
+       "watchlisttools-clear": "নà¦\9cরতালিà¦\95া à¦ªà¦°à¦¿à¦·্কার করুন",
        "watchlisttools-view": "সম্পর্কিত পরিবর্তনসমূহ দেখুন",
        "watchlisttools-edit": "নজর তালিকা দেখুন এবং সম্পাদনা করুন",
        "watchlisttools-raw": "অশোধিত নজরতালিকা সম্পাদনা করুন",
        "timezone-utc": "ইউটিসি",
        "timezone-local": "স্থানীয়",
        "duplicate-defaultsort": "<strong>সতর্কীকরণ:</strong> পূর্বনির্ধারিত সাজানোর চাবি \"$2\" পূর্বের পূর্বনির্ধারিত সাজানোর চাবি \"$1\" কে অগ্রাহ্য করে।",
-       "duplicate-displaytitle": "<strong>সতরà§\8dà¦\95à§\80à¦\95রণ:</strong> à¦ªà§\8dরদরà§\8dশন à¦¶à¦¿à¦°à§\8bনাম \"$2\" à¦\86à¦\97à§\87র à¦ªà§\8dরদরà§\8dশন à¦¶à¦¿à¦°à§\8bনাম \"$1\" à¦\85à¦\97à§\8dরাহà§\8dয করবে।",
+       "duplicate-displaytitle": "<strong>সতরà§\8dà¦\95à§\80à¦\95রণ:</strong> à¦ªà§\8dরদরà§\8dশন à¦¶à¦¿à¦°à§\8bনাম \"$2\" à¦\86à¦\97à§\87র à¦ªà§\8dরদরà§\8dশন à¦¶à¦¿à¦°à§\8bনাম \"$1\" à¦\95à§\87 à¦ªà§\8dরতিসà§\8dথাপিত করবে।",
        "restricted-displaytitle": "<strong>সতর্কবার্তা:</strong> প্রদর্শন শিরোনাম \"$1\" উপেক্ষা করা হয়েছে যেহেতু এটি পাতার আসল শিরোনামের সাথে সমতুল্য নয়।",
        "invalid-indicator-name": "<strong>ত্রুটি:</strong> পাতার অবস্থা নির্দেশক <code>name</code> অ্যাট্রিবিউট খালি হতে পারবে না।",
        "version": "সংস্করণ",
        "version-license-not-found": "এই এক্সটেনশনের জন্য কোনো বিস্তারিত লাইসেন্স তথ্য পাওয়া যায়নি।",
        "version-credits-title": "$1-এর জন্য কৃতিত্ব",
        "version-credits-not-found": "এই এক্সটেনশনটির জন্য কোনো বিস্তারিত কৃতিত্ব তথ্য পাওয়া যায়নি।",
-       "version-poweredby-credits": "এই উইকিটি পরিচালিত হচ্ছে <strong>[https://www.mediawiki.org/ মিডিয়াউইকি]</strong> -এর মাধ্যমে, কপিরাইট © ২০০১-$1 $2।",
+       "version-poweredby-credits": "এই উইকিটি <strong>[https://www.mediawiki.org/ মিডিয়াউইকির]</strong> মাধ্যমে পরিচালিত হচ্ছে, কপিরাইট © ২০০১-$1 $2।",
        "version-poweredby-others": "অন্যান্য",
        "version-poweredby-translators": "translatewiki.net অনুবাদকগণ",
        "version-credits-summary": "[[Special:Version|মিডিয়াউইকি]] সফটওয়্যারে অবদানের জন্য আমরা এই ব্যক্তিকে স্বীকৃতি দিতে চাই।",
-       "version-license-info": "মিডিয়াà¦\89à¦\87à¦\95ি à¦\8fà¦\95à¦\9fি à¦«à§\8dরি à¦¸à¦«à¦\9fà¦\93য়à§\8dযার; à¦\86পনি à¦\8fà¦\9fি à¦¬à¦¿à¦¤à¦°à¦£ à¦\95রতà§\87 à¦ªà¦¾à¦°à¦¬à§\87ন à¦\8fবà¦\82/à¦\85থবা à¦¸à¦®à§\8dপদানা à¦\95রতà§\87 à¦ªà¦¾à¦°à¦¬à§\87ন, à¦\8fà¦\95à§\8dষà§\87তà§\8dরà§\87 à¦«à§\8dরি à¦¸à¦«à¦\9fà¦\93য়à§\8dযার à¦«à¦¾à¦\89নà§\8dডà§\87শনà§\87র à¦ªà§\8dরà¦\95াশিত à¦\97নà§\81 à¦\9cà§\87নারà§\87ল à¦ªà¦¾à¦¬à¦²à¦¿à¦\95 à¦²à¦¾à¦\87সà§\87নà§\8dসà§\87র à§¨à¦¯à¦¼ à¦\85থবা à¦¸à¦¾à¦®à§\8dপà§\8dরতিà¦\95তম à¦\95à§\8bনà§\8b à¦¸à¦\82সà§\8dà¦\95রণ à¦®à§\87নà§\87 à¦\9aলতà§\87 à¦¹à¦¬à§\87। \n\nসà¦\95লà§\87র à¦\89পà¦\95ারà§\87র à¦²à¦\95à§\8dষà§\8dযà§\87 à¦\8fà¦\9fি à¦¬à¦¿à¦¤à¦°à¦£ à¦\95রা à¦¹à¦¯à¦¼à§\87 à¦¥à¦¾à¦\95à§\87, à¦\95িনà§\8dতà§\81 à¦\8fà¦\95à§\8dষà§\87তà§\8dরà§\87 à¦\95à§\8bনà§\8b à¦\93য়ারà§\87নà§\8dà¦\9fি à¦¦à§\87য়া à¦¹à¦¯à¦¼ à¦¨à¦¾, à¦\8fমনà¦\95ি à¦¬à¦¿à¦¶à§\87ষ à¦\95à§\8bনà§\8b à¦\95ারà§\8dযà¦\95à§\8dষà§\87তà§\8dরà§\87 à¦¬à§\8dযবহারà§\87র à¦\9cনà§\8dযà¦\93 à¦¤à¦¥à¦¾à¦\95থিত à¦\93য়ারà§\87নà§\8dà¦\9fি à¦¦à§\87য়া à¦¹à¦¯à¦¼ à¦¨à¦¾à¥¤ à¦¬à¦¿à¦¸à§\8dতারিত à¦\9cানতà§\87 à¦¦à§\87à¦\96à§\81ন à¦\97নà§\81 à¦\9cà§\87নারà§\87ল à¦ªà¦¾à¦¬à¦²à¦¿à¦\95 à¦²à¦¾à¦\87সà§\87নà§\8dস। \n\nà¦\8fà¦\87 à¦¸à¦«à¦\9fà¦\93য়à§\8dযারà§\87র à¦¸à¦¾à¦¥à§\87 [{{SERVER}}{{SCRIPTPATH}}/COPYING à¦\97নà§\81 à¦\9cà§\87নারà§\87ল à¦ªà¦¾à¦¬à¦²à¦¿à¦\95 à¦²à¦¾à¦\87সà§\87নà§\8dসà§\87র à¦\8fà¦\95à¦\9fি à¦\85নà§\81লিপি] à¦¥à¦¾à¦\95ার à¦\95থা; à¦¯à¦¦à¦¿ à¦\86পনি à¦¨à¦¾ à¦ªà§\87য়à§\87 à¦¥à¦¾à¦\95à§\87ন à¦¤à¦¾à¦¹à¦²à§\87 à¦\85নà§\81à¦\97à§\8dরহ à¦\95রà§\87 à¦«à§\8dরি à¦¸à¦«à¦\9fà¦\93য়à§\8dযার à¦«à¦¾à¦\89নà§\8dডà§\87শনà¦\95à§\87 à¦\9cানান à¦\8fà¦\87 à¦ à¦¿à¦\95ানায়, Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA à¦\85থবা [//www.gnu.org/licenses/old-licenses/gpl-2.0.html à¦\85নলাà¦\87নà§\87 à¦¦à§\87à¦\96ুন]।",
+       "version-license-info": "মিডিয়াà¦\89à¦\87à¦\95ি à¦\8fà¦\95à¦\9fি à¦\89নà§\8dমà§\81à¦\95à§\8dত à¦¸à¦«à¦\9fà¦\93য়à§\8dযার; à¦\86পনি à¦\8fà¦\9fি à¦ªà§\81নà¦\83বিতরণ à¦\95রতà§\87 à¦ªà¦¾à¦°à¦¬à§\87ন à¦\8fবà¦\82/à¦\85থবা à¦¸à¦®à§\8dপাদনা à¦\95রতà§\87 à¦ªà¦¾à¦°à¦¬à§\87ন, à¦\8fà¦\95à§\8dষà§\87তà§\8dরà§\87 à¦«à§\8dরি à¦¸à¦«à¦\9fà¦\93য়à§\8dযার à¦«à¦¾à¦\89নà§\8dডà§\87শনà§\87র à¦ªà§\8dরà¦\95াশিত à¦\97নà§\81 à¦\9cà§\87নারà§\87ল à¦ªà¦¾à¦¬à¦²à¦¿à¦\95 à¦²à¦¾à¦\87সà§\87নà§\8dসà§\87র à§¨à¦¯à¦¼ à¦\85থবা à¦¸à¦¾à¦®à§\8dপà§\8dরতিà¦\95তম à¦\95à§\8bনà§\8b à¦¸à¦\82সà§\8dà¦\95রণ à¦®à§\87নà§\87 à¦\9aলতà§\87 à¦¹à¦¬à§\87। \n\nমিডিয়াà¦\89à¦\87à¦\95ি à¦\8fà¦\87 à¦\86শায় à¦¬à¦¿à¦¤à¦°à¦£ à¦\95রা à¦¹à¦¯à¦¼à§\87 à¦¥à¦¾à¦\95à§\87 à¦¯à§\87 à¦\8fà¦\9fি à¦¸à¦\95লà§\87র à¦\89পà¦\95ারà§\87 à¦\86সবà§\87, à¦\95িনà§\8dতà§\81 à¦\8fà¦\95à§\8dষà§\87তà§\8dরà§\87 à¦\95à§\8bনà§\8b à¦²à¦¿à¦\96িত à¦\85à¦\99à§\8dà¦\97à§\80à¦\95ার à¦¦à§\87য়া à¦¹à¦¯à¦¼ à¦¨à¦¾, à¦\8fমনà¦\95ি à¦¬à§\8dযবসাযà§\8bà¦\97à§\8dযতা à¦¬à¦¾ à¦¬à¦¿à¦¶à§\87ষ à¦\95à§\8bনà§\8b à¦\95ারà§\8dযà¦\95à§\8dষà§\87তà§\8dরà§\87 à¦¬à§\8dযবহারà§\87র à¦\9cনà§\8dয à¦\8fà¦\9fি à¦\89পযà§\81à¦\95à§\8dত à¦\95ি à¦¨à¦¾, à¦\8f à¦¨à¦¿à¦¯à¦¼à§\87 à¦ªà¦°à§\8bà¦\95à§\8dষ à¦\85à¦\99à§\8dà¦\97à§\80à¦\95ারà¦\93 à¦¦à§\87য়া à¦¹à¦¯à¦¼ à¦¨à¦¾à¥¤ à¦¬à¦¿à¦¸à§\8dতারিত à¦\9cানতà§\87 à¦\97নà§\81 à¦\9cà§\87নারà§\87ল à¦ªà¦¾à¦¬à¦²à¦¿à¦\95 à¦²à¦¾à¦\87সà§\87নà§\8dস à¦¦à§\87à¦\96à§\81ন। \n\nà¦\8fà¦\87 à¦¸à¦«à¦\9fà¦\93য়à§\8dযারà§\87র à¦¸à¦¾à¦¥à§\87 [{{SERVER}}{{SCRIPTPATH}}/COPYING à¦\97নà§\81 à¦\9cà§\87নারà§\87ল à¦ªà¦¾à¦¬à¦²à¦¿à¦\95 à¦²à¦¾à¦\87সà§\87নà§\8dসà§\87র à¦\8fà¦\95à¦\9fি à¦ªà§\8dরতিলিপি] à¦¥à¦¾à¦\95ার à¦\95থা; à¦¯à¦¦à¦¿ à¦\86পনি à¦¨à¦¾ à¦ªà§\87য়à§\87 à¦¥à¦¾à¦\95à§\87ন à¦¤à¦¾à¦¹à¦²à§\87 à¦\85নà§\81à¦\97à§\8dরহ à¦\95রà§\87 à¦«à§\8dরি à¦¸à¦«à¦\9fà¦\93য়à§\8dযার à¦«à¦¾à¦\89নà§\8dডà§\87শনà¦\95à§\87 à¦\9cানান à¦\8fà¦\87 à¦ à¦¿à¦\95ানায়, Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA à¦\85থবা [//www.gnu.org/licenses/old-licenses/gpl-2.0.html à¦²à¦¾à¦\87সà§\87নà§\8dসà¦\9fি à¦\87নà§\8dà¦\9fারনà§\87à¦\9fà§\87 à¦ªà¦¡à¦¼ুন]।",
        "version-software": "ইনস্টলকৃত সফটওয়্যার",
        "version-software-product": "পণ্য",
        "version-software-version": "সংস্করণ",
        "fileduplicatesearch-submit": "অনুসন্ধান",
        "fileduplicatesearch-info": "$1 × $2 পিক্সেল<br />ফাইলের আকার: $3<br />এমআইএমই প্রকার: $4",
        "fileduplicatesearch-result-1": " \"$1\" ফাইলের কোন ডুপ্লেকেট ফাইল নাই।",
-       "fileduplicatesearch-result-n": "\"$1\" à¦\8fà¦\87 à¦«à¦¾à¦\87লà§\87র {{PLURAL:$2|1 à¦\8fà¦\95à¦\87রà¦\95ম à¦\85নà§\81লিপি|$2 à¦\8fà¦\95à¦\87রà¦\95ম à¦\85নà§\81লিপি}} রয়েছে।",
+       "fileduplicatesearch-result-n": "\"$1\" à¦«à¦¾à¦\87লà¦\9fির {{PLURAL:$2|১à¦\9fি à¦\85বিà¦\95ল à¦ªà§\8dরতিলিপি|$2à¦\9fি à¦\85বিà¦\95ল à¦ªà§\8dরতিলিপি}} রয়েছে।",
        "fileduplicatesearch-noresults": "\"$1\" নামের কোনো ফাইল খুঁজে পাওয়া যায়নি।",
        "specialpages": "বিশেষ পাতাসমূহ",
-       "specialpages-note-top": "লিà¦\9cà§\87নà§\8dড",
+       "specialpages-note-top": "বà§\8dযাà¦\96à§\8dযা",
        "specialpages-note": "* সাধারণ বিশেষ পাতাসমূহ।\n* <span class=\"mw-specialpagerestricted\">সীমাবদ্ধ বিশেষ পাতা।</span>",
        "specialpages-group-maintenance": "রক্ষণাবেক্ষণের কার্যবিবরণীসমূহ",
        "specialpages-group-other": "অন্যান্য বিশেষ পাতাসমূহ",
        "specialpages-group-pagetools": "পাতা সংক্রান্ত সরঞ্জাম",
        "specialpages-group-wiki": "উপাত্ত এবং সরঞ্জামসমূহ",
        "specialpages-group-redirects": "বিশেষ পাতাগুলি পুনর্নির্দেশ করা হচ্ছে",
-       "specialpages-group-spam": "স্প্যামরোধী হাতিয়ার",
+       "specialpages-group-spam": "স্প্যাম সরঞ্জামসমূহ",
        "specialpages-group-developer": "ডেভলপারের সরঞ্জাম",
        "blankpage": "খালি পাতা",
        "intentionallyblankpage": "এই পাতাটি ইচ্ছা করে খালি রাখা হয়েছে",
        "external_image_whitelist": "  #এই লাইন ঠিক যেমন আছে<প্রাক> তেমন রাখুন<pre>\n #রেগুলার এক্সপ্রেশনের টুকরা নীচে (শুধুমাত্র অংশ / / মধ্যে যে যায়) বসান\n#এইগুলি এক্সটার্নাল (hotlinked) ইমেজের URL-এর সাথে মেলানো হবে\n#যেগুলি মিলবে, সেগুলি চিত্র হিসাবে প্রদর্শিত হবে, অন্যথায় শুধুমাত্র ইমেজ লিঙ্ক প্রদর্শিত হবে\n#যে লাইনের প্রারম্ভে # আছে সেই লাইনগুলি মন্তব্যসমূহ হিসাবে ব্যবহার করা হয়\n#এটি কেস-অসংবেদী\n\n#এই রেখার উপরের regex টুকরা বসান. এই লাইন ঠিক যেমন আছে তেমন রাখুন</pre>",
        "tags": "বৈধ পরিবর্তন ট্যাগ",
-       "tag-filter": "[[Special:Tags|à¦\9fà§\8dযাà¦\97]] à¦\9bাà¦\95নà§\80:",
-       "tag-filter-submit": "à¦\9bাà¦\95নà§\80",
+       "tag-filter": "[[Special:Tags|à¦\9fà§\8dযাà¦\97]] à¦\9bাà¦\81à¦\95নি:",
+       "tag-filter-submit": "à¦\9bাà¦\81à¦\95নি",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|ট্যাগ}}]]: $2)",
        "tag-mw-contentmodelchange": "বিষয়বস্তুর রূপ পরিবর্তন",
        "tag-mw-contentmodelchange-description": "সম্পাদনা যা একটি পাতার [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:ChangeContentModel বিষয়বস্তুর রূপ পরিবর্তন] করে",
        "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-reason": "কারণ:",
        "tags-create-submit": "তৈরি করুন",
        "tags-create-no-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-explanation-in-use": "ট্যাগটি বর্তমানে যে {{PLURAL:$2|$2 টি সংশোধন এবং/বা লগ ভুক্তিতে}} প্রয়োগ হয়েছে, সেগুলি থেকে এটিকে অপসারণ করা হবে।",
+       "tags-delete-explanation-warning": "এই কাজটি <strong>অপরিবর্তনযোগ্য</strong> এবং এটিকে ভবিষ্যতে <strong>বাতিল করা সম্ভব নয়</strong>, এমনকি ডাটাবেজ প্রশাসকরাও এটি বাতিল করতে পারবেন না। এই ট্যাগটিই মুছে ফেলতে চাচ্ছেন কি না, সে ব্যাপারে সুনিশ্চিত হোন।",
+       "tags-delete-explanation-active": "<strong>\"$1\" ট্যাগটি এখনও সক্রিয় এবং ভবিষ্যতে এটিকে প্রয়োগ করা যাবে।</strong> এই ব্যাপারটি ঘটা বন্ধ করার জন্য যেসব স্থানে ট্যাগটিকে প্রয়োগ করার জন্য নির্ধারণ করা হয়েছে, সেসব স্থানে গিয়ে সেটিকে নিষ্ক্রিয় করুন।",
        "tags-delete-reason": "কারণ:",
        "tags-delete-submit": "অপরিবর্তনীয় এই ট্যাগ অপসারন করো",
+       "tags-delete-not-allowed": "এক্সটেনশন দ্বারা সংজ্ঞায়িত ট্যাগ অপসারণ করা সম্ভব নয়, যদি না এক্সটেনশনটি বিশেষভাবে এটি করার অনুমতি দিয়ে থাকে।",
        "tags-delete-not-found": "\"$1\" ট্যাগ বিদ্যমান নয়।",
        "tags-delete-too-many-uses": "\"$1\" ট্যাগটি $2টিরও অধিক {{PLURAL:$2|সংশোধনে}} প্রয়োগ করা হয়েছে, যার অর্থ এটি অপসারণ করা যাবে না।",
+       "tags-delete-warnings-after-delete": "\"$1\" ট্যাগটি মুছে ফেলা হয়েছে, কিন্তু নিম্নোক্ত {{PLURAL:$2|সতর্ক বার্তাটি|সতর্ক বার্তাগুলি}} উৎপন্ন হয়েছে:",
        "tags-delete-no-permission": "আপনার পরিবর্তন ট্যাগ মুছে ফেলার অনুমতি নেই।",
        "tags-activate-title": "সক্রিয় ট্যাগ",
        "tags-activate-question": "আপনি ট্যাগ \"$1\" সক্রিয় করতে চলেছেন।",
        "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-edit-manage-link": "ট্যাগ পরিচালনা করুন",
        "tags-edit-revision-selected": "[[:$2]] পাতার {{PLURAL:$1|নির্বাচিত সংশোধন|নির্বাচিত সংশোধনসমূহ}}:",
        "tags-edit-logentry-selected": "{{PLURAL:$1|নির্বাচিত লগ ইভেন্ট}}:",
+       "tags-edit-revision-legend": "{{PLURAL:$1|এই সংশোধন|$1টি সংশোধনের সবগুলি}} থেকে ট্যাগ যোগ বা অপসারণ করুন",
        "tags-edit-logentry-legend": "{{PLURAL:$1|এই লগের ভুক্তি|$1টি লগের ভুক্তি}} থেকে ট্যাগ যোগ বা বাতিল করুন",
        "tags-edit-existing-tags": "বিদ্যমান ট্যাগ:",
        "tags-edit-existing-tags-none": "<em>কোনটি নয়</em>",
        "tags-edit-success": "পরিবর্তন প্রয়োগ করা হয়েছে।",
        "tags-edit-failure": "পরিবর্তন প্রয়োগ করা যায়নি: $1",
        "tags-edit-nooldid-title": "লক্ষ্য সংশোধন অবৈধ",
+       "tags-edit-nooldid-text": "আপনি হয় কোন লক্ষ্য সংশোধনটিতে এই ফাংশনটি সম্পাদন করতে হবে তা নির্দিষ্ট করে দেননি, অথবা নির্দিষ্টকৃত সংশোধনটির অস্তিত্ব নেই।",
        "tags-edit-none-selected": "যোগ করতে অথবা অপসারণ করতে অন্ততপক্ষে একটি ট্যাগ দয়া করে নির্বাচন করুন।",
        "comparepages": "পাতার তুলনা",
        "compare-page1": "পাতা ১",
        "dberr-info-hidden": "(ডেটাবেজ প্রবেশ করা সম্ভব হয়নি)",
        "dberr-usegoogle": "এই পরিস্থিতিতে আপনি গুগলের মাধ্যমে অনুসন্ধান করার চেষ্টা করতে পারেন।",
        "dberr-outofdate": "খেয়াল করুন যে, আমাদের বিষয়বস্তু সম্পর্কিত তাদের সূচি মেয়াদ উত্তীর্ণ হতে পারে।",
-       "dberr-cachederror": "à¦\8fà¦\9fি à¦\85নà§\81রà§\8bধà¦\95à§\83ত à¦ªà¦¾à¦¤à¦¾à¦° à¦\95à§\8dযাশà§\87 à¦²à¦¿à¦ªà¦¿, à¦¯à¦¾ à¦¹à¦¾à¦²à¦¨à¦¾à¦\97াতà¦\95à§\83ত à¦¨à¦¾ও হতে পারে।",
+       "dberr-cachederror": "à¦\8fà¦\9fি à¦\85নà§\81রà§\8bধà¦\95à§\83ত à¦ªà¦¾à¦¤à¦¾à¦\9fির à¦\95à§\8dযাশ à¦ªà§\8dরতিলিপি, à¦¯à¦¾ à¦¹à¦¾à¦²à¦¨à¦¾à¦\97াতà¦\95à§\83ত à¦¨à¦¾-ও হতে পারে।",
        "htmlform-invalid-input": "আপনার প্রদানকৃত ইনপুটে সমস্যা রয়েছে",
        "htmlform-select-badoption": "যে মান আপনি উল্লেখ করেছেন তা গ্রহণযোগ্য অপশন নয়।",
        "htmlform-int-invalid": "আপনার পরিবর্তীত সংখ্যাটি ইন্টিজার(পূর্ণসংখ্যা) নয়।",
        "htmlform-user-not-valid": "<strong>$1</strong> একটি বৈধ ব্যবহারকারীর নাম নয়।",
        "logentry-delete-delete": "$1 কর্তৃক $3 পাতাটি অপসারিত হয়েছে",
        "logentry-delete-delete_redir": "$1 পুনর্লিখনের দ্বারা $3 পুনর্নির্দেশ {{GENDER:$2|অপসারণ করেছেন}}",
-       "logentry-delete-restore": "$1 কর্তৃক $3 পাতাটি {{GENDER:$2|ফিরিয়ে আনা}} হয়েছে",
+       "logentry-delete-restore": "$1 $3 পাতাটি {{GENDER:$2|পুনরুদ্ধার করেছেন}} ($4)",
+       "logentry-delete-restore-nocount": "$1 $3 পাতাটি {{GENDER:$2|পুনরুদ্ধার করেছেন}}",
+       "restore-count-revisions": "{{PLURAL:$1|১টি সংশোধন|$1টি সংশোধন}}",
+       "restore-count-files": "{{PLURAL:$1|১টি ফাইল|$1টি ফাইল}}",
        "logentry-delete-event": "$1 {{PLURAL:$5|একটি লগ ইভেন্টের|$5 লগ ইভেন্টসমূহের}} দৃশ্যমানতা {{GENDER:$2|পরিবর্তন}} করেছেন $3: $4",
        "logentry-delete-revision": "$1 {{PLURAL:$5|একটি সংস্করণের|$5টি সংস্করণের}} দৃশ্যমানতা {{GENDER:$2|পরিবর্তন}} করেছেন $3: $4",
        "logentry-delete-event-legacy": "$1 $3টায় লগ ইভেন্টসমূহের দৃশ্যমানতা {{GENDER:$2|পরিবর্তন}} করেছেন",
        "logentry-import-interwiki": "$1 অন্য একটি উইকিতে থেকে $3 {{GENDER:$2|আমদানি করেছে}}",
        "logentry-import-interwiki-details": "$1 $5 থেকে $3 {{GENDER:$2|আমদানি করেছেন}} ($4টি {{PLURAL:$4|সংশোধন}})",
        "logentry-merge-merge": "$1 $4-এ $3 {{GENDER:$2|একত্রীকরণ করেছেন}} ($5 তারিখের সংশোধন পর্যন্ত)",
-       "logentry-move-move": "$1 ব্যবহারকারী $3 পাতাটিকে $4 শিরোনামে {{GENDER:$2|স্থানান্তর}} করেছেন",
-       "logentry-move-move-noredirect": "$1 ব্যবহারকারী $3 পাতাটিকে $4 শিরোনামে কোনো পুনর্নির্দেশনা ছাড়াই {{GENDER:$2|স্থানান্তর}} করেছেন",
-       "logentry-move-move_redir": "$1 ব্যবহারকারী $3 পাতাটিকে $4 শিরোনামে পুনির্নির্দেশনার মাধ্যমে {{GENDER:$2|স্থানান্তর}} করেছেন",
-       "logentry-move-move_redir-noredirect": "$1 ব্যবহারকারী $3 পাতাটিকে $4 শিরোনামে পুনর্নির্দেশনা ছাড়াই {{GENDER:$2|স্থানান্তর}} করেছেন",
+       "logentry-move-move": "$1 $3 কে $4 শিরোনামে {{GENDER:$2|স্থানান্তর}} করেছেন",
+       "logentry-move-move-noredirect": "$1 $3 পাতাটিকে $4 শিরোনামে কোনো পুনর্নির্দেশনা ছাড়াই {{GENDER:$2|স্থানান্তর}} করেছেন",
+       "logentry-move-move_redir": "$1 $3 পাতাটিকে $4 শিরোনামে পুনির্নির্দেশনার মাধ্যমে {{GENDER:$2|স্থানান্তর}} করেছেন",
+       "logentry-move-move_redir-noredirect": "$1 $3 পাতাটিকে $4 শিরোনামে পুনর্নির্দেশনা ছাড়াই {{GENDER:$2|স্থানান্তর}} করেছেন",
        "logentry-patrol-patrol": "$1 ব্যবহারকারী $3 পাতার $4 নম্বর সংস্করণ পরীক্ষিত বলে {{GENDER:$2|চিহ্নিত}} করেছেন",
        "logentry-patrol-patrol-auto": "$1 ব্যবহারকারী স্বয়ংক্রিয়ভাবে $3 পাতার $4 নম্বর সংস্করণ পরীক্ষিত বলে {{GENDER:$2|চিহ্নিত}} করেছেন",
        "logentry-newusers-newusers": "$1 ব্যবহারকারী অ্যাকাউন্টটি {{GENDER:$2|তৈরি করা}} হয়েছে",
        "logentry-protect-protect-cascade": "$1 $3 {{GENDER:$2|সুরক্ষিত করেছেন}} $4 [প্রপাতাকার]",
        "logentry-protect-modify": "$1 $3-এর জন্য সুরক্ষা স্তর {{GENDER:$2|পরিবর্তন করেছেন}} $4",
        "logentry-protect-modify-cascade": "$1 $3-এর জন্য সুরক্ষা স্তর {{GENDER:$2|পরিবর্তন করেছেন}} $4 [প্রপাতাকার]",
-       "logentry-rights-rights": "$1 ব্যবহারকারী, {{GENDER:$6|$3}}-এর দলগত সদস্যপদ $4 থেকে $5 এ {{GENDER:$2|পরিবর্তন}} করেছেন",
+       "logentry-rights-rights": "$1 {{GENDER:$6|$3}}-এর দলীয় সদস্যপদ $4 থেকে $5-এ {{GENDER:$2|পরিবর্তন}} করেছেন",
        "logentry-rights-rights-legacy": "$1 দলের সদস্যপদ পরিবর্তন করেছেন {{GENDER:$2|changed}} এর জন্য $3",
        "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 $3 {{GENDER:$2|আপলোড করেছেন}}",
        "log-name-managetags": "ট্যাগ ব্যবস্থাপনা লগ",
+       "log-description-managetags": "এই পাতাতে [[Special:Tags|ট্যাগ]] ব্যবস্থাপনা কার্যাবলির একটি তালিকা আছে। এই লগে কেবলমাত্র সেইসব কর্মের তালিকা আছে, যেগুলি একজন প্রশাসক নিজ হাতে সম্পাদন করেছেন; উইকি সফটওয়্যার দিয়ে ট্যাগ সৃষ্টি বা অপসারণ করা সম্ভব, যার কোন ভুক্তি এই লগে সংরক্ষিত হবে না।",
        "logentry-managetags-create": "$1 \"$4\" ট্যাগটি {{GENDER:$2|তৈরি করেছেন}}",
        "logentry-managetags-delete": "$1 \"$4\" ট্যাগটি {{GENDER:$2|অপসারণ করেছেন}} ($5টি {{PLURAL:$5|সংস্করণ বা লগ ভুক্তি|সংস্করণ ও/বা লগ ভুক্তি}} সরানো হয়েছে)",
+       "logentry-managetags-activate": "$1 \"$4\" ট্যাগটি ব্যবহারকারী ও বট দ্বারা ব্যবহারের জন্য {{GENDER:$2|সক্রিয়}} করেছেন",
        "logentry-managetags-deactivate": "$1 \"$4\" ট্যাগটি ব্যবহারকারী ও বট দ্বারা ব্যবহারের জন্য {{GENDER:$2|নিষ্ক্রিয়}} করেছেন",
        "log-name-tag": "ট্যাগ লগ",
+       "log-description-tag": "এই পাতাতে দেখানো হয়েছে কখন কখন ব্যবহারকারীরা নির্দিষ্ট সংশোধন বা লগ ভুক্তিতে [[Special:Tags|ট্যাগ]] যোগ বা সেখান থেকে ট্যাগ অপসারণ করেছেন। যখন কোন সম্পাদনা, অপসারণ বা এই জাতীয় কর্মের অংশ হিসেবে ট্যাগ করা হয়, সেই ট্যাগগুলি এই লগে তালিকাভুক্ত করা হয় না।",
+       "logentry-tag-update-add-revision": "$1 $3 পাতার $4 নং সংস্করণে $6 {{PLURAL:$7|ট্যাগটি|ট্যাগগুলি}} {{GENDER:$2|যোগ করেছেন}}",
+       "logentry-tag-update-add-logentry": "$1 $3 পাতার $5 নং লগ ভুক্তিতে $6 {{PLURAL:$7|ট্যাগটি|ট্যাগগুলি}} {{GENDER:$2|যোগ করেছেন}}",
+       "logentry-tag-update-remove-revision": "$1 $3 পাতার $4 নং লগ সংস্করণ থেকে $8 {{PLURAL:$9|ট্যাগটি|ট্যাগগুলি}} {{GENDER:$2|সরিয়েছেন}}",
+       "logentry-tag-update-remove-logentry": "$1 $3 পাতার $5 নং লগ ভুক্তি থেকে $8 {{PLURAL:$9|ট্যাগটি|ট্যাগগুলি}} {{GENDER:$2|সরিয়েছেন}}",
+       "logentry-tag-update-revision": "$1 $3 পাতার $4 নং সংস্করণের ট্যাগগুলি {{GENDER:$2|হালনাগাদ করেছেন}} ($6 {{PLURAL:$7|যোগ করা হয়েছে}}; $8 {{PLURAL:$9|সরানো হয়েছে}})",
+       "logentry-tag-update-logentry": "$1 $3 পাতার $5 নং লগ ভুক্তির ট্যাগগুলি {{GENDER:$2|হালনাগাদ করেছেন}} ($6 {{PLURAL:$7|যোগ করা হয়েছে}}; $8{{PLURAL:$9|সরানো হয়েছে}})",
        "rightsnone": "(কিছু নাই)",
        "rightslogentry-temporary-group": "$1 (সাময়িক, $2 পর্যন্ত)",
        "feedback-adding": "পাতায় প্রতিক্রিয়া যোগ হচ্ছে...",
        "pagelang-reason": "কারণ",
        "pagelang-submit": "জমা দাও",
        "pagelang-nonexistent-page": "$1 শিরোনামে কোন পাতা নেই।",
-       "pagelang-db-failed": "ডাটাবেস পৃষ্ঠার ভাষা পরিবর্তন করতে ব্যর্থ হয়েছে।",
+       "pagelang-unchanged-language": "$1 পাতাটি ইতিমধ্যে $2 ভাষায় নির্ধারণ করা আছে।",
+       "pagelang-unchanged-language-default": "$1 পাতাটি ইতিমধ্যেই উইকির পূর্বনির্ধারিত বিষয়বস্তুর ভাষায় নির্ধারণ করা আছে।",
+       "pagelang-db-failed": "ডাটাবেস পাতার ভাষা পরিবর্তন করতে ব্যর্থ হয়েছে।",
        "right-pagelang": "পাতার ভাষা পরিবর্তন করুন",
        "action-pagelang": "পাতার ভাষা পরিবর্তন করুন",
        "log-name-pagelang": "ভাষা পরিবর্তন লগ",
        "log-description-pagelang": "এটি পাতার ভাষা পরিবর্তনের লগ।",
        "logentry-pagelang-pagelang": "$1 $3-এর ভাষা $4 থেকে $5-এ {{GENDER:$2|পরিবর্তন}} করেছেন",
+       "default-skin-not-found": "ওহো! আপনার উইকির পূর্বনির্ধারিত আবরণ, যেটি <code dir=\"ltr\">$wgDefaultSkin</code>-এ <code>$1</code> হিসেবে সংজ্ঞায়িত, সেটি পাওয়া যাচ্ছে না।\n\nআপনার ইনস্টলেশনে মনে হচ্ছে নিম্নোক্ত {{PLURAL:$4|আবরণ|আবরণগুলি}} অন্তর্ভুক্ত আছে। কী করে {{PLURAL:$4।|এটি|এগুলি}} সক্রিয় করতে হবে এবং পূর্বনির্ধারিতটি নির্বাচন করতে হবে, তার জন্য [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Skin configuration] দেখুন। \n\n$2\n\n; যদি আপনি খুব সম্প্রতি মিডিয়াউইকি ইন্সটল করে থাকেন:\n: আপনি সম্ভবত গিট থেকে অথবা সরাসরি উৎস কোড থেকে অন্য কোন পদ্ধতি অনুসরণ করে ইন্সটল করেছেন। এমনটাই প্রত্যাশিত।  [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org-এর বহিরাবরণ নির্দেশিকা] থেকে নিচের পদ্ধতিগুলির সাহায্যে কিছু আবরণ ইন্সটল করার চেষ্টা করুন:\n:* [https://www.mediawiki.org/wiki/Download টারবল ইন্সটলারটি] ডাউনলোড করে; এটিতে অনেকগুলি আবরণ ও এক্সটেনশন রয়েছে। আপনি <code>skins/</code> সরাসরি প্রতিলিপি করে সাঁটতে পারেন।\n:* নির্দিষ্ট আবরণ টারবলগুলি [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org] থেকে ডাউনলোড করতে পারেন।\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins গিট ব্যবহার করে বহিরাবরণ ডাউনলোড করতে পারেন]\n: আপনি যদি মিডিয়াউইকি ডেভেলপার হয়ে থাকেন, তাহলে এ কাজটি করলে আপনার গিট সংগ্রহশালার সাথে এটির সংঘাত হবে না।\n; আপনি যদি খুব সম্প্রতি মিডিয়াউইকির সর্বশেষ সংস্করণে হালনাগাদ করে থাকেন:\n: মিডিয়াউইকির ১.২৪ এবং নতুনতর সংস্করণগুলি ইন্সটলকৃত আবরণগুলি আর স্বয়ংক্রিয়ভাবে সক্রিয় করে না। ([https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: Skin autodiscovery] দেখুন)। আপনি <code>LocalSettings.php</code> ফাইলটির ভেতরে নিম্নোক্ত  {{PLURAL:$5|লাইন|লাইনগুলি}} সেঁটে ইন্সটলকৃত {{PLURAL:$5|আবরণ|আবরণগুলি}} সক্রিয় করতে পারেন:\n\n<pre dir=\"ltr\">$3</pre>\n\n; আপনি যদি খুব সম্প্রতি <code>LocalSettings.php</code> পরিবর্তন করে থাকেন:\n: বানান ত্রুটির জন্য বহিরাবরণের নামগুলি পুনরায় পরীক্ষা করুন।",
+       "default-skin-not-found-no-skins": "ওহো! আপনার উইকির পূর্বনির্ধারিত, যেটি <code dir=\"ltr\">$wgDefaultSkin</code>-এ <code>$1</code> হিসেবে সংজ্ঞায়িত, সেটি পাওয়া যাচ্ছে না।\n\nআপনার কোন আবরণ ইন্সটল করা হয়নি।\n\n; যদি আপনি খুব সম্প্রতি মিডিয়াউইকি ইন্সটল করে থাকেন বা মিডিয়াউইকির সর্বশেষ সংস্করণে হালনাগাদ করে থাকেন:\n: আপনি সম্ভবত গিট থেকে অথবা সরাসরি উৎস কোড থেকে অন্য কোন পদ্ধতি অনুসরণ করে ইন্সটল করেছেন। এমনটাই প্রত্যাশিত। মিডিয়াউইকির ১.২৪ এবং নতুনতর সংস্করণগুলি মূল সংগ্রহশালাতে এখন আর কোন আবরণ অন্তর্ভুক্ত থাকে না। আর স্বয়ংক্রিয়ভাবে সক্রিয় করে না।  [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org-এর আবরণ নির্দেশিকা] থেকে নিচের পদ্ধতিগুলির সাহায্যে কিছু আবরণ ইন্সটল করার চেষ্টা করুন:\n:* [https://www.mediawiki.org/wiki/Download টারবল ইন্সটলারটি] ডাউনলোড করে; এটিতে অনেকগুলি আবরণ ও এক্সটেনশন রয়েছে। আপনি <code>skins/</code> সরাসরি প্রতিলিপি করে সাঁটতে পারেন।\n:* নির্দিষ্ট আবরণ টারবলগুলি [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org] থেকে ডাউনলোড করতে পারেন।\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins গিট ব্যবহার করে বহিরাবরণ ডাউনলোড করতে পারেন]\n: আপনি যদি মিডিয়াউইকি ডেভেলপার হয়ে থাকেন, তাহলে এ কাজটি করলে আপনার গিট সংগ্রহশালার সাথে এটির সংঘাত হবে না।([https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Skin configuration]-এ দেখুন) কীভাবে বহিরাবরণগুলি সক্রিয় করতে হয় এবং কোন আবরণটি পুনর্নির্ধারিত হবে, তা কীভাবে নির্বাচন করতে হয়।",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (সক্রিয় করা)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 (<strong>নিষ্ক্রিয় করা</strong>)",
        "mediastatistics": "মিডিয়া পরিসংখ্যান",
        "json-error-ctrl-char": "অক্ষর নিয়ন্ত্রণ ত্রুটি, সম্ভবত ভুল এনকোডকৃত",
        "json-error-syntax": "সিনট্যাক্স ত্রুটি",
        "json-error-utf8": "ত্রুটিপূর্ণ ইউটিএফ-৮ অক্ষর, সম্ভবত ভুল এনকোডকৃত",
+       "json-error-recursion": "যে মানটি এনকোড করা হবে সেটিতে এক বা তার অধিক রিকার্সিভ সূত্র আছে",
+       "json-error-inf-or-nan": "এনকোড করার জন্য মানে এক বা একাধিক NAN অথবা INF মান বিদ্যমান",
        "json-error-unsupported-type": "এনকোড করা যাবে না এমন একটি মানের ধরন দেয়া হয়েছে",
        "headline-anchor-title": "এই অনুচ্ছেদে সংযোগ",
        "special-characters-group-latin": "লাতিন",
        "special-characters-group-thai": "থাই",
        "special-characters-group-lao": "লাও",
        "special-characters-group-khmer": "খেমার",
+       "special-characters-group-canadianaboriginal": "কানাডীয় আদিবাসী",
        "special-characters-title-endash": "en ড্যাশ",
        "special-characters-title-emdash": "em ড্যাশ",
        "special-characters-title-minus": "বিয়োগ চিহ্ন",
        "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": "সংশোধন অপসারণ",
        "log-action-filter-managetags-delete": "ট্যাগ অপসারণ",
        "log-action-filter-managetags-activate": "ট্যাগ সক্রিয়করণ",
        "log-action-filter-managetags-deactivate": "ট্যাগ নিষ্ক্রিয়করণ",
+       "log-action-filter-move-move": "পুনর্নির্দেশগুলি মুছে নতুন করে না লিখে স্থানান্তর",
+       "log-action-filter-move-move_redir": "পুনর্নির্দেশগুলি মুছে নতুন করে লিখে স্থানান্তর",
        "log-action-filter-newusers-create": "বেনামী ব্যবহারকারী দ্বারা সৃষ্টি",
        "log-action-filter-newusers-create2": "নিবন্ধিত ব্যবহারকারী দ্বারা সৃষ্টি",
        "log-action-filter-newusers-autocreate": "স্বয়ংক্রিয় সৃষ্টি",
        "log-action-filter-protect-move_prot": "সুরক্ষা স্থানান্তরিত",
        "log-action-filter-rights-rights": "ম্যানুয়াল পরিবর্তন",
        "log-action-filter-rights-autopromote": "স্বয়ংক্রিয় পরিবর্তন",
+       "log-action-filter-suppress-event": "লগ বিলোপন",
+       "log-action-filter-suppress-revision": "সম্পাদনা দমন",
+       "log-action-filter-suppress-delete": "পাতা বিলোপন",
+       "log-action-filter-suppress-block": "বাধাদানের মাধ্যমে ব্যবহারকারী দমন",
+       "log-action-filter-suppress-reblock": "পুনরায় বাধাদানের মাধ্যমে ব্যবহারকারী দমন",
        "log-action-filter-upload-upload": "নতুন আপলোড",
        "log-action-filter-upload-overwrite": "পুনঃআপলোড",
+       "authmanager-authn-not-in-progress": "শনাক্তকরণ প্রক্রিয়াটি আর অগ্রসর হচ্ছে না কিংবা সেশনের উপাত্ত হারিয়ে গেছে। অনুগ্রহ করে আবার শুরু থেকে শুরু করুন।",
        "authmanager-authn-no-primary": "সরবরাহকৃত পরিচয়পত্রের অনুমোদন যাচাই করা যায়নি।",
+       "authmanager-authn-no-local-user": "সরবরাহকৃত পরিচয়জ্ঞাপক তথ্যগুলি এই উইকির কোনও ব্যবহারকারীর সাথে সংশ্লিষ্ট নয়।",
+       "authmanager-authn-no-local-user-link": "সরবরাহকৃত পরিচয়জ্ঞাপক তথ্যগুলি সঠিক আছে, কিন্তু এই উইকির কোনও ব্যবহারকারীর সাথে সংশ্লিষ্ট নয়। ভিন্ন কোন পদ্ধতিতে অ্যাকাউন্টে প্রবেশ করুন, অথবা নতুন নামে একটি ব্যবহারকারী অ্যাকাউন্ট সৃষ্টি করুন। তাহলে পূর্বের পরিচয়জ্ঞাপক তথ্যগুলি ঐ অ্যাাকাউন্টের সাথে সংযুক্ত করার একটি সুযোগ পাবেন।",
        "authmanager-authn-autocreate-failed": "একটি স্থানীয় অ্যাকাউন্টের স্বয়ংক্রিয়-সৃষ্টি ব্যর্থ হয়েছে: $1",
+       "authmanager-change-not-supported": "সরবরাহকৃত পরিচয়জ্ঞাপক উপাত্তগুলি পরিবর্তন করা সম্ভব নয়, কারণ কোনকিছুই এগুলি ব্যবহার করবে না।",
        "authmanager-create-disabled": "অ্যাকাউন্ট সৃষ্টিকরণ নিষ্ক্রিয় করা হয়েছে।",
        "authmanager-create-from-login": "আপনার একাউন্ট তৈরি করতে, ক্ষেত্রগুলি পূরণ করুন।",
+       "authmanager-create-not-in-progress": "অ্যাকাউন্ট সৃষ্টির প্রক্রিয়াটি আর অগ্রসর হচ্ছে না কিংবা সেশনের উপাত্ত হারিয়ে গেছে। অনুগ্রহ আবার শুরু থেকে শুরু করুন।",
+       "authmanager-create-no-primary": "সরবরাহকৃত পরিচয়জ্ঞাপক উপাত্তগুলি অ্যাকাউন্ট সৃষ্টির জন্য ব্যবহার করা সম্ভব হ‍য়নি।",
+       "authmanager-link-no-primary": "সরবরাহকৃত পরিচয়জ্ঞাপক উপাত্তগুলি অ্যাকাউন্ট সংযুক্তকরণের জন্য ব্যবহার করা সম্ভব হয়নি।",
+       "authmanager-link-not-in-progress": "অ্যাকাউন্ট সংযুক্তকরণ প্রক্রিয়াটি আর অগ্রসর হচ্ছে না কিংবা সেশনের উপাত্ত হারিয়ে গেছে। অনুগ্রহ আবার শুরু থেকে শুরু করুন।",
        "authmanager-authplugin-setpass-failed-title": "পাসওয়ার্ড পরিবর্তন ব্যর্থ হয়েছে",
        "authmanager-authplugin-setpass-failed-message": "প্রমাণীকরণ প্লাগইন পাসওয়ার্ড পরিবর্তন করতে অস্বীকৃতি জানিয়েছে।",
        "authmanager-authplugin-create-fail": "প্রমাণীকরণ প্লাগইন অ্যাকাউন্ট তৈরি করতে অস্বীকৃতি জানিয়েছে।",
        "authmanager-autocreate-noperm": "স্বয়ংক্রিয় অ্যাকাউন্ট সৃষ্টি মঞ্জুরিপ্রাপ্ত নয়।",
        "authmanager-autocreate-exception": "স্বয়ংক্রিয় অ্যাকাউন্ট সৃষ্টিকরণ পূর্ববর্তী ত্রুটির কারণে সাময়িকভাবে অক্ষম করা হয়েছে।",
        "authmanager-userdoesnotexist": "ব্যবহারকারী অ্যাকাউন্ট \"$1\" অনিবন্ধিত।",
+       "authmanager-userlogin-remembermypassword-help": "পাসওয়ার্ডটিকে আপনার সংযুক্তাবস্থা বা সেশনের দৈর্ঘ্যের চেয়ে বেশী সময়ের জন্য মনে রাখতে হবে কি না",
        "authmanager-username-help": "প্রমাণীকরণের জন্য ব্যবহারকারী নাম।",
        "authmanager-password-help": "প্রমাণীকরণের জন্য পাসওয়ার্ড।",
        "authmanager-domain-help": "বহিঃস্থ প্রমাণীকরণের জন্য ডোমেইন।",
        "authmanager-provider-password": "পাসওয়ার্ড-ভিত্তিক প্রমাণীকরণ।",
        "authmanager-provider-password-domain": "পাসওয়ার্ড ও ডোমেইন-ভিত্তিক প্রমাণীকরণ।",
        "authmanager-provider-temporarypassword": "অস্থায়ী পাসওয়ার্ড",
+       "authprovider-confirmlink-message": "আপনার সাম্প্রতিক অ্যাকাউন্টে প্রবেশের প্রচেষ্টাগুলির উপর ভিত্তি করে জানা গেছে যে নিচের অ্যাকাউন্টগুলির সাথে আপনার উইকি অ্যাকাউন্টটি সংযুক্ত করে দেওয়া সম্ভব। ঐ অ্যাকাউন্টগুলির সাথে সংযুক্ত হলে আপনি ঐগুলি থেকে প্রবেশ করতে পারবেন। অনুগ্রহ যে অ্যাকাউন্টগুলির সাথে সংযুক্ত হতে চান, সেগুলি নির্বাচন করুন।",
        "authprovider-confirmlink-request-label": "অ্যাকাউন্ট যা সংযুক্ত হওয়া উচিত",
        "authprovider-confirmlink-success-line": "$1: সংযোগ করা সফল হয়েছে।",
        "authprovider-confirmlink-failed": "অ্যাকাউন্ট সংযোগ করা সম্পূর্ণরূপে সফল হয়নি: $1",
        "restrictionsfield-label": "অনুমোদিত আইপি পরিসীমা:",
        "restrictionsfield-help": "লাইন প্রতি একটি আইপি ঠিকানা বা CIDR পরিসীমা। সবকিছু সক্রিয় করতে ব্যবহার করুন: :<pre>0.0.0.0/0\n::/0</pre>",
        "revid": "সংশোধন $1",
-       "pageid": "পাতার আইডি $1"
+       "pageid": "পাতার আইডি $1",
+       "rawhtml-notallowed": "&lt;html&gt; ট্যাগ স্বাভাবিক পৃষ্ঠাগুলির বাহিরে ব্যবহার করা যাবে না।",
+       "gotointerwiki": "{{SITENAME}} ছেড়ে যাচ্ছেন",
+       "gotointerwiki-invalid": "নিদিষ্টকৃত শিরোনামটি অবৈধ ছিল।",
+       "gotointerwiki-external": "আপনি [[$2]] পরিদর্শন করতে {{SITENAME}} ছাড়তে চলেছেন যা একটি ভিন্ন ওয়েবসাইট।\n\n[$1 $1-এ অবিরত থাকতে এখানে ক্লিক করুন]।",
+       "undelete-cantedit": "আপনি এই পাতাটি ফিরিয়ে আনতে পারবেন না কারণ আপনার এই পাতাটি সম্পাদনা করার অনুমতি নেই।",
+       "undelete-cantcreate": "আপনি এই পাতাটি ফিরিয়ে আনতে পারবেন না কারণ এই নামে কোন পাতা বিদ্যমান নেই ও আপনার এই পাতাটি তৈরি করার অনুমতি নেই।"
 }
index 6ef5b5f..1ecfc7e 100644 (file)
@@ -31,8 +31,9 @@
        "tog-enotifminoredits": "امیل به مو سی صفحات ناقص اصلاح شده",
        "tog-enotifrevealaddr": "نشودادن امیل مو درامیلهای آگاهی-خبری",
        "tog-shownumberswatching": "نشودادن شماره کاربران درحال کار یاتماشا",
-       "tog-fancysig": "امضاهای ناتمام - بدون لینکهای اتوماتیک",
-       "tog-uselivepreview": "استفاده زه پیش نمایش زنده(جاوااسکریپ) (تجربی )",
+       "tog-oldsig": "امضا ایسنی",
+       "tog-fancysig": "امضایل ناتموم",
+       "tog-uselivepreview": "پیش سئیل زندە ڤن ڤا کار",
        "tog-forceeditsummary": "یادآوری سریع به مو هنگام اصلاح عقیم وخلاصه",
        "tog-watchlisthideown": "قایم کردن اصلاحات مو  زه لیست پیگیریها",
        "tog-watchlisthidebots": "قایم کردن اصلاحات بوت زه لیست پیگیریها",
        "createacct-reason": "دلیل",
        "createacct-submit": "هساڤ خوتۈنإ راسد کونين",
        "createacct-another-submit": "راسد کردن هساڤ کارياري",
+       "createacct-benefit-heading": "{{SITENAME}}  ڤئ دسد خلکي چي ايسا رأڤأندیاری ڤابيڌإ.",
        "createacct-benefit-body1": "{{PLURAL:$1|ڤيرایشد|ڤيرایشدا}}",
        "createacct-benefit-body2": "{{PLURAL:$1|بألگأ|بألگإ آ}}",
        "createacct-benefit-body3": "تازأ{{PLURAL:$1|هوميار|هوميارا}}",
        "preview": "پیش نمایش",
        "showpreview": "پیش‌نمایش",
        "showdiff": "نشودادن تغییرات",
-       "anoneditwarning": "'''توجه:''' ایسا داخل سیستم نوابیدین.\nآی پی آدرستو درگزارش اصلاح صفحه ضبط ابوه.",
+       "anoneditwarning": "<strong>زئنار:</strong> شوما هأنی نیوٙمایتە ڤامین. تیرنئشوٙن آی پی شوما سی هأر گاتی کئ آلئشتکاری بأکیت سی کول خألک دیاری می کە. أر <strong>[$1 روئیت ڤامین]</strong> یا <strong>[$2 یئ گئل حئساڤ کاریاری راس بأکیت]</strong>، ڤیرایئشتیا شوما ڤئ نوم کاریاری خوتوٙ دیاری می کە و سی شوما بیتأرە.",
        "summary-preview": "پیش نمایش - خلاصه:",
        "blockedtext": " \"'''دسترسی نام کاربری یا نشانی اینترنتی ایسا بسته وابیده.'''\nای کار توسط $1 انجام شده‌است.\nدلیلی که گده اینه: $2''\n* آغاز قطع دسترسی: $8\n* زمان اتمام ای قطع دسترسی: $6\n* کاربری که قطع دسترسی‌اش در نظر بیده: $7\nایساترین با $1 یا یکی از [[{{MediaWiki:Grouppage-sysop}}|مدیران]] تماس بگیرین و در ای باره صحبت کنین.\nتوجه کنین که ایسا نترین زه امکان «ارسال پست الکترونیکی به ای کاربر» استفاده کنین مگر این که نشانی پست الکترونیکی معتبری در [[Special:Preferences|اولویتهای کاربری]]خود ثبت کرده بوین.\nنشانی IP ایسا $3 و شماره قطع دسترسی ایسا $5 است. لطفاً ای شماره‌ها را در همه کاوشهاتون ذکر کنین.\nایسا ترین با $1 یا یکی دیه زه [[{{MediaWiki:Grouppage-sysop}}|مدیران]] تماس بگیرین، تا در باره ای قطع دسترسی صحبت کنین.\nدقت کنین که سی ارسال پست الکترونیکی در ویکی، وا پست الکترونیکی خود را زه طریق صفحه[[Special:Preferences|تنظیمات]] فعال کرده بوین، و نیز، وا امکان استفاده زه ای ویژگی سی ایساقطع نبوه.\nنشانی اینترنتی الان ایسا $3 است و شماره قطع دسترسی $5 است.\nلطفاً ای شماره را در هر درخواستی که در ای مورد مطرح اکنین ذکر کنین",
        "loginreqtitle": "ڤامإن إڤوڌن لازومإ",
        "newarticle": "(تازه)",
        "newarticletext": "ايسا ز دين یأ هومپیڤأندي هڌين کإ نيڌس. سي رأڤأندياري بألگإ شورۈ کونين مإن اي جأڤإ دإڤۈني بنڤيسين(سي دونسدن بیشدر سإیل [$1]کونین).\nأر ايسا سي إشتڤاکاري ايچونين، دوگمإ رأهڌن ڤاپوشد نأ بپۈرنين.",
        "noarticletext": " ايسإ اي بألگإ نإڤشدإیي نارإ، ايسا تإرين [[Special:Search/{{PAGENAME}}داسۈن اي بألگإ نإ مإن بألگإآ ديأري پی جۈري کونين]] یا [{{fullurl:{{FULLPAGENAME}}|action=edit}} اي بألگإ نأ ڤيرایشد کونين].",
+       "noarticletext-nopermission": " ايسإ اي بألگإ نإڤشدإیي نارإ، ايسا تإرين [[Special:Search/{{PAGENAME}}داسۈن اي بألگإ نإ مإن بألگإآ ديأري پی جۈري کونين]] یا [{{fullurl:{{FULLPAGENAME}}|action=edit}} اي بألگإ نأ ڤيرایشد کونين].",
        "previewnote": "'''ای فقط یه پیش نمایشه;\nتغییراتی که ایسا دادین هنی ضبط نوابیده!'''",
        "editing": "درحال اصلاح $1",
        "creating": "راسد کردن $1",
        "templatesusedpreview": "قالبها  یا الگوهای استفاده وابیده در ای پیش نمایش:",
        "template-protected": "(تحت حمایت)",
        "template-semiprotected": "(نیمه حمایت وابیده)",
+       "hiddencategories": "اي بلگأ یکي ز أندوما {{PLURAL:$1|1 hidden category|$1 hidden categories}} إ:",
        "nocreatetext": "{{SITENAME}}قابلیت درست کردن صفحات تازه را محدود کرده‌. ترین برگردین و صفحه‌ موجود را اصلاح کنین یا اینکه  [[Special:UserLogin|به سیستم داخل بوین یا حساب کاربری درست کنین]].",
        "permissionserrorstext-withaction": "ايسا سی نياگري $2 سإلا\nنارين {{PLURAL:$1|دلیل|دليلا}}:",
        "recreate-moveddeleted-warn": "'''هشدار: ایسا در حال درست کردن دوباره صفحه‌ای هدین که قبلاً حذف وابیده '''در نظر داشته بوین که ادامه اصلاح ای صفحه کار درستی هده یا نه. نمایه حذف مربوط به ای صفحه سی راحتی کار در ادامه اویده",
        "lineno": "سطر $1:",
        "compareselectedversions": "مقایسه نسخه‌های انتخاب‌ وابیده",
        "editundo": "لغو اصلاح آخر",
+       "diff-multi-sameuser": "({{PLURAL:$1|یه دۈنإ نسقه مینجایی|$1 نسقه یل مینجایی}} ب دسد{{PLURAL:$2|کاریاری ديأ|$2 کاريارا}} نشۈن داڌإ نڤابيڌإ)",
        "searchresults": "نتيجأ آ پی جۈري سي",
        "searchresults-title": "نتيجإ آ پی جوري سي \"$1\"",
        "prevn": "قبلی {{PLURAL:$1|$1}}",
        "nextn-title": "نيایي $1 {{PLURAL:$1|نتيجه|نتيجإآ}}",
        "shown-title": "نإشۈن دائن $1 {{PLURAL:$1|نتيجأ|نتيجإ آ}} سي هر بألگأ",
        "viewprevnext": "مشاهده ($1 {{int:pipe-separator}} $2) ($3)",
+       "searchmenu-new": "<strong>اي بلگإ نأ مإن \"[[:$1]]\" اي ڤيکي راسد کو!</strong> {{PLURAL:$2|0=|See also the page found with your search.|See also the search results found.}}",
        "searchprofile-articles": "بلگه آ مینونه دار",
        "searchprofile-images": "ڤارسگرا خلکمند",
        "searchprofile-everything": "همه چی",
        "search-suggest": "منزۈرت یو بي:$1",
        "search-interwiki-more": "(بيشدر)",
        "searchall": "همه",
+       "search-showingresults": "{{PLURAL:$4|نتیجه یل<strong>$1</strong> د <strong>$3</strong>|نتیجه یل<strong>$1 - $2</strong د <strong>$3</strong>}}",
        "search-nonefound": "هیژ نتیجه یی وا پی جست تو یکی نئ.",
        "powersearch-toggleall": "همأ",
        "powersearch-togglenone": "هيش کوم",
        "enhancedrc-history": "ڤیرگار",
        "recentchanges": "تغییرات اخیر",
        "recentchanges-legend": "گزينإ آ آلشدا ايسإني",
+       "recentchanges-summary": "دو بیشتر آلشدا تازباو نه د ویکی نه د ای بلگه پیگری کو.",
        "recentchanges-feed-description": "ردیابی آخرین تغییرات  ویکی در ای خورد",
        "recentchanges-label-newpage": "ای ويرايشت يه بلگه تازه راس كرده",
        "recentchanges-label-minor": "یو یه ويرايشت کوچيره",
        "recentchangeslinked-title": "تغییرهای مرتبط با $1",
        "recentchangeslinked-summary": " ای صفحه خاص تغییرات اخیر در صفحه‌های لینک داده شده به این صفحه را نشو اده.\nصفحه‌هایی که در لیست پی‌گیریهای ایسا بون به شکل '''سیاه''' نشو داده ابون.",
        "recentchangeslinked-page": "نوم بألگە:",
+       "recentchangeslinked-to": "آلشتیایی که د بلگه یا هوم پیوند بینه وه جا بلگه دئیه بیه نشو بیه",
        "upload": "آپلود فایل",
        "uploadbtn": "آپلود فایل",
        "uploadlogpage": "نمایه آپلود",
        "tooltip-recreate": "دوباره درست کردن صفحه ای که زه رو کینه وغرض پاک وابیده",
        "tooltip-upload": "شروع آپلود",
        "tooltip-rollback": "\"اعاده\" برگرداندن به وضع اولیه سی ای صفحه که بخاطر مشارکت  آخر اصلاح وابیده بایک کلیک",
+       "tooltip-undo": "انجوم نگرتن ای ویرایشت ورگن و همه فرمیا ویرایشت تانه که حالت پیش سیل واکو.یه اجازه میئه سی اضاف کردن یه دلیل د چکسته.",
        "tooltip-summary": "یأ چکسدأ کۈچير ڤارڌ کونين",
        "simpleantispam-label": "Anti-spam check.\nپور<strong>نکنين</strong> ايچو نأ!",
        "pageinfo-toolboxlink": "دونسمندیا بلگه",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|چک چنه]])",
        "version": "ترجمه یا تفسیر",
        "specialpages": "صفحات ویژه",
-       "tag-filter": "[[Special:سرديسا|سرديس]] فيلتر :",
+       "tag-filter": "[[Special:سرديسا|سرديس]] فيلتر:",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|سرديس|سرديسا}}]]: $2)",
        "logentry-delete-delete": "$1 بألگأ {{GENDER:$2|پاکسا ڤابيأ}} $3",
        "logentry-move-move": "$1 {{GENDER:$2|جا ب جا کردإ}} بألگأ $3 نأ سي $4",
index 684020e..8d0ecf9 100644 (file)
        "post-expand-template-argument-warning": "Diwallit : war ar bajenn-mañ ez eus eus da nebeutañ un arventenn eus ur patrom zo re vras.\nA-gostez eo bet lezet an arventenn-se.",
        "post-expand-template-argument-category": "Pajennoù enno arventennoù patrom bet lezet a-gostez",
        "parser-template-loop-warning": "Patrom e kelc'h detektet : [[$1]]",
+       "template-loop-category": "Pajennoù enno lagadennoù patrom",
+       "template-loop-category-desc": "Ul lagadenn batrom zo er bajenn, d.l.e. ur patrom en em c'halv e-unan en ur mod rekursivel.",
        "parser-template-recursion-depth-warning": "Tizhet bevenn donder galvoù rekursivek ar patromoù ($1)",
        "language-converter-depth-warning": "Aet eur en tu all d'ar vevenn amdreiñ yezhoù ($1)",
        "node-count-exceeded-category": "Pajennoù m'eur aet en tu all d'an niver a skoulmoù",
        "page_first": "kentañ",
        "page_last": "diwezhañ",
        "histlegend": "Sellet ouzh an diforc'hioù : lakait un ask adal d'ar stummoù a fell deoc'h keñveriañ ha pouezit war kadarnaat pe war ar bouton en traoñ.<br />\nAlc'hwez : (red) = diforc'hioù gant ar stumm a-vremañ,\n(diwez) = diforc'hioù gant ar stumm kent, D = kemm dister",
-       "history-fieldset-title": "Furchal en istor",
+       "history-fieldset-title": "Klask adweladennoù",
        "history-show-deleted": "Stumm diverket hepken",
        "histfirst": "koshañ",
        "histlast": "nevezañ",
        "revdelete-no-file": "N'eus ket eus ar restr spisaet ganeoc'h.",
        "revdelete-show-file-confirm": "Ha sur oc'h e fell deoc'h gwelet stumm diverket ar restr \"<nowiki>$1</nowiki>\" deiziataet eus an $2 da $3?",
        "revdelete-show-file-submit": "Ya",
-       "revdelete-selected-text": "{{PLURAL:$1|Stummoù diuzet|Stumm diuzet}} of [[:$2]]:",
+       "revdelete-selected-text": "{{PLURAL:$1|Stumm diuzet}} eus [[:$2]]:",
        "revdelete-selected-file": "{{PLURAL:$1|Stumm eus ar restr diuzet}} evit [[:$2]] :",
        "logdelete-selected": "{{PLURAL:$1|Darvoud eus ar marilh diuzet}} :",
        "revdelete-text-text": "Dont a raio c'hoazh war wel ar stummoù diverket en istor ar bajenn met ne c'hallo ket an dud gwelet darn eus an danvez ken.",
        "rcfilters-invalid-filter": "Sil direizh",
        "rcfilters-empty-filter": "Sil oberiant ebet. War wel emañ an holl gemmoù.",
        "rcfilters-filterlist-title": "Siloù",
+       "rcfilters-filterlist-whatsthis": "Petra eo se ?",
        "rcfilters-filterlist-feedbacklink": "Reiñ ho soñj diwar-benn ar siloù (beta) nevez",
        "rcfilters-highlightbutton-title": "Lakaat an disoc'hoù war wel",
        "rcfilters-highlightmenu-title": "Dibabit ul liv",
        "rcfilters-highlightmenu-help": "Diuzañ ul liv evit lakaat ar perzh-mañ war wel",
        "rcfilters-filterlist-noresults": "N'eus bet kavet sil ebet",
+       "rcfilters-noresults-conflict": "N'eus bet kavet disoc'h ebet rak dezverkoù klask kontrol zo",
+       "rcfilters-state-message-subset": "Ar sil-mañ ne ra netra rak kavet e vez e zisoc'hoù e-mesk ar {{PLURAL:$2|sil|siloù}} klask da heul (klaskit e lakaat war wel evit diforc'han anezhañ) : $1",
+       "rcfilters-state-message-fullcoverage": "Diuzañ an holl siloù en ur strollad zo evel diuzañ netra, setu ne raio ket netra ar sil-mañ. Er strollad emañ : $1",
        "rcfilters-filtergroup-registration": "Enskrivadur an implijer",
        "rcfilters-filter-registered-label": "Marilhet",
        "rcfilters-filter-registered-description": "Aozerien gevreet.",
        "rcfilters-filter-unregistered-label": "Divarilh",
        "rcfilters-filter-unregistered-description": "Aozerien n'int ket kevreet.",
-       "rcfilters-filter-unregistered-conflicts-user-experience-level": "Dizoberiant eo ar sil \"dienroll\" peogwir eo nullet e wered gant ar {{PLURAL:$2|sil|siloù}} Arroutet, na {{PLURAL:$2|gav|gavont}} nemet an implijerien enrollet : $1",
+       "rcfilters-filter-unregistered-conflicts-user-experience-level": "Tabut zo etre ar sil-mañ hag ar {{PLURAL:$2|sil|siloù}} Arroutet, na {{PLURAL:$2|gav|gavont}} nemet an implijerien enrollet : $1",
        "rcfilters-filtergroup-authorship": "Kemmañ anv an aozer",
        "rcfilters-filter-editsbyself-label": "Kemmet ganeoc'h",
        "rcfilters-filter-editsbyself-description": "Kemmet ganeoc'h",
        "rcfilters-filter-editsbyother-label": "Kemmet gant tud all",
        "rcfilters-filter-editsbyother-description": "Kemmoù graet gant implijerien all (ket ganeoc'h).",
        "rcfilters-filtergroup-userExpLevel": "Live skiant-prenañ (evit an implijer enrollet hepken)",
-       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "Dizoberiant eo ar sil-mañ peogwir ne gav nemet implijerien enrollet, dre se emañ nullet e wered gant ar sil \"Dienroll\".",
-       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "Emañ ar sil \"Dienroll\" oc'h en em sikanañ gant ur sil Arroutet pe meur a hini. Ar siloù Arroutet a gav implijerien enrollet hepken. Ar siloù o tabutal zo merket evel dizoberiant a-us.",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "Ar siloù Arroutet ne gavont nemet implijerien enrollet, se zo kaoz zo tabut etre ar sil-mañ hag ar sil \"Dienroll\".",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "Emañ ar sil \"Dienroll\" o tabutal gant gant ur sil Arroutet pe gant meur a hini. Ar siloù Arroutet a gav implijerien enrollet hepken. Ar siloù o tabutal zo merket en takad Siloù oberiant a-us.",
        "rcfilters-filter-user-experience-level-newcomer-label": "Tud nevez-deuet",
        "rcfilters-filter-user-experience-level-newcomer-description": "Nebeutoc'h eget 10 kemm ha 4 devezh obererezh.",
        "rcfilters-filter-user-experience-level-learner-label": "Deskarded",
        "rcfilters-filter-categorization-description": "Roll ar pajennoù ouzhpennet da rummadoù zo pe dilamet diouto.",
        "rcfilters-filter-logactions-label": "Obererezhioù enrollet",
        "rcfilters-filter-logactions-description": "Obererezhioù melestradurel, krouiñ kontoù, diverkañ pajennoù, enporzhiañ...",
+       "rcfilters-hideminor-conflicts-typeofchange-global": "Tabut zo etre ar sil \"Kemmoù dister\" hag unan pe meur a sil a Seurt kemmoù peogwir n'haller merkañ kemmoù zo evel \"dister\". Kavet e vo ar siloù o tabutal e takad ar siloù gweredekaet, a-us.",
+       "rcfilters-hideminor-conflicts-typeofchange": "Seurtoù kemmoù zo n'hallont ket bezañ merket evel \"dister,\", rak se ez eus tabut etre ar sil-mañ ha siloù ar Seurtoù kemmoù da heul : $1",
+       "rcfilters-typeofchange-conflicts-hideminor": "Tabut zo etre ar sil-mañ Seurt kemmoù gant sil ar \"c'hemmoù dister\". Kemmoù zo n'hallont ket bezañ merket evel \"dister\".",
        "rcnotefrom": "Setu aze {{PLURAL:$5|ar c'hemm|ar c'hemmoù}} c'hoarvezet abaoe an <strong>$3, $4</strong> (<strong>$1</strong> d'ar muiañ).",
        "rclistfrom": "Diskouez ar c'hemmoù diwezhañ abaoe an/ar $3 $2",
        "rcshowhideminor": "$1 ar c'hemmoù dister",
        "undeleteviewlink": "gwelet",
        "undeleteinvert": "Eilpennañ an diuzadenn",
        "undeletecomment": "Abeg :",
-       "undeletedrevisions": "Adsavet {{PLURAL:$1|1 stumm|$1 stumm}}",
-       "undeletedrevisions-files": "Adsavet ez ez eus bet {{PLURAL:$1|1 stumm|$1 stumm}} ha {{PLURAL:$2|1 restr|$2 restr}}",
-       "undeletedfiles": "{{PLURAL:$1|1 restr|$1 restr}} adsavet",
        "cannotundelete": "Dibosupl eo bet nullañ diziverkadennoù zo pe an holl anezho :\n$1",
        "undeletedpage": "'''Diziverket eo bet $1'''\n\nSellit ouzh [[Special:Log/delete|marilh an diverkadennoù]] evit teuler ur sell ouzh an diverkadennoù diwezhañ.",
        "undelete-header": "Gwelet [[Special:Log/delete|al log diverkañ]] evit ar pajennoù diverket nevez zo.",
        "newimages-summary": "Diskouez a ra ar bajenn dibar-mañ roll ar restroù diwezhañ bet enporzhiet.",
        "newimages-legend": "Sil",
        "newimages-label": "Anv ar restr (pe darn anezhi) :",
+       "newimages-user": "Chomlec'h IP pe anv implijer",
        "newimages-showbots": "Diskouez an ezporzhiadennoù graet gant robotoù",
        "newimages-hidepatrolled": "Kuzhat ar enporzhiadennoù gwiriet",
        "noimages": "Netra da welet.",
        "tags-apply-no-permission": "N'oc'h ket aotreet da lakaat tikedennoù kemmañ da dalvezout a-gevret gant ho kemmoù.",
        "tags-apply-blocked": "N'hallit ket lakaat da dalvezout ar c'hemmañ tikedennoù hag ho kemmoù e-keit hag {{GENDER:$1|emaoc'h}} stanket.",
        "tags-apply-not-allowed-one": "N'haller ket lakaat an dikedenn \"$1\" da dalvezout gant an dorn.",
+       "tags-apply-not-allowed-multi": "N'eo ket aotreet lakaat an {{PLURAL:$2|dikedenn}} da heul da dalvezout gant an dorn : $1",
+       "tags-update-no-permission": "N'oc'h ket aotreet da ouzhpennañ pe da lemel kuit tikedennoù kemmañ diwar stummoù hiniennel pe monedoù marilh.",
+       "tags-update-blocked": "N'hallit ket ouzhpennañ pe dilemel tikedennoù kemmañ e-keit hag {{GENDER:$1|emaoc'h}} stanket.",
+       "tags-update-add-not-allowed-one": "N'haller ket ouzhpennañ an dikedenn \"$1\" gant an dorn.",
+       "tags-update-add-not-allowed-multi": "N'eo ket aotreet ouzhpennañ an {{PLURAL:$2|dikedenn}} da heul gant an dorn : $1",
+       "tags-update-remove-not-allowed-one": "N'haller dilemel an dikedenn \"$1\".",
+       "tags-update-remove-not-allowed-multi": "N'haller ket dilemel an {{PLURAL:$2|dikedenn}} gant an dorn : $1",
        "tags-edit-title": "Kemmañ an tikedennoù",
        "tags-edit-manage-link": "Merañ an tikedennoù",
+       "tags-edit-revision-selected": "{{PLURAL:$1|stumm diuzet}} eus [[:$2]]:",
+       "tags-edit-logentry-selected": "{{PLURAL:$1|Darvoud eus ar marilh diuzet}} :",
+       "tags-edit-revision-legend": "Ouzhpennañ pe lemel tikedennoù a-ziwar {{PLURAL:$1|ar stumm-mañ|an $1 stumm zo}}",
+       "tags-edit-logentry-legend": "Ouzhpennañ pe dilemel tikedennoù a-ziwar {{PLURAL:$1|ar moned marilh-mañ|ar $1 moned marilh zo}}",
        "tags-edit-existing-tags": "Tikedennoù zo anezho :",
        "tags-edit-existing-tags-none": "<em>Hini ebet</em>",
        "tags-edit-new-tags": "Tikedennoù nevez :",
        "tags-edit-remove": "Dilemel an tikedennoù-mañ :",
        "tags-edit-remove-all-tags": "(dilemel an holl dikedennoù)",
        "tags-edit-chosen-placeholder": "Diuzañ un nebeud tikedennoù",
+       "tags-edit-chosen-no-results": "N'eus bet kavet tikedenn ebet o klotañ",
        "tags-edit-reason": "Abeg :",
+       "tags-edit-revision-submit": "Lakaat ar c'hemmoù da dalvezout evit {{PLURAL:$1|ar stumm-mañ|$1 stumm}}",
+       "tags-edit-logentry-submit": "Lakaat ar c'hemmoù da dalvezout evit {{PLURAL:$1|ar moned marilh-mañ|$1 moned marilh}}",
        "tags-edit-success": "Lakaet eo bet ar c'hemmoù da dalvezout",
+       "tags-edit-failure": "N'eus ket bet gallet lakaat ar c'hemmoù da dalvezout :\n$1",
+       "tags-edit-nooldid-title": "Stumm pal direizh",
+       "tags-edit-nooldid-text": "Pe n'eus ket bet spisaet ganeoc'h stumm pal resis ebet da lakaat an arc'hwel-mañ da oberiañ warnañ, pe n'eus ket eus ar stumm spisaet.",
+       "tags-edit-none-selected": "Diuzit da nebeutañ un dikedenn da vezañ ouzhpennet pe dilamet.",
        "comparepages": "Keñveriañ pajennoù",
        "compare-page1": "Pajenn 1",
        "compare-page2": "Pajenn 2",
        "compare-revision-not-exists": "N'eus ket eus an adweladenn spisaet ganeoc'h.",
        "dberr-problems": "Ho tigarez ! Kudennoù teknikel zo gant al lec'hienn-mañ.",
        "dberr-again": "Gortozit un nebeud munutennoù a-raok adkargañ.",
-       "dberr-info": "(Dibosupl kevreañ ouzh servijer an diaz roadennoù: $1)",
-       "dberr-info-hidden": "(Ne c'haller ket mont da servijer an diaz roadennoù)",
+       "dberr-info": "(Dibosupl kevreañ ouzh an diaz roadennoù : $1)",
+       "dberr-info-hidden": "(Ne c'haller ket mont d'an diaz roadennoù)",
        "dberr-usegoogle": "E-keit-se esaeit klask dre c'hGoogle.",
        "dberr-outofdate": "Notit mat e c'hall o menegerioù dezho bezañ dispredet e-keñver ar boued zo ganeomp.",
        "dberr-cachederror": "Un eilstumm memoret eus ar bajenn goulennet eo hemañ, gallout a ra bezañ dispredet.",
        "htmlform-date-placeholder": "BBBB-MM-DD",
        "htmlform-time-placeholder": "HH:MM:SS",
        "htmlform-datetime-placeholder": "BBBB-MM-DD HH:MM:SS",
+       "htmlform-date-invalid": "An talvoud lakaet ganeoc'h n'eo ket un deiziad anavezet. Klaskit gant ar furmad BBBB-MM-DD.",
+       "htmlform-time-invalid": "An talvoud lakaet ganeoc'h n'eo ket un eur anavezet. Klaskit gant ar furmad HH:MM:SS.",
+       "htmlform-datetime-invalid": "An talvoud lakaet ganeoc'h n'eo ket un deiziad nag un eur anavezet. Klaskit gant ar furmad BBBB-MM-DD HH:MM:SS.",
+       "htmlform-date-toolow": "An talvoud lakaet ganeoc'h zo a-raok an deiziad aotreet abretañ hag a zo $1.",
+       "htmlform-date-toohigh": "An talvoud lakaet ganeoc'h zo war-lerc'h an deiziad aotreet diwezhañ hag a zo $1.",
+       "htmlform-time-toolow": "An talvoud lakaet ganeoc'h zo a-raok an eur aotreet abretañ hag a zo $1.",
+       "htmlform-time-toohigh": "An talvoud lakaet ganeoc'h zo war-lerc'h an eur aotreet diwezhañ hag a zo $1.",
+       "htmlform-datetime-toolow": "An talvoud lakaet ganeoc'h zo a-raok an deiziad hag eur aotreet abretañ hag a zo $1.",
+       "htmlform-datetime-toohigh": "An talvoud lakaet ganeoc'h zo war-lerc'h an deiziad hag eur aotreet diwezhañ hag a zo $1.",
+       "htmlform-title-badnamespace": "N'emañ ket [[:$1]] en esaouenn anv \"{{ns:$2}}\".",
+       "htmlform-title-not-creatable": "N'haller ket reiñ an titl \"$1\" d'ur bajenn bennak",
        "htmlform-title-not-exists": "N'eus ket eus $1.",
        "htmlform-user-not-exists": "N'eus ket eus <strong>$1</strong>.",
        "htmlform-user-not-valid": "Un anv implijer direizh eo <strong>$1</strong>.",
        "logentry-delete-delete": "Diverket eo bet ar bajenn $3 gant $1",
+       "logentry-delete-delete_redir": "{{GENDER:$2|Friket}} eo bet an adkas $3 gant $1",
        "logentry-delete-restore": "Assavet eo bet ar bajenn $3 gant $1",
        "logentry-delete-event": "Kemmet eo bet gwelusted {{PLURAL:$5|un darvoud eus ar marilh|$5 darvoud eus ar marilh}} d'an $3 gant $1 : $4",
        "logentry-delete-revision": "{{GENDER:$2|Kemmet}} eo bet gwelusted {{PLURAL:$5|reizhadenn|$5 reizhadenn}} war ar bajenn $3 gant $1 : $4",
        "revdelete-uname-unhid": "anv implijer war wel",
        "revdelete-restricted": "Lakaat ar strishadurioù da dalvezout evit ar verourien",
        "revdelete-unrestricted": "dilemel ar strishadurioù evit ar verourien",
+       "logentry-block-block": "$1 {{GENDER:$2|Stanket}} eo bet {{GENDER:$4|$3}} gant $1 e-pad $5 $6",
+       "logentry-block-unblock": "{{GENDER:$2|Distanket}} eo bet {{GENDER:$4|$3}} gant $1",
+       "logentry-block-reblock": "{{GENDER:$2|Kemmet}} eo bet gant $1 doareoù stankañ {{GENDER:$4|$3}} gant ur pad kevatal da $5 $6",
+       "logentry-suppress-block": "{{GENDER:$2|Stanket}} eo bet {{GENDER:$4|$3}} gant $1 e-pad $5 $6",
+       "logentry-suppress-reblock": "{{GENDER:$2|Kemmet}} eo bet gant $1 doareoù stankañ {{GENDER:$4|$3}} e-pad $5 $6",
+       "logentry-import-upload": "{{GENDER:$2|Enporzhiet}} eo bet $3 dre bellgargañ gant $1",
+       "logentry-import-upload-details": "{{GENDER:$2|Enporzhiet}} eo bet $3 gant $1 dre bellgargañ restroù ($4 {{PLURAL:$4|adweladenn}})",
+       "logentry-import-interwiki": "{{GENDER:$2|Enporzhiet}} eo bet $3 gant $1 adalek ur wiki all",
+       "logentry-import-interwiki-details": "{{GENDER:$2|Enporzhiet}} eo bet $3 adalek $5 gant $1 ($4 {{PLURAL:$4|adweladenn}})",
+       "logentry-merge-merge": "$1 {{GENDER:$2|en deus lakaet|he deus lakaet}} $3 da gendeuziñ e $4 (adweladennoù betek $5)",
        "logentry-move-move": "$1 en deus kaset ar bajenn $3 da $4",
        "logentry-move-move-noredirect": "kaset ar bajenn $3 da $4 gant $1 hep adkas",
        "logentry-move-move_redir": "kaset ar bajenn $3 da $4 gant $1 dreist un adkas",
        "logentry-newusers-create2": "Gant $1 eo bet krouet ar gont implijer $3",
        "logentry-newusers-byemail": "Krouet eo bet ar gont implijer $3 gant $1 ha kaset eo bet ar ger-tremen dre bostel",
        "logentry-newusers-autocreate": "{{GENDER:$2|Krouet}} eo bet kont $1 ent emgefre",
+       "logentry-protect-move_prot": "$1 {{GENDER:$2|en deus|he deus}} cheñchet an arventennoù gwarez eus $4 da $3",
+       "logentry-protect-unprotect": "{{GENDER:$2|Lamet eo bet}} gwarez $3 gant $1",
        "logentry-protect-protect": "$1 {{GENDER:$2|en|he}} deus gwarezet $3 $4",
+       "logentry-protect-protect-cascade": "{{GENDER:$2|Gwarezet eo bet}} $3 $4 [dre skalierad] gant $1",
+       "logentry-protect-modify": "{{GENDER:$2|KEmmet eo bet}} live gwareziñ $3 $4 gant $1",
+       "logentry-protect-modify-cascade": "{{GENDER:$2|Kemmet eo bet}} live gwareziñ $3 $4 [dre skalierad] gant $1",
+       "logentry-rights-rights": "{{GENDER:$2|Kemmet eo bet}} gant $1 emezeladur {{GENDER:$6|$3}} er strollad eus $4 da $5",
+       "logentry-rights-rights-legacy": "$1 {{GENDER:$2|Kemmet eo bet}} gant $1 emezeladur $3 er strollad",
        "logentry-rights-autopromote": "$1 zo bet {{GENDER:$2|anvet}} ent emgefre a $4 da $5",
        "logentry-upload-upload": "$1 {{GENDER:$2|en deus|he deus}} ezporzhiet $3",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|en deus|he deus}} ezporzhiet ur stumm nevez eus $3",
        "logentry-upload-revert": "$1 {{GENDER:$2|en deus|he deus}} ezporzhiet $3",
+       "log-name-managetags": "Marilh merañ an tikedennoù",
+       "log-description-managetags": "Rollañ a ra ar bajenn-mañ an trevelloù liammet ouzh an [[Special:Tags|tikedennoù]]. N'eus er marilh nemet an oberoù bet kaset da benn dre zorn gant ur merour ; gallout a rafe ar meziant wiki bezañ bet krouet tikedennoù hep na vefent bet enrollet er marilh-mañ.",
+       "logentry-managetags-create": "{{GENDER:$2|Krouet eo bet}} an dikedenn \"$4\" gant $1",
+       "logentry-managetags-delete": "{{GENDER:$2|Diverket eo bet}} an dikedenn \"$4\" gant $1 (lamet diouzh $5 {{PLURAL:$5|adweladenn pe ur marilh moned}})",
+       "logentry-managetags-activate": "{{GENDER:$2|Gweredekaet eo bet}} an dikedenn \"$4\" gant $1 a dalvez evit an implijerien hag ar robotoù",
+       "logentry-managetags-deactivate": "{{GENDER:$2|Diweredekaet eo bet}} an dikedenn \"$4\" gant $1 a dalvez evit an implijerien hag ar robotoù",
+       "log-name-tag": "Marilh tikedennoù",
+       "log-description-tag": "Diskouez a ra ar bajenn-mañ pegoulz ez eus bet ouzhpennet pe dilamet [[Special:Tags|tikedennoù]] gant implijerien diouzh adweladennoù hiniennel pe monedoù marilh. N'eo ket rollet gant ar marilh an oberoù tikedenniñ pa'z int bet graet en ur gemmañ, diverkañ pe en ur ober un dra bennak all damheñvel",
+       "logentry-tag-update-add-revision": "$1 {{GENDER:$2|en deus ouzhpennet|he deus ouzhpennet}} {{PLURAL:$7|an dikedenn|an tikedennoù}} $6 da adweladennn $4 ar bajenn $3",
+       "logentry-tag-update-add-logentry": "$1 {{GENDER:$2|end eus ouzhpennet|he deus ouzhpennet}}  {{PLURAL:$7|an dikedenn|an tikedennoù}} $6 da voned ar marilh $5 eus ar bajenn $3",
+       "logentry-tag-update-remove-revision": "$1 {{GENDER:$2|en deus lamet kuit|he deus lamet kuit}} {{PLURAL:$9|an dikedenn|an tikedennoù}} $8 diouzh adweladenn $4 ar bajenn $3",
+       "logentry-tag-update-remove-logentry": "$1 {{GENDER:$2|en deus lamet kuit|he deus lamet kuit}}  {{PLURAL:$9|an dikedenn|an tikedennoù}} $8 diouzh moned marilh $5 ar bajenn $3",
+       "logentry-tag-update-revision": "$1 {{GENDER:$2|en deus hizivaet|he deus hizivaet}} tikedennoù en adweladenn $4 ar bajenn $3 ({{PLURAL:$7|ouzhpennet}} $6; {{PLURAL:$9|dilamet}} $8)",
+       "logentry-tag-update-logentry": "$1 {{GENDER:$2|en deus hizivaet|he deus hizivaet}} tikedennoù e moned ar marilh $5 eus ar bajenn $3 ({{PLURAL:$7|ouzhpennet}} $6; {{PLURAL:$9|dilamet}} $8)",
        "rightsnone": "(netra)",
        "rightslogentry-temporary-group": "$1 (da c'hortoz, betek $2)",
        "feedback-adding": "Oc'h ouzhpennañ ho soñj war ar bajenn...",
        "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-external-bug-report-button": "Kas un trevell teknikel",
+       "feedback-dialog-title": "Kas evezhiadennoù",
+       "feedback-dialog-intro": "Gallout a rit ober gant ar furmskrid eeun dindan evit kas hoc'h evezhiadennoù. Ouzhpennet e vo ho soñj d'ar bajenn \"$1\", a-gevret gant hoc'h anv implijer.",
        "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",
+       "feedback-error4": "Fazi : dibosupl eo embann gant an titl zo bet lakaet d'an evezhiadenn",
        "feedback-message": "Kemennadenn :",
        "feedback-subject": "Danvez :",
        "feedback-submit": "Kas",
+       "feedback-terms": "Kompren a ran ervat emañ e-barzh titouroù ma gwazour implijer titouroù diwar-benn ma merdeer ha stumm ma reizhiad korvoiñ hag a vo rannet gant an holl asambles gant ma evezhiadennoù.",
+       "feedback-termsofuse": "A-du emaon da gas evezhiadennoù diouzh an termenoù implij.",
        "feedback-thanks": "Ho trugarekaat ! Postet eo bet hoc'h evezhiadenn d'ar bajenn \"[$2 $1]\".",
        "feedback-thanks-title": "Trugarez !",
+       "feedback-useragent": "Gwazour timplijer :",
        "searchsuggest-search": "Klask e {{SITENAME}}",
        "searchsuggest-containing": "ennañ...",
        "api-error-badtoken": "Fazi diabarzh : \"jedouer\" fall.",
        "limitreport-walltime-value": "$1 {{PLURAL:$1|eiladenn}}",
        "limitreport-ppvisitednodes": "Niver a skoulmoù rakprosesor gweladennet",
        "limitreport-ppgeneratednodes": "Niver a skoulmoù rakprosesor ganet",
+       "limitreport-postexpandincludesize": "Ment ensoc'hañ goude an emled",
        "limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$2|okted}}",
        "limitreport-templateargumentsize": "Ment arguzenn ar patrom",
        "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|okted}}",
        "expand_templates_generate_xml": "Gwelet ar gwezennadur XML",
        "expand_templates_generate_rawhtml": "Diskouez an HTML kriz",
        "expand_templates_preview": "Rakwelet",
+       "expand_templates_preview_fail_html": "<em>Dre m'eo gweredekaet HTML kriz {{SITENAME}} ha dre ma'z eus bet kollet roadennoù e-pad an dalc'h eo kuzhet ar rakwel abalamour d'en em wareziñ diouzh tagadennoù JavaScript.</em>\n\n<strong>Klaskit en-dro m'eo dinoaz ho koulenn rakwel.</strong>\nMa ne'z a ket en-dro c'hoazh, klaskit [[Special:UserLogout|digevreañ]] hag adkevreañ goude-se, goude bezañ gwiriet mat eo digor ho merdeer d'an toupinoù evit al lec'hienn-mañ.",
+       "expand_templates_preview_fail_html_anon": "<em>Dre m'eo gweredekaet HTML kriz {{SITENAME}} ha dre ma n'oc'h ket kevreet eo kuzhet ar rakwel abalamour d'en em wareziñ diouzh tagadennoù JavaScript.</em>\n\n<strong>M'eo dinoaz ho koulenn rakwel, [[Special:UserLogin|kevreit]] ha klaskit en-dro.</strong>",
+       "expand_templates_input_missing": "Ret eo deoc'h lakaat da nebeutañ un tamm testenn moned.",
        "pagelanguage": "Kemmañ yezh ar bajenn",
        "pagelang-name": "Pajenn",
        "pagelang-language": "Yezh",
        "pagelang-submit": "Kas",
        "pagelang-nonexistent-page": "N'eus ket eus ar bajenn $1.",
        "pagelang-unchanged-language": "Kefluniet eo c'hoazh ar bajenn $1 e $2.",
+       "pagelang-unchanged-language-default": "Arventennet eo ar bajenn $1 evit bezañ e yezh dre ziouer danvez ar wiki dija.",
+       "pagelang-db-failed": "N'en deus ket gallet an diaz roadennoù cheñch yezh ar bajenn",
        "right-pagelang": "Cheñch yezh ar bajenn",
        "action-pagelang": "cheñch yezh ar bajenn",
        "log-name-pagelang": "Marilh ar cheñchamantoù yezh",
        "log-description-pagelang": "Hemañ zo ur marilh eus ar c'hemmoù e pajenn ar yezhoù.",
        "logentry-pagelang-pagelang": "$1 {{GENDER:$2|en deus|he deus}} cheñchet yezh ar bajenn $3 eus $4 da $5.",
+       "default-skin-not-found": "Hopala ! N'haller ket tizhout gwiskadur dre ziouer ho wiki termenet gant <code dir=\"ltr\">$wgDefaultSkin</code> evel <code>$1</code>.\n\nEvit doare emañ ar {{PLURAL:$4|gwiskadur|gwiskadurioù}} da heul en ho staliadur. Sellit ouzh [https://www.mediawiki.org/wiki/Manual:Skin_configuration dornlevr kefluniañ ar gwiskadurioù] evit gouzout penaos gweredekaat {{PLURAL:$4|anezhañ|anezho}} ha dibab an hini dre ziouer.\n\n$2\n\n; M'emaoc'h o paouez staliañ MediaWiki :\n: eo bet staliet ganeoc'h adalek git moarvat, pe war-eeun adalek ar c'hod tarzh gant un doare bennak all. Normal eo. Klaskit staliañ ar gwiskadurioù adalek [https://www.mediawiki.org/wiki/Category:All_skins kavlec'h gwiskadurioù mediawiki.org], dre :\n:* Pellgargañ [https://www.mediawiki.org/wiki/Download restr tar ar stalier], zo ennañ meus a wiskadur hag astennoù. Gallout a rit eilañ pegañ ar c'havlec'h <code>skins/</code> alese.\n:* Pellgargañ restroù tar ar gwiskadurioù hiniennel adalek [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins Pellgargañ gwiskadurioù gant Git].\n: Ma rit evel-se ne zlefe ket trubuilhañ ho sanailh git ma'z oc'h un diorroer eus MediaWiki.\n\n; M'emaoc'h o paouez hizivaat MediaWiki :\n: Ne vez ket mui gweredekaet ent emgefre ar gwiskadurioù stalier gant MediaWiki 1.24 ha pelloc'h (gwelet [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery dornlevr dizoleiñ ar gwiskadurioù ent emgefre]). Pegañ {{PLURAL:$5|al linenn da heul|al linennoù da heul}} a c'hallit e <code>LocalSettings.php</code> evit gweredekaat {{PLURAL:$5|ar gwiskadur zo staliet c'hoazh|an holl wiskadurioù staliet evit poent}} :\n\n<pre dir=\"ltr\">$3</pre>\n\n; M'emaoc'h o paouez cheñch <code>LocalSettings.php</code> :\n: gwiriit div wech anv ar gwiskadurioù kuit na vije vioù-koukoug.",
+       "default-skin-not-found-no-skins": "Hopala ! N'hallet ket tizhout gwiskadur dre ziouer ho wiki termenet gant <code>$wgDefaultSkin</code> comme <code>$1</code>.\n\nN'eus bet staliet gwiskadur ebet.\n\n; M'emaoc'h o paouez staliañ pe hizivaat MediaWiki :\n: Eo bet graet ganeoc'h adalek git moarvat, pe war-eeun adalek ar c'hod tarzh gant un doare bennak all. Normal eo. Abaoe MediaWiki 1.24 ha pelloc'h n'eus mui gwiskadur ebet er sanailh pennañ. Klaski staliañ gwiskadurioù adalek [https://www.mediawiki.org/wiki/Category:All_skins kavlec'h gwiskadurioù mediawiki.org], dre :\n:* Pellgargañ [https://www.mediawiki.org/wiki/Download restr tar ar stalier] zo ennañ meus a seurt gwiskadur hag astennoù. Gallout a rit eilan-pegañ ar c'havlec'h <code>skins/</code> alese.\n:* Pellgargañ restroù tar ar gwiskadurioù hiniennel adalek [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins Ober gant Git evit pellgargañ gwiskadurioù].\n: Ma rit evel-se ne zlefe ket trubuilhañ ho sanailh git ma'z oc'h un diorroer eus MediaWiki. Gwelet [https://www.mediawiki.org/wiki/Manual:Skin_configuration dornlevr kefluniañ ar gwiskadurioù] evit gouzout an doare da weredekaat ar gwiskadurioù ha da zibab an hini dre ziouer.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (gweredekaet)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 (<strong>diweredekaet</strong>)",
        "mediastatistics": "Stadegoù ar media",
+       "mediastatistics-summary": "Stadegoù diwar-benn ar seurt restroù enporzhiet. Ne gemer e kont nemet stumm nevesañ ar restroù. A-gostez e vez laosket ar stummoù kozh pe diverket.",
        "mediastatistics-nbytes": "{{PLURAL:$1|$1 okted|$1 a oktedoù}} ($2; $3%)",
+       "mediastatistics-bytespertype": "Ment hollek ar restr evit ar rann-mañ : {{PLURAL:$1|$1 okted}} ($2; $3%).",
+       "mediastatistics-allbytes": "Ment hollek evit an holl restrom : {{PLURAL:$1|$1 okted}} ($2).",
        "mediastatistics-table-mimetype": "Seurt MIME",
        "mediastatistics-table-extensions": "Astennoù hag a c'haller lakaat",
        "mediastatistics-table-count": "Niver a restroù",
        "mediastatistics-header-drawing": "Tresadennoù (skeudennoù vektorel)",
        "mediastatistics-header-audio": "Kleved",
        "mediastatistics-header-video": "Videoioù",
+       "mediastatistics-header-multimedia": "Media fonnus",
        "mediastatistics-header-office": "Burev",
        "mediastatistics-header-text": "Testenn",
+       "mediastatistics-header-executable": "Parzhioù erounezadus",
        "mediastatistics-header-archive": "Furmadoù gwasket",
        "mediastatistics-header-total": "An holl restroù",
        "json-warn-trailing-comma": "$1 {{PLURAL:$1|virgulenn|a virgulennoù}} dibenn zo bet lamet eus JSON",
        "json-error-unknown": "Ur gudenn a oa gant ar JSON. Fazi : $1",
        "json-error-depth": "Aet eur en tu all da zonder brasañ an torn",
        "json-error-state-mismatch": "JSON direizh pe stummet fall",
+       "json-error-ctrl-char": "Fazi arouezenn gontrolliñ. Enkodet eo bet fall marteze.",
        "json-error-syntax": "Fazi ereadur",
        "json-error-utf8": "Arouezennoù UTF-8 stummet fall, enkodet en un doare direizh marteze",
+       "json-error-recursion": "Bez' ez eus unan pe meur a zaveenn rekursivel en talvoud da enkodiñ",
+       "json-error-inf-or-nan": "Bez' ez eus unan pe meur a dalvoud NAN pe INF en talvoud da enkodiñ",
+       "json-error-unsupported-type": "Lakaet ez eus bet ur seurt talvoud n'hall ket bezañ enkodet.",
        "headline-anchor-title": "Liamm war-zu ar rannbennad-mañ",
        "special-characters-group-latin": "Latin",
        "special-characters-group-latinextended": "Latin astennet",
        "special-characters-group-thai": "Thai",
        "special-characters-group-lao": "Laoseg",
        "special-characters-group-khmer": "Khmer",
+       "special-characters-title-endash": "tired berr",
+       "special-characters-title-emdash": "tired hir",
+       "special-characters-title-minus": "arouezenn nemet",
+       "mw-widgets-dateinput-no-date": "N'eus bet diuzet deiziad ebet",
+       "mw-widgets-mediasearch-input-placeholder": "Klask mediaoù",
        "mw-widgets-mediasearch-noresults": "N'eus bet kavet disoc'h ebet.",
        "mw-widgets-titleinput-description-new-page": "N'eus ket eus ar bajenn-se c'hoazh",
        "mw-widgets-titleinput-description-redirect": "adkas war-zu $1",
        "mw-widgets-categoryselector-add-category-placeholder": "Ouzhpennañ ur rummad...",
        "mw-widgets-usersmultiselect-placeholder": "Ouzhpennañ muioc'h...",
+       "sessionmanager-tie": "N'hallet ket kevrediñ meur a seurt reked dilesañ : $1.",
        "sessionprovider-generic": "$1 estez",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "Eztez diazezet war toupinoù",
        "sessionprovider-nocookies": "Marteze eo diweredekaet an toupinoù. Bezit sur eo gweredekaet an toupinoù ha klaskit en-dro.",
        "log-action-filter-suppress-reblock": "Diverkañ implijerien dre stankadennoù lies",
        "log-action-filter-upload-upload": "Enporzhiadenn nevez",
        "log-action-filter-upload-overwrite": "Adenporzhiañ",
+       "authmanager-authn-not-in-progress": "Ne'z a ket war-raok an dilesadur pe kollet ez eus bet roadennoù dalc'h marteze. Adkrogit adalek ar penn-kentañ.",
        "authmanager-authn-no-primary": "N'eus ket bet gallet gwiriañ an titouroù kred lakaet.",
+       "authmanager-authn-no-local-user": "An titouroù anaout pourchaset n'int ket liammet gant implijer ebet er wiki-mañ.",
        "authmanager-authn-no-local-user-link": "Reizh eo an titouroù kred lakaet met n'int ket liammet ouzh implijer ebet eus ar wiki-mañ. Ma kevreit en ur mod all pe ma krouit ur gont implijer nevez e c'hallot liammañ ho titouroù kred kent ouzh ar gont-mañ.",
+       "authmanager-authn-autocreate-failed": "C'hwitet eo bet krouidigezh ur gont lec'hel ent emgefre : $1",
        "authmanager-change-not-supported": "N'haller ket cheñch an titouroù kred rak netra na rafe ganto.",
        "authmanager-create-disabled": "Diweredekaet eo ar c'hrouiñ kontoù.",
        "authmanager-create-from-login": "Evit krouiñ ho kont, leuniit ar maeziennoù.",
+       "authmanager-create-not-in-progress": "Ne'z a ket war-raok krouidigezh ar gont pe kollet ez eus bet roadennoù dalc'h marteze. Adkrogit adalek ar penn-kentañ.",
        "authmanager-create-no-primary": "N'eus ket bet gallet implijout an titouroù kred lakaet evit krouiñ ur gont.",
+       "authmanager-link-no-primary": "Ne c'hallomp ket liammañ ur gont gant an titouroù anaout pourchaset.",
+       "authmanager-link-not-in-progress": "Ne'z a ket war-raok al liammañ kontoù pe kollet ez eus bet roadennoù dalc'h marteze. Adkrogit adalek ar penn-kentañ.",
        "authmanager-authplugin-setpass-failed-title": "C'hwitet eo bet ar cheñchamant ger-tremen",
+       "authmanager-authplugin-setpass-failed-message": "Nac'het eo bet cheñch ar ger-tremen gant an adveziant dilesa.",
+       "authmanager-authplugin-create-fail": "Nac'het eo bet krouiñ ar gont gant an adveziant dilesa.",
+       "authmanager-authplugin-setpass-denied": "N'eo ket aotreet cheñch gerioù-tremen gant an adveziant dilesa.",
        "authmanager-authplugin-setpass-bad-domain": "Domani direizh.",
+       "authmanager-autocreate-noperm": "N'haller ket krouiñ kontoù ent emgefre.",
+       "authmanager-autocreate-exception": "Diweredekaet eo bet ar c'hrouiñ kontoù evit ar mare abalamour da fazioù kent.",
        "authmanager-userdoesnotexist": "N'eo ket enrollet ar gont implijer \"$1\".",
+       "authmanager-userlogin-remembermypassword-help": "Daoust ha rankout a reer derc'hel soñj eus ar ger-tremen pelloc'h eget pad an dalc'h.",
        "authmanager-username-help": "Anv implijer evit ar gwiriekaat.",
        "authmanager-password-help": "Ger-tremen evit ar gwiriekaat.",
        "authmanager-domain-help": "Domani evit ar gwiriekaat diavaez.",
        "authmanager-realname-label": "Anv gwir",
        "authmanager-realname-help": "Anv gwir an implijer",
        "authmanager-provider-password": "Gwiriekadur diazezet war ur ger-termen",
+       "authmanager-provider-password-domain": "Dilesadur diazezet war ur ger-tremen hag an domani",
        "authmanager-provider-temporarypassword": "Ger-tremen da c'hortoz",
+       "authprovider-confirmlink-message": "Diwar an taolioù-esae diwezhañ graet ganeoc'h evit kevreañ e c'haller liammañ ar c'hontoù da heul ouzh ho kont wiki. Ur wech liammet e c'hallit kevreañ dre ar c'hontoù-se. Diuzit ar re zo da vezañ liammet.",
        "authprovider-confirmlink-request-label": "Kontoù a zlefe bezañ liammet",
        "authprovider-confirmlink-success-line": "$1: bet liammet ervat.",
+       "authprovider-confirmlink-failed": "N'omp ket deuet a-benn da liamm ar gont : $1",
+       "authprovider-confirmlink-ok-help": "Kenderc'hel goude bezañ diskwelet kemennadennoù c'hwitadenn al liammañ.",
        "authprovider-resetpass-skip-label": "Lammat",
        "authprovider-resetpass-skip-help": "Lammat adderaouekaat ar ger-tremen.",
+       "authform-nosession-login": "Mat eo bet an dilesadur met ho merdeer n'eo ket evit \"kaout soñj\" eo bet kevreet.\n\n$1",
+       "authform-nosession-signup": "Krouet eo bet ar gont ervat met ho merdeer n'eo ket evit \"kaout soñj\" eo bet kevreet.\n\n$1",
        "authform-newtoken": "Jedouer a vank. $1",
        "authform-notoken": "Jedouer a vank",
        "authform-wrongtoken": "Jedouer fall",
        "specialpage-securitylevel-not-allowed-title": "Berzet",
+       "specialpage-securitylevel-not-allowed": "Ho tigarez, n'oc'h ket aotreet d'ober gant ar bajenn-mañ rak n'eus ket bet gallet gwiriañ piv oc'h.",
        "authpage-cannot-login": "N'haller ket kregiñ da gevreañ",
+       "authpage-cannot-login-continue": "Dibosupl kenderc'hel gant ar gevreadenn. Echu eo an dalc'h evit doare.",
        "authpage-cannot-create": "N'haller ket kregiñ da grouiñ ar gont.",
+       "authpage-cannot-create-continue": "Dibosupl eo kenderc'hel da grouiñ ar gont. Echu eo an dalc'h evit doare.",
        "authpage-cannot-link": "Dibosupl kregiñ da liammañ ar gont.",
        "authpage-cannot-link-continue": "Dibosupl kenderc'hel da liammañ ar gont. Aet eo an eztez d'he zermen moarvat.",
        "cannotauth-not-allowed-title": "Aotre nac'het",
        "unlinkaccounts": "Diliammañ ar c'hontoù",
        "unlinkaccounts-success": "Diliammet eo bet ar gont.",
        "authenticationdatachange-ignored": "N'eus ket bet gallet cheñch ho roadennoù anaout. Marteze a-wac'h peogwir ne oa ket bet kefluniet pourvezer ebet.",
+       "userjsispublic": "Notit mat : ne zlefe ket bezañ roadennoù personel en ispajennoù JavaScript rak an implijerien all a c'hall gwelet anezho.",
+       "usercssispublic": "Notit mat : ne zlefe ket bezañ roadennoù personel en ispajennoù CSS rak an implijerien all a c'hall gwelet anezho.",
        "restrictionsfield-badip": "Chomlec'h IP pe lijorenn direizh : $1",
        "restrictionsfield-label": "Lijorennoù IP aotreet :",
        "restrictionsfield-help": "Ur chomlec'h IP pe un esaouenn CIDR dre linenn. Evit gweredekaat pep tra, ober gant <pre>0.0.0.0/0\n::/0</pre>",
        "revid": "Adweladenn $1",
-       "pageid": "ID ar bajenn $1"
+       "pageid": "ID ar bajenn $1",
+       "rawhtml-notallowed": "N'hall an tikedennoù &lt;html&gt; bezañ implijet nemet er pajennoù normal."
 }
index 16910ae..47d504d 100644 (file)
@@ -24,7 +24,8 @@
                        "Srdjan m",
                        "Semso98",
                        "Matma Rex",
-                       "Сербијана"
+                       "Сербијана",
+                       "Asmen"
                ]
        },
        "tog-underline": "Podvuci veze:",
        "aboutsite": "O {{GRAMMAR:dativ|{{SITENAME}}}}",
        "aboutpage": "Project:O {{GRAMMAR:dativ|{{SITENAME}}}}",
        "copyright": "Sadržaj je dostupan pod licencom $1 osim ako je navedeno drugačije.",
-       "copyrightpage": "{{ns:project}}:Autorska_prava",
+       "copyrightpage": "{{ns:project}}:Autorska prava",
        "currentevents": "Novosti",
        "currentevents-url": "Project:Novosti",
        "disclaimers": "Odricanje odgovornosti",
        "rcfilters-activefilters": "Aktivni filteri",
        "rcfilters-restore-default-filters": "Vrati predodređene filtere",
        "rcfilters-clear-all-filters": "Ukloni sve filtere",
+       "rcfilters-search-placeholder": "Filtriraj nedavne izmjene (prelistajte mogućnosti ili počnite kucati)",
        "rcfilters-invalid-filter": "Neispravan filter",
-       "rcfilters-empty-filter": "Nema aktivnih filtera. Svi doprinosi su prikazani.",
+       "rcfilters-empty-filter": "Nema aktivnih filtera. Prikazani su svi doprinosi.",
        "rcfilters-filterlist-title": "Filteri",
+       "rcfilters-filterlist-feedbacklink": "Pružite povratne informacije o novim (beta) filterima",
+       "rcfilters-highlightbutton-title": "Istakni rezultate",
+       "rcfilters-highlightmenu-title": "Izaberite boju",
+       "rcfilters-highlightmenu-help": "Izaberite boju da biste istaknuli ovo svojstvo",
        "rcfilters-filterlist-noresults": "Nema filtera",
+       "rcfilters-filtergroup-registration": "Registracija korisnika",
        "rcfilters-filter-registered-label": "Registrirani",
        "rcfilters-filter-registered-description": "Prijavljeni korisnici.",
        "rcfilters-filter-unregistered-label": "Anonimni",
        "undeleteviewlink": "pogledaj",
        "undeleteinvert": "Obrni izbor",
        "undeletecomment": "Razlog:",
-       "undeletedrevisions": "{{PLURAL:$1|vraćena $1 verzija|vraćene $1 verzije|vraćeno $1 verzija}}",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 verzija|$1 verzije|$1 verzija}} i {{PLURAL:$2|1 datoteka|$2 datoteke|$2 datoteka}} vraćeno",
-       "undeletedfiles": "{{PLURAL:$1|1 datoteka vraćena|$1 datoteke vraćene|$1 datoteka vraćeno}}",
        "cannotundelete": "Vraćanje jedne ili svih stavki nije uspjelo:\n$1",
        "undeletedpage": "<strong>Stranica $1 je vraćena</strong>\n\nProvjerite [[Special:Log/delete|zapisnik brisanja]] za zapise nedavnih brisanja i vraćanja.",
        "undelete-header": "Pogledajte [[Special:Log/delete|zapisnik brisanja]] za nedavno obrisane stranice.",
        "hebrew-calendar-m6": "Adar",
        "hebrew-calendar-m6a": "Adar I",
        "hebrew-calendar-m6b": "Adar II",
-       "hebrew-calendar-m7": "Nisan",
+       "hebrew-calendar-m7": "Nisane",
        "hebrew-calendar-m8": "Iyar",
        "hebrew-calendar-m9": "Sivan",
        "hebrew-calendar-m10": "Tamuz",
        "special-characters-group-thai": "tajlandski",
        "special-characters-group-lao": "laoski",
        "special-characters-group-khmer": "kmerski",
+       "special-characters-group-canadianaboriginal": "kanadski domorodni",
        "special-characters-title-endash": "crtica",
        "special-characters-title-emdash": "duga crta",
        "special-characters-title-minus": "minus",
index e8161bc..f2602f3 100644 (file)
        "changepassword-success": "S'ha canviat la vostra contrasenya!",
        "changepassword-throttled": "Heu realitzat massa intents d'inici de sessió.\nEspereu $1 abans de tornar-ho a provar.",
        "botpasswords": "Contrasenyes de bot",
+       "botpasswords-summary": "Les <em>contrasenyes de bot</em> permeten accedir a un compte d'usuari a través de l'API sense utilitzar les credencials de sessió principals del compte. Els permisos d'usuari disponibles quan s'ha iniciat una sessió amb una contrasenya de bot poden estar restringits.\n\nSi no sabeu perquè ho hauríeu de menester, segurament no us cal. Ningú mai no us hauria de demanar que genereu una contrasenya o l'hi doneu.",
        "botpasswords-disabled": "S'han inhabilitat les contrasenyes dels bots",
        "botpasswords-no-central-id": "Per a utilitzar contrasenyes de bots heu d'haver iniciat una sessió en un compte centralitzat.",
        "botpasswords-existing": "Contrasenyes de bot existents",
        "selfredirect": "<strong>Avís:</strong> Esteu redirigint la pàgina a si mateixa.\nPodeu haver especificat un objectiu erroni per a la redirecció, o potser esteu modificant una pàgina incorrecta.\nSi feu clic a «{{int:savearticle}}» una vegada més, la redirecció es crearà de totes maneres.",
        "missingcommenttext": "Introduïu un comentari a continuació.",
        "missingcommentheader": "<strong>Recordatori:</strong> no heu proporcionat un assumpte/encapçalament per al comentari.\nSi feu clic de nou al botó «{{int:savearticle}}», la vostra contribució es desarà sense cap.",
-       "summary-preview": "Previsualització del resum:",
+       "summary-preview": "Previsualització del resum de modificació:",
        "subject-preview": "Previsualització de l’assumpte:",
        "previewerrortext": "S'ha produït un error quan es provava de previsualitzar els canvis.",
        "blockedtitle": "L'usuari està blocat",
        "post-expand-template-argument-warning": "Avís: Aquesta pàgina conté com a mínim un argument de plantilla que té una mida d'expansió massa gran.\nSe n'han omès els arguments.",
        "post-expand-template-argument-category": "Pàgines que contenen arguments de plantilla que s'han omès",
        "parser-template-loop-warning": "S'ha detectat un bucle de plantilla: [[$1]]",
+       "template-loop-category": "Pàgines amb bucles de plantilla",
        "parser-template-recursion-depth-warning": "S'ha excedit el límit de recursivitat de plantilles ($1)",
        "language-converter-depth-warning": "S'ha excedit el límit de profunditat del convertidor d'idiomes ($1)",
        "node-count-exceeded-category": "Pàgines on s'ha excedit el recompte de nodes",
        "page_first": "primera",
        "page_last": "última",
        "histlegend": "Simbologia: (act) = diferència amb la versió actual,\n(prev) = diferència amb la versió anterior, m = modificació menor",
-       "history-fieldset-title": "Cerca a l'historial",
-       "history-show-deleted": "Només esborrats",
+       "history-fieldset-title": "Cerca revisions",
+       "history-show-deleted": "Només revisions esborrades",
        "histfirst": "més antigues",
        "histlast": "més noves",
        "historysize": "({{PLURAL:$1|1 octet|$1 octets}})",
        "prefs-help-prefershttps": "Aquesta preferència tindrà efecte quan inicieu una nova sessió.",
        "prefswarning-warning": "Heu fet canvis a les preferències que encara no s'han desat.\nSi abandoneu la pàgina sense fer clic a «$1», les preferències no s'actualitzaran.",
        "prefs-tabs-navigation-hint": "Consell: Podeu utilitzar les tecles de cursor de dreta i esquerra per a navegar entre les pestanyes.",
-       "userrights": "Gestió dels permisos d’usuari",
+       "userrights": "Permisos d'usuari",
        "userrights-lookup-user": "Seleccioneu un usuari",
        "userrights-user-editname": "Introduïu un nom d'usuari:",
        "editusergroup": "Carrega els grups d'usuari",
        "userrights-groupsmember": "Membre de:",
        "userrights-groupsmember-auto": "Membre implícit de:",
        "userrights-groupsmember-type": "$1",
-       "userrights-groups-help": "Podeu modificar els grups als quals pertany {{GENDER:$1|aquest usuari|aquesta usuària}}.\n* Una casella marcada significa que {{GENDER:$1|l’usuari|la usuària}} pertany a aquest grup.\n* Una casella no marcada significa que {{GENDER:$1|l’usuari|la usuària}} no pertany a aquest grup.\n* Un asterisc (*) indica que no {{GENDER:$1|el|la}} podreu treure del grup una vegada l'hàgiu afegit o viceversa.",
+       "userrights-groups-help": "Podeu modificar els grups als quals pertany {{GENDER:$1|aquest usuari|aquesta usuària}}.\n* Una casella marcada significa que {{GENDER:$1|l’usuari|la usuària}} pertany a aquest grup.\n* Una casella no marcada significa que {{GENDER:$1|l’usuari|la usuària}} no pertany a aquest grup.\n* Un asterisc (*) indica que no {{GENDER:$1|el|la}} podreu treure del grup una vegada l'hàgiu afegit o viceversa.\n* Un coixinet (#) indica que només podeu retardar la data d'expiració d'aquest grup i que no la podeu avançar.",
        "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-expiry-existing": "Temps de venciment actual: $3, $2",
        "userrights-expiry-othertime": "Altre temps:",
        "userrights-expiry-options": "1 dia:1 day,1 setmana:1 week,1 mes:1 month,3 mesos:3 months,6 mesos:6 months,1 any:1 year",
+       "userrights-invalid-expiry": "La data d'expiració per al grup «$1» no és vàlida.",
        "userrights-conflict": "Conflicte de canvis dels permisos d'usuari. Reviseu i confirmeu els canvis.",
        "group": "Grup:",
        "group-user": "Usuaris",
        "rcfilters-invalid-filter": "Filtre no vàlid",
        "rcfilters-empty-filter": "No hi ha cap filtre actiu. Es mostren totes les contribucions.",
        "rcfilters-filterlist-title": "Filtres",
+       "rcfilters-filterlist-whatsthis": "Què és això?",
        "rcfilters-highlightbutton-title": "Ressalta els resultats",
        "rcfilters-highlightmenu-title": "Selecciona un color",
+       "rcfilters-highlightmenu-help": "Seleccioneu un color per ressaltar la propietat",
        "rcfilters-filterlist-noresults": "No s'ha trobat cap filtre",
+       "rcfilters-noresults-conflict": "No s'ha trobat cap resultat perquè els criteris de cerca són en conflicte",
+       "rcfilters-state-message-fullcoverage": "Seleccionant tots els filtres en un grup és el mateix que no seleccionar-ne cap, de manera que aquest filtre no té cap efecte. El grup inclou: $1",
        "rcfilters-filtergroup-registration": "Registre d'usuari",
        "rcfilters-filter-registered-label": "Registrats",
        "rcfilters-filter-registered-description": "Editors que han iniciat sessió",
        "rcfilters-filter-bots-description": "Modificacions fetes per eines automatitzades.",
        "rcfilters-filter-humans-label": "Humà (no bot)",
        "rcfilters-filter-humans-description": "Modificacions fetes per editors humans.",
+       "rcfilters-filtergroup-reviewstatus": "Estat de revisió",
+       "rcfilters-filter-patrolled-label": "Patrullat",
+       "rcfilters-filter-patrolled-description": "Modificacions marcades com a patrullades.",
+       "rcfilters-filter-unpatrolled-label": "No patrullat",
+       "rcfilters-filter-unpatrolled-description": "Modificacions no marcades com a patrullades.",
        "rcfilters-filtergroup-significance": "Significació",
        "rcfilters-filter-minor-label": "Modificacions menors",
        "rcfilters-filter-minor-description": "Modificacions que l'autor va etiquetar com a menors.",
        "upload-too-many-redirects": "L'URL conté massa redireccions",
        "upload-http-error": "Ha ocorregut un error HTTP: $1",
        "upload-copy-upload-invalid-domain": "Les càrregues de còpia no són disponibles des d'aquest domini.",
+       "upload-foreign-cant-upload": "Aquest wiki no està configurat per pujar fitxers al repositori extern sol·licitat.",
        "upload-dialog-disabled": "La càrrega de fitxers utilitzant aquest quadre de diàleg està desactivada en aquest wiki.",
        "upload-dialog-title": "Carrega un fitxer",
        "upload-dialog-button-cancel": "Cancel·la",
        "unusedimages": "Fitxers no utilitzats",
        "wantedcategories": "Categories demanades",
        "wantedpages": "Pàgines demanades",
+       "wantedpages-summary": "Llista de pàgines no existents amb el major nombre d'enllaços cap a elles, excloent-ne les pàgines que només hi enllacen amb redireccions. Per a una llista de pàgines no existents que tenen redireccions que hi enllacen, vegeu la [[{{#special:BrokenRedirects}}|llista de redireccions trencades]].",
        "wantedpages-badtitle": "Títol invàlid al conjunt de resultats: $1",
        "wantedfiles": "Fitxers demanats",
        "wantedfiletext-cat": "Els fitxers següents s'utilitzen per no existeixen. Els fitxers de repositoris aliens poden ser llistats encara que existeixin. Aquells que siguin fals positius es <del>ratllaran</del>. A més, les pàgines que tinguin fitxers incrustats que no existeixin es llistaran a [[:$1]].",
        "editcomment": "El resum d'edició és: <em>$1</em>.",
        "revertpage": "Revertides les edicions de [[Special:Contributions/$2|$2]] ([[User talk:$2|discussió]]) a l'última versió de [[User:$1|$1]]",
        "revertpage-nouser": "Edicions revertides per un usuari ocult a l'última revisió de {{GENDER:$1|[[User:$1|$1]]}}",
-       "rollback-success": "Edicions revertides de $1; s'ha canviat a la darrera versió de $2.",
+       "rollback-success": "Revertides les edicions de {{GENDER:$3|$1}}; recuperant la darrera versió de {{GENDER:$4|$2}}.",
        "rollback-success-notify": "Modificacions revertides per $1;\ns'ha revertit a la darrera versió de $2. [$3 Mostra els canvis]",
        "sessionfailure-title": "Error de sessió",
        "sessionfailure": "S'ha produït un error amb la vostra sessió. S'ha anul·lat aquesta acció en prevenció de pirateig de sessió. Premeu «Torna», recarregueu la pàgina des d'on veniu i torneu-ho a intentar.",
        "undeleteviewlink": "veure",
        "undeleteinvert": "Invertir selecció",
        "undeletecomment": "Motiu:",
-       "undeletedrevisions": "{{PLURAL:$1|Una revisió restaurada|$1 revisions restaurades}}",
-       "undeletedrevisions-files": "{{PLURAL:$1|Una revisió|$1 revisions}} i {{PLURAL:$2|un fitxer|$2 fitxers}} restaurats",
-       "undeletedfiles": "$1 {{PLURAL:$1|fitxer restaurat|fitxers restaurats}}",
-       "cannotundelete": "Hi ha hagut un error en el procés de restauració:\n$1",
+       "cannotundelete": "Hi ha hagut un error en algunes o totes les restauracions:\n$1",
        "undeletedpage": "'''S'ha restaurat «$1»'''\n\nConsulteu el [[Special:Log/delete|registre d'esborraments]] per a veure els esborraments i els restauraments més recents.",
        "undelete-header": "Vegeu [[Special:Log/delete|el registre d'eliminació]] per a veure les pàgines eliminades recentment.",
        "undelete-search-title": "Cerca de pàgines esborrades",
        "proxyblockreason": "S'ha blocat la vostra adreça IP perquè és un proxy obert. Contactau el vostre proveïdor d'Internet o servei tècnic i informau-los d'aquest seriós problema de seguretat.",
        "sorbsreason": "La vostra adreça IP està llistada com a servidor intermediari (''proxy'') obert dins la llista negra de DNS que fa servir el projecte {{SITENAME}}.",
        "sorbs_create_account_reason": "La vostra adreça IP està llistada com a servidor intermediari (''proxy'') obert a la llista negra de DNS que utilitza el projecte {{SITENAME}}. No podeu crear-vos-hi un compte",
+       "softblockrangesreason": "Les aportacions anònimes no són admeses des de la vostra adreça IP ($1). Inicieu una sessió.",
        "xffblockreason": "Una adreça IP present en la capçalera X-Forwarded-For, sigui vostra o la d'un servidor proxy que esteu utilitzant, ha estat blocada. El motiu inicial del bloqueig és: $1",
        "cant-see-hidden-user": "L'usuari que esteu intentant blocar ja ha estat blocat i ocultat. Com que no teniu el permís hideuser no podeu veure ni modificar el seu blocatge.",
        "ipbblocked": "No podeu blocar o desblocar altres usuaris, perquè vós {{GENDER:|mateix|mateixa|mateix}} esteu {{GENDER:|blocat|blocada|blocat}}.",
        "pageinfo-article-id": "ID de la pàgina",
        "pageinfo-language": "Llengua del contingut de la pàgina",
        "pageinfo-language-change": "canvia",
-       "pageinfo-content-model": "Plantilla de contingut de pàgina",
+       "pageinfo-content-model": "Model de contingut de la pàgina",
        "pageinfo-content-model-change": "canvia",
        "pageinfo-robot-policy": "Indexació per robots",
        "pageinfo-robot-index": "Permès",
        "newimages-summary": "Aquesta pàgina especial mostra els darrers fitxers carregats.",
        "newimages-legend": "Nom del fitxer",
        "newimages-label": "Nom de fitxer (o part d'ell):",
+       "newimages-user": "Adreça IP o nom d'usuari",
        "newimages-showbots": "Mostra les càrregues dels bots",
        "newimages-hidepatrolled": "Amaga les càrregues patrullades",
        "noimages": "Res per veure.",
        "invalidateemail": "Cancel·lació d'adreça electrònica",
        "notificationemail_subject_changed": "L'adreça registrada de {{SITENAME}} ha canviat",
        "notificationemail_subject_removed": "L'adreça registrada de {{SITENAME}} ha estat suprimida",
+       "notificationemail_body_changed": "Algú des de l'adreça IP $1, probablement vós, ha canviat l'adreça de correu electrònic del compte a {{SITENAME}} de «$2» a «$3».\n\nSi no heu estat vós mateix, contacteu immediatament amb un administrador del lloc.",
+       "notificationemail_body_removed": "Algú des de l'adreça IP $1, probablement vós, ha eliminat l'adreça de correu electrònic «$2» del compte a {{SITENAME}}.\n\nSi no heu estat vós mateix, contacteu immediatament amb un administrador del lloc.",
        "scarytranscludedisabled": "[S'ha inhabilitat la transclusió interwiki]",
        "scarytranscludefailed": "[Ha fallat la recuperació de la plantilla per a $1]",
        "scarytranscludefailed-httpstatus": "[Ha fallat la recuperació de la plantilla per a $1: HTTP $2]",
        "scarytranscludetoolong": "[L'URL és massa llarg]",
        "deletedwhileediting": "'''Avís''': S'ha eliminat aquesta pàgina després que haguéssiu començat a modificar-la!",
-       "confirmrecreate": "L'usuari [[User:$1|$1]] ([[User talk:$1|discussió]]) va eliminar aquesta pàgina que havíeu creat donant-ne el següent motiu:\n: ''$2''\nConfirmeu que realment voleu tornar-la a crear.",
-       "confirmrecreate-noreason": "L'{{GENDER:$1|usuari|usuària}} [[User:$1|$1]] ([[User talk:$1|discussió]]) va esborrar aquesta pàgina després que la comencéssiu a modificar. Si us plau, confirmeu que realment voleu tornar-la a crear.",
+       "confirmrecreate": "{{GENDER:$1|L'usuari|La usuària}} [[User:$1|$1]] ([[User talk:$1|discussió]]) va eliminar aquesta pàgina que havíeu creat donant-ne el següent motiu:\n: <em>$2</em>\nConfirmeu que realment voleu tornar-la a crear.",
+       "confirmrecreate-noreason": "{{GENDER:$1|L'usuari|La usuària}} [[User:$1|$1]] ([[User talk:$1|discussió]]) va esborrar aquesta pàgina després que la comencéssiu a modificar. Confirmeu que realment voleu tornar-la a crear.",
        "recreate": "Torna a crear",
        "confirm_purge_button": "D'acord",
        "confirm-purge-top": "Voleu buidar la memòria cau d'aquesta pàgina?",
        "timezone-local": "Local",
        "duplicate-defaultsort": "Atenció: La clau d'ordenació per defecte \"$2\" invalida l'anterior clau \"$1\".",
        "duplicate-displaytitle": "<strong>Avís:</strong> El títol a mostrar «$2» sobreescriu l'anterior títol a mostrar «$1».",
+       "restricted-displaytitle": "<strong>Avís:</strong> El títol a mostrar «$1» ha estat ignorat ja que no és equivalent al títol real de la pàgina.",
        "invalid-indicator-name": "<strong>Error:</strong> No pot estar buit l'atribut <code>name</code> dels indicadors d'estat de la pàgina.",
        "version": "Versió",
        "version-extensions": "Extensions instal·lades",
        "version-libraries-license": "Llicència",
        "version-libraries-description": "Descripció",
        "version-libraries-authors": "Autors",
-       "redirect": "Redirigeix per fitxer, usuari, pàgina o ID de la revisió",
-       "redirect-summary": "Aquesta pàgina especial redirigeix a un fitxer (donat el nom del fitxer), una pàgina (donats un ID de la revisió o un ID de pàgina), o a una pàgina d'usuari (donat un ID numèric d'usuari). Ús: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], or [[{{#Special:Redirect}}/user/101]].",
+       "redirect": "Redirigeix per identificador de fitxer, usuari, pàgina, revisió o registre",
+       "redirect-summary": "Aquesta pàgina especial redirigeix a un fitxer (donat el nom del fitxer), a una pàgina (donats un ID de la revisió o un ID de pàgina), a una pàgina d'usuari (donat un ID numèric d'usuari) o a una entrada de registre (donat l'ID de registre). Ús: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], [[{{#Special:Redirect}}/user/101]] o [[{{#Special:Redirect}}/logid/186]].",
        "redirect-submit": "Vés-hi",
        "redirect-lookup": "Consulta:",
        "redirect-value": "Valor:",
        "tags-delete-not-allowed": "Les etiquetes definides per una extensió no es poden esborrar tret que l'extensió ho permeti específicament.",
        "tags-delete-not-found": "L'etiqueta «$1» no existeix.",
        "tags-delete-too-many-uses": "L'etiqueta «$1» s'aplica a més {{PLURAL:$2|d'$2 revisió|de $2 revisions}} i, per tant, no pot eliminar-se.",
-       "tags-delete-warnings-after-delete": "L'etiqueta \"$1\" ha estat esborrada satisfactòriament, però {{PLURAL:$2|s'ha registrat l'advertència següent|s'han registrat les advertències següents}}:",
+       "tags-delete-warnings-after-delete": "L'etiqueta «$1» ha estat esborrada, però {{PLURAL:$2|s'ha registrat l'advertència següent|s'han registrat les advertències següents}}:",
        "tags-delete-no-permission": "No teniu permisos per a eliminar les etiquetes de canvis.",
        "tags-activate-title": "Activa l'etiqueta",
        "tags-activate-question": "Esteu a punt d'activar l'etiqueta «$1».",
        "logentry-protect-protect-cascade": "$1 {{GENDER:$2|ha protegit}} $3 $4 [en cascada]",
        "logentry-protect-modify": "$1 {{GENDER:$2|ha canviat}} el nivell de protecció de $3 $4",
        "logentry-protect-modify-cascade": "$1 {{GENDER:$2|ha canviat}} el nivell de protecció de $3 $4 [en cascada]",
-       "logentry-rights-rights": "$1 {{GENDER:$2|ha canviat}} la pertinença de grup per $3 de $4 a $5",
+       "logentry-rights-rights": "$1 {{GENDER:$2|ha canviat}} la pertinença de grup per {{GENDER:$6|$3}} de $4 a $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|ha canviat}} la pertinença de grup per $3",
        "logentry-rights-autopromote": "$1 ha estat {{GENDER:$2|promogut}} automàticament de $4 a $5",
        "logentry-upload-upload": "$1 {{GENDER:$2|ha carregat}} $3",
        "api-error-emptypage": "No es permet la creació de pàgines noves en blanc.",
        "api-error-publishfailed": "Error intern: el servidor no ha pogut publicar el fitxer temporal.",
        "api-error-stashfailed": "Error intern: el servidor no ha pogut emmagatzemar fitxers temporals.",
-       "api-error-unknown-warning": "Avís desconegut: $1",
+       "api-error-unknown-warning": "Avís desconegut: «$1».",
        "api-error-unknownerror": "Error desconegut: «$1».",
        "duration-seconds": "$1 {{PLURAL:$1|segon|segons}}",
        "duration-minutes": "$1 {{PLURAL:$1|minut|minuts}}",
        "log-name-pagelang": "Registre de canvi de llengua",
        "log-description-pagelang": "Aquest és un registre dels canvis en les llengües de les pàgines.",
        "logentry-pagelang-pagelang": "$1 {{GENDER:$2|ha canviat}} la llengua de $3 de $4 a $5",
-       "default-skin-not-found": "Òndia! L'aparença per defecte per al wiki, definit en <code dir=\"ltr\">$wgDefaultSkin</code> com <code>$1</code>, no està disponible.\n\nLa vostra instal·lació sembla que inclou les següents aparences. Consulteu [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Configuració d'aparences] per a la informació de com habilitar-les i triar-ne el valor per defecte.\n\n$2\n\n; Si heu acabat d'instal·lar MediaWiki:\n: Probablement l'instal·làveu des de git, o directament des del codi font utilitzant algun altre mètode. Això és l'esperat. Intenteu instal·lar algunes aparences des del [https://www.mediawiki.org/wiki/Category:All_skins directori d'aparences de mediawiki.org], per:\n: * Descarregar l'[https://www.mediawiki.org/wiki/Download instal·lador tarball], que ve amb diverses aparences i ampliacions. Podeu copiar i enganxar el directori <code>skins/</code> des d'aquí.\n: * Clonar un dels repositoris <code>mediawiki/skins/*</code> a través de git en el directori <code dir=\"ltr\">skins/</code> de la vostra instal·lació de MediaWiki.\n: Fent això no s'hauria d'interferir amb el vostre dipòsit git si sou un desenvolupador de MediaWiki.\n\n; Si només heu actualitzat MediaWiki:\n: Per MediaWiki 1.24 i posteriors ja no permet aparences instal·lades automàticament (consulteu [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: Aparences autodiscovery]). Podeu enganxar les línies següents en <code>LocalSettings.php</code> per permetre totes les aparences instal·lades actualment:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Si només heu modificat <code>LocalSettings.php</code>:\n: Reviseu els noms de l'aparença per errors tipogràfics.",
-       "default-skin-not-found-no-skins": "Òndia! L'aparença per defecte pel vostre wiki, definida a <code>$wgDefaultSkin</code> com <code>$1</code>, no està disponible.\n\nNo teniu cap aparença instal·lada.\n\n\n; Si heu acabat d'instal·lar o actualitzar MediaWiki:\n: Probablement l'heu instal·lat des de git, o directament des del codi font utilitzant algun altre mètode. Això és l'esperat. Per MediaWiki 1.24 i posteriors ja no s'inclouen aparences en el repositori principal. Proveu d'instal·lar algunes aparences des del [https://www.mediawiki.org/wiki/Category:All_skins directori d'aparences de mediawiki.org] per:\n: * Descarregar l'[https://www.mediawiki.org/wiki/Download instal·lador ''tarball''], que ve amb diverses aparences i extensions. Podeu copiar i enganxar el directori <code>skins/</code> des d'aquí.\n: * Clonar un dels repositoris <code>mediawiki/skins/*</code> a través de git en el directori <code dir=\"ltr\">skins/</code> de la vostra instal·lació de MediaWiki.\n: Fent això no s'hauria d'interferir amb el vostre repositori de git si sou un desenvolupador de MediaWiki. Consulteu [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual:Skin configuration] per a més informació sobre com permetre aparences i triar-ne per defecte.",
+       "default-skin-not-found": "Vaja! L'aparença per defecte per al wiki, definit en <code dir=\"ltr\">$wgDefaultSkin</code> com <code>$1</code>, no està disponible.\n\nLa vostra instal·lació sembla que inclou {{PLURAL:$4|la següent aparença|les següents aparences}}. Consulteu [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Configuració d'aparences] per a la informació de com habilitar-{{PLURAL:$4|la|les i triar-ne una per defecte}}.\n\n$2\n\n; Si heu acabat d'instal·lar MediaWiki:\n: Probablement l'instal·làveu des de git, o directament des del codi font utilitzant algun altre mètode. Això és l'esperat. Intenteu instal·lar algunes aparences des del [https://www.mediawiki.org/wiki/Category:All_skins directori d'aparences de mediawiki.org], per:\n: * Descarregar l'[https://www.mediawiki.org/wiki/Download instal·lador tarball], que ve amb diverses aparences i ampliacions. Podeu copiar i enganxar el directori <code>skins/</code> des d'aquí.\n: * Descarregar tarballs de skin individuals de [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins Usar Git per a descarregar skins].\n: Fent això no s'hauria d'interferir amb el vostre dipòsit git si sou un desenvolupador de MediaWiki.\n\n; Si només heu actualitzat MediaWiki:\n: Per MediaWiki 1.24 i posteriors ja no permet aparences instal·lades automàticament (consulteu [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: Aparences autodiscovery]). Podeu enganxar {{PLURAL:$5|la línia següent|les línies següents}} en <code>LocalSettings.php</code> per permetre {{PLURAL:$5|l'aparença instal·lada|totes les aparences instal·lades}} actualment:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Si només heu modificat <code>LocalSettings.php</code>:\n: Assegureu-vos que no hi hagi errors tipogràfics en els noms de l'aparença.",
+       "default-skin-not-found-no-skins": "Vaja! L'aparença per defecte pel vostre wiki, definida a <code>$wgDefaultSkin</code> com <code>$1</code>, no està disponible.\n\nNo teniu cap aparença instal·lada.\n\n\n; Si heu acabat d'instal·lar o actualitzar MediaWiki:\n: Probablement l'heu instal·lat des de git, o directament des del codi font utilitzant algun altre mètode. Això és l'esperat. Per MediaWiki 1.24 i posteriors ja no s'inclouen aparences en el repositori principal. Proveu d'instal·lar algunes aparences des del [https://www.mediawiki.org/wiki/Category:All_skins directori d'aparences de mediawiki.org] per:\n: * Descarregar l'[https://www.mediawiki.org/wiki/Download instal·lador ''tarball''], que ve amb diverses aparences i extensions. Podeu copiar i enganxar el directori <code>skins/</code> des d'aquí.\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins Usar Git per a descarregar aparences].\n: Fent això no s'hauria d'interferir amb el vostre repositori de git si sou un desenvolupador de MediaWiki. Consulteu [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual:Skin configuration] per a més informació sobre com permetre aparences i triar-ne per defecte.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (habilitat)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 (<strong>inhabilitat</strong>)",
        "mediastatistics": "Estadístiques dels multimèdia",
        "mediastatistics-summary": "Les estadístiques sobre els tipus de fitxers pujats. Això només inclou la versió més recent d'un fitxer. S'exclouen les versions antigues o eliminades dels fitxers.",
        "mediastatistics-nbytes": "{{PLURAL:$1|$1 byte|$1 bytes}} ($2; $3%)",
+       "mediastatistics-allbytes": "Mida de fitxer total de tots els fitxers {{PLURAL:$1|$1 byte|$1 bytes}} ($2).",
        "mediastatistics-table-mimetype": "Tipus MIME",
        "mediastatistics-table-extensions": "Extensions possibles",
        "mediastatistics-table-count": "Nombre de fitxers",
        "log-action-filter-block-reblock": "Bloca la modificació",
        "log-action-filter-block-unblock": "Desbloca",
        "log-action-filter-contentmodel-change": "Canvi del model de contingut",
+       "log-action-filter-contentmodel-new": "Creació de pàgina amb un model de contingut no per defecte",
        "log-action-filter-delete-delete": "Supressió de pàgines",
        "log-action-filter-delete-delete_redir": "Sobreescriptura de la redirecció",
        "log-action-filter-delete-restore": "Restauració de pàgines",
        "log-action-filter-delete-event": "Registre de supressió",
        "log-action-filter-delete-revision": "Supressió de revisions",
+       "log-action-filter-import-interwiki": "Importació de Transwiki",
        "log-action-filter-import-upload": "Importació mitjançant càrrega d'XML",
        "log-action-filter-managetags-create": "Creació de l'etiqueta",
        "log-action-filter-managetags-delete": "Supressió de l'etiqueta",
        "log-action-filter-managetags-activate": "Activació de l'etiqueta",
        "log-action-filter-managetags-deactivate": "Desactivació d'etiquetes",
+       "log-action-filter-move-move": "Reanomena sense sobreescriure les redireccions",
+       "log-action-filter-move-move_redir": "Reanomena sobreescrivint les redireccions",
+       "log-action-filter-newusers-create": "Creació per usuari anònim",
        "log-action-filter-newusers-create2": "Creació per usuari registrat",
        "log-action-filter-newusers-autocreate": "Creació automàtica",
+       "log-action-filter-newusers-byemail": "Creació amb una contrasenya enviada per correu electrònic",
        "log-action-filter-patrol-patrol": "Patrullatge manual",
        "log-action-filter-patrol-autopatrol": "Patrullatge automàtic",
        "log-action-filter-protect-protect": "Protecció",
        "authmanager-create-from-login": "Per crear un compte, ompliu els camps.",
        "authmanager-authplugin-setpass-failed-title": "El canvi de contrasenya ha fallat",
        "authmanager-authplugin-setpass-bad-domain": "Domini invàlid.",
+       "authmanager-autocreate-noperm": "No es permet la creació automàtica de comptes.",
        "authmanager-userdoesnotexist": "El compte d'usuari «$1» no està registrat.",
        "authmanager-username-help": "Nom d'usuari per a l'autenticació.",
        "authmanager-password-help": "Contrasenya per a l'autenticació.",
        "authmanager-provider-temporarypassword": "Contrasenya temporal",
        "authprovider-confirmlink-request-label": "Comptes que caldrien enllaçar-se",
        "authprovider-confirmlink-success-line": "$1: s'ha enllaçat satisfactòriament.",
+       "authprovider-confirmlink-failed": "L'enllaçament de comptes no ha funcionat satisfactòriament: $1",
        "authprovider-resetpass-skip-label": "Omet",
        "authprovider-resetpass-skip-help": "Omet el restabliment de contrasenya.",
        "specialpage-securitylevel-not-allowed-title": "No permès",
index bc2b03a..3819e5b 100644 (file)
        "recentchanges-noresult": "Билгал йинчу хенахь цхьа хийцамаш бина бац.",
        "recentchanges-feed-description": "Тергам бе тӀаьххьара вики хийцаман хӀокху ларца.",
        "recentchanges-label-newpage": "Оцу нисдарца кхоьллина керла агӀо.",
-       "recentchanges-label-minor": "Ð¥Ó\80аÑ\80а Ð¿Ð°Ð¹Ð´Ð° боцу хийцам бу",
+       "recentchanges-label-minor": "Ð¥Ó\80аÑ\80а Ð»Ð°Ð´Ð°Ð¼ боцу хийцам бу",
        "recentchanges-label-bot": "ХӀара нисдар бото дина",
        "recentchanges-label-unpatrolled": "ХӀара нисдар хӀинца цхьано патрулировать дина дац",
        "recentchanges-label-plusminus": "байташкахь барам хийцар",
        "undeleteviewlink": "хьажа",
        "undeleteinvert": "Къастае массо",
        "undeletecomment": "Бахьана:",
-       "undeletedrevisions": "{{PLURAL:$1|меттахӀоьттина}} $1 {{PLURAL:$1|хийцам}}",
-       "undeletedrevisions-files": "меттахӀоьттина $1 {{PLURAL:$1|верси}} а, $2 {{PLURAL:$2|файл}} а",
-       "undeletedfiles": "$1 {{PLURAL:$1|файл меттахӀоттайина|файлаш меттахӀоттайина}}",
        "cannotundelete": "ГӀалат меттахӀоттайина:\n$1",
        "undeletedpage": "'''МеттахӀоттайина агӀо «$1».'''\n\nДӀадяхнарш долу могӀане [[Special:Log/delete|тéптаре хьажа]].",
        "undelete-header": "Дукху хан йоцуш дӀаяхна агӀонаш хьажа мега [[Special:Log/delete|дӀадаьхьнарш долу тептар чохь]].",
index 4806964..d99a3ad 100644 (file)
        "view-foreign": "Tan-awa sa $1",
        "edit": "Usba",
        "create": "Himoa",
+       "create-local": "Pagpuno og lokal nga deskripsyon",
        "editthispage": "Usba kining panid",
        "create-this-page": "Himoa kining panid",
        "delete": "Papasa",
        "newarticle": "(Bag-o)",
        "newarticletext": "Mitulpok ka sa sumpay ngadto sa usa ka wala pa masulat nga panid.\nAron mahimo ang maong panid, pagtayp sa kahon sa ubos (tan-awa ang [$1 panid sa tabang] alang sa dugang impormasyon).\nKon miabot ka dinhi pinaagi sa usa ka sayop, palihog tuploka ang back nga tuplokanan sa imong brawser.",
        "noarticletext": "Sa kasamtangan walay sulod nga teksto kining panid.\nPuyde nimong [[Special:Search/{{PAGENAME}}|pangitaon kining titulo sa panid]] sa ubang mga panid, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} pangitaa ang mga may kalabotan nga log],\no [{{fullurl:{{FULLPAGENAME}}|action=edit}} mugnaa kining panid]</span>.",
+       "noarticletext-nopermission": "Sa kasamtangan walay sulod nga teksto kining panid.\nPuyde nimong [[Special:Search/{{PAGENAME}}|pangitaon kining titulo sa panid]] sa ubang mga panid, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} pangitaa ang mga may kalabotan nga log]</span>, apan wala kay katungod nga mohimo ning maong panid.",
        "userpage-userdoesnotexist": "Ang akawnt sa tiggamit nga \"<nowiki>$1</nowiki>\" wala marehistro. Palihug tan-awa kon buot nimong himoon/usbon ang kining panid.",
        "previewnote": "'''Hinumdomi nga kini usa lang ka paunang tan-aw; wala pa matipigi ang imong giusab!'''",
        "editing": "Nagausab sa $1",
        "nextn-title": "Sunod nga $1 {{PLURAL:$1|resulta|mga resulta}}",
        "shown-title": "Pagpakita og $1 {{PLURAL:$1|ka resulta|ka mga resulta}} matag panid",
        "viewprevnext": "Tan-awa sa ($1 {{int:pipe-separator}} $2) ($3)",
+       "searchmenu-new": "<strong>Mugnaa ang panid nga \"[[:$1]]\" dinhi ning maong wiki!</strong> {{PLURAL:$2|0=|Tan-awa usab ang panid nga nakit-an sa imong pagpangita.|Tan-awa usab ang mga resulta sa pagpangita.}}",
        "searchprofile-articles": "Mga panid sa sulod",
        "searchprofile-images": "Multimedia",
        "searchprofile-everything": "Tanan",
        "enhancedrc-history": "kaagi",
        "recentchanges": "Mga bag-ong giusab",
        "recentchanges-legend": "Mga opsyon sa bag-ong pag-usab",
+       "recentchanges-summary": "Bantayi ang kinabag-ohang mga pag-usab sa wiki dinhi niining panid.",
        "recentchanges-feed-description": "Bantayi ang kinabag-ohang mga pag-usab sa wiki niining feed.",
        "recentchanges-label-newpage": "Kining pag-usab nagmugna og bag-ong panid",
        "recentchanges-label-minor": "Ginagmay nga pag-usab",
        "rcshowhideliu": "$1 ka mga gumagamit ang natala",
        "rcshowhideliu-hide": "Tagoa",
        "rcshowhideanons": "$1 mga wala mailhing gumagamit",
+       "rcshowhideanons-show": "Ipakita",
        "rcshowhideanons-hide": "Tagoa",
        "rcshowhidemine": "$1 akong mga pag-usab",
        "rcshowhidemine-hide": "Tagoa",
        "recentchangeslinked-to": "Ipakita na lang ang mga pag-usab sa mga panid nga nakasumpay sa nahatag nga panid",
        "upload": "Pagsumiter og payl",
        "uploadlogpage": "Log sa upload",
+       "filedesc": "Mubong sugid:",
        "license": "Paglilisensya:",
        "license-header": "Pagtugot",
        "file-anchor-link": "Payl",
        "exif-xresolution": "Resolusyon (pahigda)",
        "exif-yresolution": "Resolusyon (pabarog)",
        "exif-datetime": "Petsa ug oras sa pagkausab sa payl",
+       "exif-make": "Tighimo sa kamera",
+       "exif-model": "Model sa kamera",
+       "exif-software": "Programa nga gigamit",
+       "exif-exifversion": "Bersyon sa Exif",
        "exif-colorspace": "<i>Color space</i>",
+       "exif-datetimeoriginal": "Petsa ug oras sa pag-<i>generate</i> sa <i>data</i>",
+       "exif-datetimedigitized": "Petsa ug oras sa pag-<i>digitize</i>",
+       "exif-orientation-1": "Normal",
        "namespacesall": "tanan",
        "monthsall": "tanan",
        "watchlisttools-view": "Tan-awa ang may kalabotan nga mga pag-usab",
        "specialpages": "Espesyal nga mga panid",
        "tag-filter": "[[Special:Tags|Tag]] nga pilter:",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Tag|Mga tag}}]]: $2)",
+       "logentry-delete-delete": "Si $1 {{GENDER:$2|mipapas}} sa panid nga $3",
        "revdelete-restricted": "mga na-aplay nga restriksyon sa mga tagdumala",
        "revdelete-unrestricted": "gitangtang ang mga restriksyon alang sa mga tagdumala",
        "logentry-newusers-create": "Ang akawnt nga $1 {{GENDER:$2|namugna}}",
index 3933338..d1865db 100644 (file)
        "no-null-revision": "نەتوانرا پێداچوونەوەی خاڵیی بۆ پەڕەی \"$1\" درووست بکرێت",
        "badtitle": "سەرناوی خراپ",
        "badtitletext": "سەرناوی پەڕەی داواکراو بەتاڵە، واڵایە یان سەرناوێکی نێوان-زمانی یان نێوانی-ویکییە کە بە شێوەیەکی ھەڵە بەستەری بۆ دراوە.\nڕەنگە یەک یان چەند کاراکتەری تێدا بێت کە ناکرێت لە سەرناوەکاندا بەکار بھێنرێت.",
+       "title-invalid-empty": "ئەو پەڕەیەی داواکراوە بەتاڵە یان تەنھا لە بۆشایی-ناو پێکھاتووە.",
+       "title-invalid-talk-namespace": "ئەو ناوی پەڕەیەی داواکراوە ئاماژە بۆ پەڕەیەکی وتووێژ دەکات کە نابێت ھەبێت.",
+       "title-invalid-characters": "سەرناوی ئەو پەڕەیەی داواکراوە کارەکتەرێکی ھەڵەی تێدا بەکارھاتووە: «$1».",
        "perfcached": "داتای خوارەوە پاشەکەوتکراوەیە و لەوانەیە بەڕۆژنەکرابێتەوە. لانی زۆر {{PLURAL:$1|یەک ئەنجام|$1 ئەنجام}} لە cacheدا لەبەردەستدایە.",
        "perfcachedts": "داتای خوارەوە cacheکراوە و دوایین جار لە $1 نوێ کراوەتەوە. لە cacheدا لانی زۆر {{PLURAL:$4|یەک ئەنجام|$4 ئەنجام}} لەبەردەستە.",
        "querypage-no-updates": "تازەکردنەوەکان بۆ ئەم پەڕە لە حاڵی ئێستادا ناچالاک کراوەتەوە.\nداتای ئێرە دەسبەجێ تازە ناکرێتەوە.",
        "eauthentsent": "ئیمێلێکی پشتڕاستکردنەوە بۆ ناونیشانی ئیمێلی دیاریکراو نێررا.\nپێش ئەوەی ئیمەیلی تر بۆ ئەم ھەژمارە بنێررێت، دەبێت پەیڕەوی ڕێکارەکانی ناو ئیمێلەکە بکەیت بۆ پشتڕاستکردنەوەی ئەوەی کە ئەم هەژمارە بە ڕاستی ھی تۆیە.",
        "throttled-mailpassword": "ئیمەیلێکی ڕیکخستنەوەی تێپەڕوشە لە ماوەی {{PLURAL:$1|ساعەت}}ی ڕابردوودا نێردراوە.\nبۆ ڕێگری لە بەکارھێنانی خراپ، ھەر {{PLURAL:$1|ساعەت}} تاکە یەک ئیمەیلی ڕیکخستنەوەی تێپەڕوشە دەنێردرێت.",
        "mailerror": "هەڵە ڕوویدا لە ناردنی ئیمەیل: $1",
-       "acct_creation_throttle_hit": "بینەرانی ویکی بەکەڵک وەرگرتن لەم ئای‌پی ئەدرەسەی تۆ لە ڕۆژانی ڕابردوودا، دەستیان کردە بە درووست‌کردنی {{PLURAL:$1|هەژمارە}}، کە زۆرینە ڕیگەپێدان لە یەک ماوە‌دایە.\nوەک ئەنجامی ئەو ڕووداوە، ئەو بینەرانی لەم ئای‌پی ئەدرەسە کەڵک وەر دەگرن لەم کاتەدا ناتوانن هەژماری دیکە درووست‌بکەن.",
+       "acct_creation_throttle_hit": "بینەرانی ویکی بەکەڵک وەرگرتن لەم ناونیشانی ئای-پییەی تۆ لە ڕۆژانی ڕابردوودا، دەستیان کردە بە درووست‌کردنی {{PLURAL:$1|هەژمارە}}، کە زۆرینە ڕیگەپێدان لە یەک ماوە‌دایە.\nوەک ئەنجامی ئەو ڕووداوە، ئەو بینەرانی لەم ئای‌پی ئەدرەسە کەڵک وەر دەگرن لەم کاتەدا ناتوانن هەژماری دیکە درووست‌بکەن.",
        "emailauthenticated": "ناونیشانی ئیمەیلەکەت پشتڕاست کرایەوە لە $3ی $2دا.",
        "emailnotauthenticated": "ناونیشانی ئیمەیلەکەت ھێشتا پشتڕاست نەکراوتەوە.\nھیچ ئیمەیلێک بۆ ئەم تایبەتمەندییانەی ژێرەوە نانێردرێت.",
        "noemailprefs": "بۆ کەوتنە کاری ئەو تایبەتمەندیانە، لە هەڵبژاردەکانت ئەدرەسەکی ئی‌مێڵ دابین بکە.",
        "pt-createaccount": "ھەژمار دروست بکە",
        "pt-userlogout": "بچۆ دەرەوە",
        "user-mail-no-addy": "ھەوڵی ناردنی ئیمەڵ درا بەبێ ھەبوونی ناونیشانێکی ئیمەیڵ.",
+       "user-mail-no-body": "ھەوڵی ناردنی پۆستی ئەلیکترۆنی درا بە ناوەڕۆکێکی بەتاڵ یان زۆر کورت.",
        "changepassword": "تێپەڕوشە بگۆڕە",
        "resetpass_announce": "بۆ کۆتایی چوونە ژوورەوە، دەبێت تێپەڕوشەیەکی نوێ دابنێیت.",
        "resetpass_text": "<!-- تێپه‌ڕه‌وشه‌ی هه‌ژماره‌كه‌ سفر بكه‌ره‌وه‌ -->",
        "changepassword-throttled": "تۆ ھەوڵی زۆری چوونەژوورەوەت داوە. \nتکایە $1 چاوەڕوان بە پێش دووبارە ھەوڵدانەوە.",
        "botpasswords": "تێپەڕ وشەی بۆت",
        "botpasswords-disabled": "تێپەڕ وشەی بۆتەکان کوژێنرانەوە.",
+       "botpasswords-no-central-id": "بۆ بەکارھێنانی تێپەڕوشەی بۆت، دەبێت بە ھەژمارێکی جێگیر بچیتە ژوورەوە.",
+       "botpasswords-createnew": "تێپەڕوشەیەکی بۆتی نوێ دروست بکە",
+       "botpasswords-editexisting": "تێپەڕوشەیەک کە ھەیە دەستکاری بکە",
        "botpasswords-label-appid": "ناوی بۆت",
        "botpasswords-label-create": "دروستکردن",
        "botpasswords-label-update": "نوێکردنەوە",
        "botpasswords-label-delete": "سڕینەوە",
        "botpasswords-label-resetpassword": "ڕێکخستنەوەی تێپەڕوشە",
        "botpasswords-bad-appid": "ناوی بۆت «$1» دروست نییە.",
+       "botpasswords-insert-failed": "نەتواندرا ناوی بۆت «$1» زیاد بکرێت. ئایا پێشووتر زیاد کراوە؟",
+       "botpasswords-update-failed": "نەتواندرا ناوی بۆت «$1» نوێ بکرێتەوە. ئایا سڕدراوەتەوە؟",
        "botpasswords-created-title": "تێپەڕ وشەی بۆت دروست کرا",
+       "botpasswords-created-body": "تێپەڕوشەی بۆت بۆ بۆتی «$1» بەکارھێنەر «$2» دروست کرا.",
        "botpasswords-updated-title": "تێپەڕ وشەی بۆتەکە نوێ کرایەوە",
+       "botpasswords-updated-body": "تێپەڕ وشەی بۆت بۆ «$1»ی بەکارھێنەر «$2» نوێ کرایەوە.",
        "botpasswords-deleted-title": "تێپەڕ وشەی بۆت سڕدرایەوە",
        "resetpass_forbidden": "تێپەڕوشەکە ناگۆڕدرێت",
        "resetpass-no-info": "بۆ گەیشتنی راستەوخۆ بەم پەڕە ئەشێ بچیتە ژوورەوە.",
        "undo-summary": "گەڕاندنەوەی پێداچوونەوەی $1 لە لایەن [[Special:Contributions/$2|$2]] ([[User talk:$2|لێدوان]])",
        "undo-summary-username-hidden": "پوچەڵکردنەوەی دەستکاری $1 لەلایەن بەکارھێنەرێکی شاردراوەوە.",
        "cantcreateaccount-text": "درووست‌کردنی هەژمارە بۆ ناونیشانی ئای‌پی ('''$1''') لە لایەن [[User:$3|$3]] داخراوە.<br /><br />\n$3 هۆکاری \"$2\" خستوەتەڕوو",
+       "cantcreateaccount-range-text": "دروستکردنی ھەژمار لە مەودای ناونیشانی ئای-پی <strong>$1</strong>، کە ئای-پییەکەی تۆش لەخۆ دەگرێت (<strong>$4</strong>)، بەربەست کراوە لەلایەن [[User:$3|$3]]. \n\nھۆکاری بەربەستنکردنەکەی کە دراوە لەلایەن $3 ئەمەیە: <em>$2</em>",
        "viewpagelogs": "لۆگەکانی ئەم پەڕەیە ببینە",
        "nohistory": "هیچ مێژوویەکی دەستکاری نییە بۆ ئەم پەڕەیە.",
        "currentrev": "دوایین پێداچوونەوە",
        "search-interwiki-caption": "پرۆژە خوشکەکان",
        "search-interwiki-default": "ئاکام لە $1:",
        "search-interwiki-more": "(زیاتر)",
+       "search-interwiki-more-results": "ئەنجامی زیاتر",
        "search-relatedarticle": "پەیوەست",
        "searchrelated": "پەیوەست",
        "searchall": "ھەموو",
        "prefs-editing": "دەستکاریکردن",
        "searchresultshead": "گەڕان",
        "stub-threshold": "سنوور بۆ شێوازی <a href=\"#\" class=\"stub\">بەستەری کۆڵکە</a> (بایت):",
+       "stub-threshold-sample-link": "نموونە",
        "stub-threshold-disabled": "ناچالاک",
        "recentchangesdays": "ژمارە ڕۆژە نیشاندراوەکان لە دوایین گۆڕانکارییەکان:",
        "recentchangesdays-max": "(ئەوپەڕی $1 {{PLURAL:$1|ڕۆژە|ڕۆژە}})",
        "gender-unknown": "پێم خۆشە باسی نەکەم",
        "gender-male": "پیاو",
        "gender-female": "ژن",
-       "prefs-help-gender": "دڵخÙ\88از: Ø¨Û\86 Ø¨Ø§Ù\86Ú¯ Ú©Ø±Ø¯Ù\86Û\8c Ø¯Ø±Ù\88ست Ø¨Û\95 Ø¯Û\95ستÛ\8c Ù\86Û\95رÙ\85اÙ\85Û\8eر.\nئÛ\95Ù\85 Ø²Ø§Ù\86Û\8cارÛ\8cÛ\8cÛ\95 Ú¯Ø´ØªÛ\8c Ø¦Û\95بÛ\8e.",
+       "prefs-help-gender": "ئÛ\95Ù\85 Ú¾Û\95ڵبÚ\98اردÛ\95Û\8cÛ\95 Ø¯ÚµØ®Ù\88ازاÙ\86Û\95Û\8cÛ\95.\nبÛ\86 Ø¨Ø§Ù\86گکردÙ\86 Ù\88 Ø¦Ø§Ù\85اÚ\98Û\95Ù¾Û\8eکردÙ\86 Ø¨Û\95 Ø´Û\8eÙ\88Û\95Û\8cÛ\95Ú©Û\8c Ø¯Ø±Ù\88ست Ù\84Û\95Ù\84اÛ\8cÛ\95Ù\86 Ù\86Û\95رÙ\85اÙ\85Û\8eرÛ\95Ù\88Û\95 Ø¨Û\95کاردÛ\8eت.\nئÛ\95Ù\85 Ø²Ø§Ù\86Û\8cارÛ\8cÛ\8cÛ\95 Ú¯Ø´ØªÛ\8c Ø¯Û\95بÛ\8eت.",
        "email": "ئیمەیل",
        "prefs-help-realname": "ناوی ڕاستەقینە دڵخوازە.\nئەگەر بنووسرێت، لەوانەیە بۆ ئاماژەدان بەرھەمەکەت بە کار بھێنرێت.",
        "prefs-help-email": "دانانی ناونیشانی ئیمەیل دڵخوازانەیە، بەڵام ئەگەر تێپەڕوشەکەت لەیادکرد، بۆ نوێ‌کردنەوەی تێپەڕوشە پێویست دەبێت.",
        "prefs-tokenwatchlist": "نیشانە",
        "prefs-diffs": "جیاوازییەکان",
        "prefs-help-prefershttps": "بەکارخستنی ئەم تایبەتمەندییە کاریگەری لەسەر چوونەژوورەوەی داھاتووت دروست دەکات",
-       "userrights": "بەڕێوەبردنی مافەکانی بەکارھێنەر",
-       "userrights-lookup-user": "بەڕێوەبردنی گرووپەکانی بەکارھێنەر",
+       "prefswarning-warning": "تۆ گۆڕانکاریت ئەنجامداوە لە ھەڵبژاردەکانتدا کە ھێشتا پاشەکەوتت نەکردوون. ئەگەر ئەم پەڕەیە بەجێبێڵیت بەبێ کرتەکردن لەسەر «$1» ھەڵبژاردەکانت پاشەکەوت نابن و نوێ نابنەوە.",
+       "prefs-tabs-navigation-hint": "زانیاری: دەتوانیت تیری چەپ و ڕاست بەکاربھێنیت بۆ گەڕان بە ناو تابەکان لە پێڕستی تابەکاندا.",
+       "userrights": "مافەکانی بەکارھێنەر",
+       "userrights-lookup-user": "بەکارھێنەرێک ھەڵبژێرە",
        "userrights-user-editname": "ناوی بەکارهێنەرێک بنووسە:",
-       "editusergroup": "گرÙ\88Ù\88Ù¾Û\95کاÙ\86Û\8c Ø¨Û\95کارھÛ\8eÙ\86Û\95ر Ø¯Û\95ستکارÛ\8c Ø¨Ú©ە",
+       "editusergroup": "گرÙ\88Ù\88Ù¾Û\95کاÙ\86Û\8c Ø¨Û\95کارھÛ\8eÙ\86Û\95ر Ø¨Ø¨Û\8cÙ\86ە",
        "editinguser": "گۆڕینی مافە بەکارھێنەرییەکانی {{GENDER:$1|بەکارھێنەر}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "گرووپە بەکارھێنەرییەکان دەستکاری بکە",
+       "viewinguserrights": "تۆ مافەکانی بەکارھێنەر {{GENDER:$1|بەکارھێنەر}} <strong>[[User:$1|$1]]</strong> $2 دەبینیت",
+       "userrights-editusergroup": "گرووپەکانی {{{{GENDER:$1|بەکارھێنەر}} دەستکاری بکە",
        "userrights-viewusergroup": "بینینی گرووپەکانی {{GENDER:$1|بەکارھێنەر}}",
        "saveusergroups": "گرووپەکانی بەکارھێنەر پاشەکەوت بکە",
        "userrights-groupsmember": "ئەندامە لە:",
        "userrights-groupsmember-auto": "ئەندامی ناڕاشکاوە لە:",
-       "userrights-groups-help": "دەتوانی ئەو گرووپانەی ئەم بەکار‌هێنەرە تێیدایە ئاڵوگۆڕ بکەی:\n* چوارچێوەی نیشان‌کراو یانی بەکارھێنەر لەو گرووپەدا هەیە.\n* چوارچێوەی نیشان‌نەکراو یانی بەکارھێنەر لەو گرووپەدا نییە.\n* ئەستێرەیەک (*) نیشان دەدا ناتوانی ئەو گرووپەی جارێکی تر زیادت کردووە لای‌بەری، و بە پێچەوانە.",
+       "userrights-groups-help": "دەتوانی ئەو گرووپانەی ئەم بەکار‌هێنەرە تێیدایە ئاڵوگۆڕ بکەی:\n* چوارچێوەی نیشانکراو واتە بەکارھێنەر لەو گرووپەدا هەیە.\n* چوارچێوەی نیشاننەکراو واتە بەکارھێنەر لەو گرووپەدا نییە.\n* ئەستێرەیەک (*) نیشان دەدات ناتوانی ئەو گرووپەی جارێکی تر زیادت کردووە لایبەریت، و بە پێچەوانە.",
        "userrights-reason": "هۆکار:",
        "userrights-no-interwiki": "دەسەڵاتی گۆڕینی مافەکانی بەکارهێنەر لە ویکی‌یەکانی دیکەت نیە.",
        "userrights-nodatabase": "بنکەدراوی $1 بوونی نیە یا لەم شوێنە نیە.",
        "userrights-changeable-col": "ئەو گرووپانەی دەتوانی بیگۆڕی",
        "userrights-unchangeable-col": "ئەو گرووپانەی ناتوانی بیگۆڕی",
+       "userrights-expiry-current": "بەسەردەچێ لە $1",
+       "userrights-expiry-none": "بەسەرناچێت",
+       "userrights-expiry": "بەسەردەچێت:",
+       "userrights-expiry-othertime": "کاتی تر:",
+       "userrights-invalid-expiry": "کاتی بەسەرچوون بۆ گرووپی «$1» ھەڵەیە.",
+       "userrights-expiry-in-past": "کاتی بەسەرچوون بۆ گرووپی «$1» لە ڕابردوودایە.",
        "group": "گرووپ:",
        "group-user": "بەکارھێنەران",
        "group-autoconfirmed": "بەکارھێنەرە خۆبەخۆ پەسندکراوەکان",
        "right-override-export-depth": "هەناردنی لاپەڕەکان کە لاپەڕەکانی بەستەر پێ‌دراو تا قووڵایی 5 لەخۆ بگرێت",
        "right-sendemail": "ناردنی ئیمەیل بۆ بەکارھێنەرانی تر",
        "right-managechangetags": "دروستکردن و سڕینەوەی [[Special:Tags|تاگەکان]] لە بنکەدراوە",
+       "right-deletechangetags": "سڕینەوەی [[Special:Tags|tags]] لە بنکەی زانیاری",
+       "grant-group-file-interaction": "مامەڵەکردن لەگەڵ میدیا",
        "grant-group-email": "ناردنی ئیمەیل",
+       "grant-createaccount": "دروستکردنی ھەژمار",
+       "grant-createeditmovepage": "دروستکردن، دەستکاریکردن و گواستنەوەی پەڕەکان",
        "grant-sendemail": "ناردنی ئیمەیل بۆ بەکارھێنەرانی تر",
+       "grant-uploadfile": "بەڕگەی نوێ بار بکە",
+       "grant-basic": "مافی سەرەکی",
+       "grant-viewdeleted": "بینینی پەڕگە و پەڕە سڕدراوەکان",
+       "grant-viewmywatchlist": "دیتنی پێرستی چاودێریت",
        "newuserlogpage": "لۆگی دروستکردنی بەکارھێنەر",
        "newuserlogpagetext": "ئەمە لۆگێکی دروستکردنی بەکارھێنەرە.",
        "rightslog": "لۆگی مافەکانی بەکارھێنەر",
        "rightslogtext": "ئەمە لۆگی دەستکاری مافەکانی بەکار‌هێنەرە.",
        "action-read": "خوێندنەوەی ئەم پەڕەیە",
        "action-edit": "دەستکاریی ئەم پەڕەیە",
-       "action-createpage": "درÙ\88ستکردÙ\86Û\8c Ù¾Û\95Ú\95Û\95کاÙ\86",
-       "action-createtalk": "درÙ\88ستکردÙ\86Û\8c Ù¾Û\95Ú\95Û\95کاÙ\86Û\8c Ù\88تÙ\88Ù\88Û\8eÚ\98",
+       "action-createpage": "ئÛ\95Ù\85 Ù¾Û\95Ú\95Û\95Û\8cÛ\95 Ø¯Ø±Ù\88ست Ø¨Ú©Û\95",
+       "action-createtalk": "ئÛ\95Ù\85 Ù¾Û\95Ú\95Û\95Û\8c Ù\88تÙ\88Ù\88Û\8eÚ\98Û\95 Ø¯Ø±Ù\88ست Ø¨Ú©Û\95",
        "action-createaccount": "دروست کردنی ئەم ھەژماری بەکارھێنەرییە",
        "action-history": "بینینی مێژووی ئەم پەڕەیە",
        "action-minoredit": "نیشان‌کردنی ئەم دەستکاریە وەک بچووک",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ھەروەھا بڕوانە [[Special:NewPages|پێرستی پەڕە نوێکان]])",
        "recentchanges-legend-plusminus": "(''±۱٢٣'')",
        "recentchanges-submit": "نیشانی بدە",
+       "rcfilters-filterlist-whatsthis": "ئەمە چییە؟",
+       "rcfilters-highlightmenu-title": "ڕەنگێکی نوێ ھەڵبژێرە",
+       "rcfilters-filter-editsbyself-label": "مافەکانی خۆت",
+       "rcfilters-filter-editsbyself-description": "دەستکارییەکانی خۆت.",
+       "rcfilters-filter-editsbyother-label": "دەستکارییەکانی کەسانی تر",
+       "rcfilters-filter-user-experience-level-newcomer-label": "تازەکاران",
+       "rcfilters-filter-user-experience-level-newcomer-description": "کەمتر لە ١٠ دەستکاری و ٤ ڕۆژ لە چالاک بوون",
+       "rcfilters-filter-user-experience-level-experienced-label": "بەکارھێنەرانی پێشکەوتوو",
+       "rcfilters-filter-user-experience-level-experienced-description": "زیاتر لە ٣٠ ڕۆژ لە چالاکی و ٥٠٠ دەستکاری",
+       "rcfilters-filter-humans-label": "مرۆڤ (بۆت نییە)",
+       "rcfilters-filter-humans-description": "دەستکارییەکانی لەلایەن مرۆڤەکانەوە ئەنجام دراون",
+       "rcfilters-filter-patrolled-label": "پاسدراو",
+       "rcfilters-filter-patrolled-description": "ئەو دەستکارییانەی وەک پاسدراو دیاریکراون",
+       "rcfilters-filter-minor-label": "دەستکارییە بچووکەکان",
+       "rcfilters-filter-minor-description": "ئەو دەستکارییانەی کە دەستکاریکەر وەک بچووک ناوی بردووە",
+       "rcfilters-filter-major-label": "دەستکارییە نا-بچووکەکان",
        "rcnotefrom": "ژێرەوە {{PLURAL:$5|گۆڕانکارییەکەیە|گۆڕانکارییەکانە}} لە strong>$3، $4</strong>ەوە (ھەتا <strong>$1</strong> نیشان دراوە).",
        "rclistfrom": "گۆڕانکارییە نوێکان نیشان بدە بە دەستپێکردن لە $3 $2",
        "rcshowhideminor": "دەستکارییە بچووکەکان $1",
        "upload-too-many-redirects": "URL ڕەوانەکەری زۆری لەخۆ گرتووە",
        "upload-http-error": "هەڵەیەکی HTTP ڕووئ داوە: $1",
        "upload-dialog-button-cancel": "ھەڵوەشاندنەوە",
+       "upload-dialog-button-back": "گەڕانەوە",
+       "upload-dialog-button-done": "کرا",
+       "upload-dialog-button-save": "پاشەکەوتکردن",
        "upload-dialog-button-upload": "بارکردن",
+       "upload-form-label-infoform-title": "وردەکارییەکان",
+       "upload-form-label-infoform-name": "ناو",
+       "upload-form-label-infoform-description": "شیکردنەوە",
+       "upload-form-label-usage-title": "بەکارھێنان",
+       "upload-form-label-usage-filename": "ناوی پەڕگە",
        "upload-form-label-own-work": "ئەمە کاری خۆمە",
+       "upload-form-label-infoform-categories": "پۆلەكان",
+       "upload-form-label-infoform-date": "ڕێکەوت",
+       "upload-form-label-own-work-message-generic-local": "من دڵنیا دەکەمەوە کە ئەم پەڕگەیە باردەکەم بە گوێڕایەڵیکردنی مەرجەکانی بەکارھێنان و سیاسەتەکانی بەڵگەنامەکانی {{SITENAME}}.",
        "backend-fail-stream": "نەکرا پەڕگەی $1 بنێردرێت.",
        "backend-fail-notexists": "پەڕگەی $1 بوونی نییە.",
        "backend-fail-delete": "نەکرا پەڕگەی $1 بسڕدرێتەوە.",
index 3e1aa18..34ab28b 100644 (file)
        "externaldberror": "Сайткъа киргенде бир хата олды. Бу тыш эсабынъызны денъиштирмек акъкъынъыз олмагъанындан себеп мейдангъа келип ола.",
        "login": "Кириш",
        "nav-login-createaccount": "Кириш / Къайд олув",
-       "userlogin": "Кириш / Къайд олув",
-       "userloginnocreate": "Кириш",
        "logout": "Чыкъыш",
        "userlogout": "Чыкъыш",
        "notloggedin": "Системагъа кирмединъиз.",
        "userlogin-noaccount": "Аккаунтынъыз ёкъмы?",
        "userlogin-joinproject": "{{SITENAME}} лейхасына къошулынъыз",
-       "nologin": "Даа эсап ачмадынъызмы? '''$1'''.",
-       "nologinlink": "Къайд ол",
        "createaccount": "Къайд олув",
-       "gotaccount": "Даа эвель сайтта къайд олгъан эдинъизми? '''$1'''.",
-       "gotaccountlink": "Системагъа киринъиз",
-       "userlogin-resetlink": "Кириш малюматыны унуттынъызмы?",
        "createacct-emailrequired": "E-mail adresi",
        "createacct-emailoptional": "E-mail адреси (меджбурий дегиль)",
        "createacct-email-ph": "E-mail адресинъизни язынъыз",
        "createacct-another-email-ph": "E-mail адресинъизни язынъыз",
        "createaccountmail": "Автоматик оларакъ мейдангъа кетирильген мувакъкъат бир пароль къуллана билир ве бу парольни бильдирильген e-mail адресине ёллай билирсинъиз",
        "createacct-realname": "Акъикъий адынъыз (меджбурий дегиль)",
-       "createaccountreason": "Себеп:",
        "createacct-reason": "Себеп",
        "createacct-reason-ph": "Башкъа бир эсап язысы неден себеп яратасынъыз",
        "createacct-submit": "Эсап язынъызны яратынъыз",
        "watchthis": "Саифени козет",
        "savearticle": "Саифени сакъла",
        "savechanges": "Денъиштирмелерни сакъла",
+       "publishpage": "Саифени ярат",
+       "publishchanges": "Денъиштиргенлеримни сакъла",
        "preview": "Бакъып чыкъув",
        "showpreview": "Бакъып чыкъ",
        "showdiff": "Денъиштирмелерни косьтер",
        "undeletebtn": "Кери кетир!",
        "undeletelink": "косьтер/кери кетир",
        "undeletecomment": "Себеп:",
-       "undeletedrevisions": "Топлам {{PLURAL:$1|1=1 къайд|$1 къайд}} кери кетирильди.",
        "undelete-header": "Кеченлерде ёкъ этильген саифелерни корьмек ичюн [[Special:Log/delete|ёкъ этюв журналына]] бакъынъыз.",
        "undelete-search-submit": "Къыдыр",
        "namespace": "Исим фезасы:",
index 3054c1b..4b1400d 100644 (file)
        "externaldberror": "Saytqa kirgende bir hata oldı. Bu tış esabıñıznı deñiştirmek aqqıñız olmağanından sebep meydanğa kelip ola.",
        "login": "Kiriş",
        "nav-login-createaccount": "Kiriş / Qayd oluv",
-       "userlogin": "Kiriş / Qayd oluv",
-       "userloginnocreate": "Kiriş",
        "logout": "Çıqış",
        "userlogout": "Çıqış",
        "notloggedin": "Sistemağa kirmediñiz.",
        "userlogin-noaccount": "Akkauntıñız yoqmı?",
        "userlogin-joinproject": "{{SITENAME}} leyhasına qoşulıñız",
-       "nologin": "Daa esap açmadıñızmı? '''$1'''.",
-       "nologinlink": "Qayd ol",
        "createaccount": "Qayd oluv",
-       "gotaccount": "Daa evel saytta qayd olğan ediñizmi? '''$1'''.",
-       "gotaccountlink": "Sistemağa kiriñiz",
-       "userlogin-resetlink": "Kiriş malümatını unuttıñızmı?",
        "createacct-emailrequired": "E-mail adresi",
        "createacct-emailoptional": "E-mail adresi (mecburiy degil)",
        "createacct-email-ph": "E-mail adresiñizni yazıñız",
        "createacct-another-email-ph": "E-mail adresiñizni yazıñız",
        "createaccountmail": "Avtomatik olaraq meydanğa ketirilgen muvaqqat bir parol qullana bilir ve bu parolni bildirilgen e-mail adresine yollay bilirsiñiz",
        "createacct-realname": "Aqiqiy adıñız (mecburiy degil)",
-       "createaccountreason": "Sebep:",
        "createacct-reason": "Sebep",
        "createacct-reason-ph": "Başqa bir esap yazısı neden sebep yaratasıñız",
        "createacct-submit": "Esap yazıñıznı yaratıñız",
        "watchthis": "Saifeni közet",
        "savearticle": "Saifeni saqla",
        "savechanges": "Deñiştirmelerni saqla",
+       "publishpage": "Saifeni yarat",
+       "publishchanges": "Deñiştirgenlerimni saqla",
        "preview": "Baqıp çıquv",
        "showpreview": "Baqıp çıq",
        "showdiff": "Deñiştirmelerni köster",
        "undeletebtn": "Keri ketir!",
        "undeletelink": "köster/keri ketir",
        "undeletecomment": "Sebep:",
-       "undeletedrevisions": "Toplam {{PLURAL:$1|1 qayd|$1 qayd}} keri ketirildi.",
        "undelete-header": "Keçenlerde yoq etilgen saifelerni körmek içün [[Special:Log/delete|yoq etüv jurnalına]] baqıñız.",
        "undelete-search-submit": "Qıdır",
        "namespace": "İsim fezası:",
index 996161a..79e2bf7 100644 (file)
@@ -34,7 +34,8 @@
                        "Dvorapa",
                        "Walter Klosse",
                        "Martin Urbanec",
-                       "Marek Pavlica"
+                       "Marek Pavlica",
+                       "Asmen"
                ]
        },
        "tog-underline": "Podtrhávat odkazy:",
        "post-expand-template-argument-warning": "Varování: Tato stránka obsahuje alespoň jeden argument šablony, který je po rozbalení příliš velký.\nTyto argumenty byly vynechány.",
        "post-expand-template-argument-category": "Stránky obsahující vynechané argumenty šablon",
        "parser-template-loop-warning": "Nalezena smyčka šablon: [[$1]]",
+       "template-loop-category": "Stránky se smyčkami šablon",
+       "template-loop-category-desc": "Stránka obsahuje smyčku šablon, tj. šablonu, která je vložená sama do sebe.",
        "parser-template-recursion-depth-warning": "Překročen limit hloubky rekurzivního vkládání šablon ($1)",
        "language-converter-depth-warning": "Překročen limit vnoření u jazykové konverze ($1)",
        "node-count-exceeded-category": "Stránky překračující počet uzlů",
        "page_first": "první",
        "page_last": "poslední",
        "histlegend": "(teď) = rozdíly oproti nynější verzi, (předchozí) = rozdíly oproti předchozí verzi, <b>m</b> = malá editace",
-       "history-fieldset-title": "Procházení historie",
+       "history-fieldset-title": "Hledat revize",
        "history-show-deleted": "Pouze smazané",
        "histfirst": "nejstarší",
        "histlast": "nejnovější",
        "saveusergroups": "Uložit {{GENDER:$1|uživatelské}} skupiny",
        "userrights-groupsmember": "{{GENDER:$2|Člen|Členka}} {{PLURAL:$1|skupiny|skupin}}:",
        "userrights-groupsmember-auto": "Automaticky {{GENDER:$2|člen|členka}} {{PLURAL:$1|skupiny|skupin}}:",
-       "userrights-groups-help": "Můžete měnit skupiny, do nichž je {{GENDER:$1|uživatel zařazen|uživatelka zařazena}}.\n* Zaškrtnuté políčko znamená, že {{GENDER:$1|uživatel|uživatelka}} je v dané skupině.\n* Nezaškrtnuté políčko značí, že {{GENDER:$1|uživatel|uživatelka}} v dané skupině není.\n* Hvězdička (*) znamená, že nemůžete danou skupinu odstranit, jakmile ji přidáte, nebo naopak.\n* Křížek (#) znamená, že čas do vypršení dané skupiny můžete pouze prodloužit, ne zkrátit.",
+       "userrights-groups-help": "Můžete měnit skupiny, do nichž je {{GENDER:$1|uživatel zařazen|uživatelka zařazena}}.\n* Zaškrtnuté políčko znamená, že {{GENDER:$1|uživatel|uživatelka}} je v dané skupině.\n* Nezaškrtnuté políčko značí, že {{GENDER:$1|uživatel|uživatelka}} v dané skupině není.\n* Hvězdička (*) znamená, že nemůžete danou skupinu odstranit, jakmile ji přidáte, nebo naopak.\n* Křížek (#) znamená, že čas do vypršení členství v dané skupině můžete pouze prodloužit, ne zkrátit.",
        "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-expiry-options": "1 den:1 day,1 týden:1 week,1 měsíc:1 month,3 měsíce:3 months,6 měsíců:6 months,1 rok:1 rok",
        "userrights-invalid-expiry": "Čas vypršení pro skupinu „$1“ je neplatný.",
        "userrights-expiry-in-past": "Čas vypršení pro skupinu „$1“ je v minulosti.",
-       "userrights-cannot-shorten-expiry": "Čas do vypršení skupiny „$1“ nemůžete zkrátit. To mohou provést pouze uživatelé oprávnění k jejímu přiřazení nebo odstranění.",
+       "userrights-cannot-shorten-expiry": "Čas do vypršení členství ve skupině „$1“ nemůžete zkrátit. To mohou provést pouze uživatelé oprávnění k jejímu přiřazení nebo odstranění.",
        "userrights-conflict": "Konflikt změn uživatelských práv! Zkontrolujte a potvrďte požadované změny.",
        "group": "Skupina:",
        "group-user": "Uživatelé",
        "recentchanges-legend-plusminus": "(''±123'')",
        "recentchanges-submit": "Zobrazit",
        "rcfilters-activefilters": "Aktivní filtry",
+       "rcfilters-restore-default-filters": "Obnovit výchozí filtry",
+       "rcfilters-clear-all-filters": "Zrušit všechny filtry",
+       "rcfilters-search-placeholder": "Filtrovat nedávné změny (prohlížejte nebo začněte psát)",
+       "rcfilters-invalid-filter": "Neplatný filtr",
+       "rcfilters-empty-filter": "Žádné aktivní filtry. Zobrazeny jsou všechny příspěvky.",
+       "rcfilters-filterlist-title": "Filtry",
+       "rcfilters-filterlist-whatsthis": "Co to je?",
+       "rcfilters-filterlist-feedbacklink": "Poskytnout novým (beta) filtrům zpětnou vazbu",
+       "rcfilters-highlightbutton-title": "Zvýraznit výsledky",
+       "rcfilters-highlightmenu-title": "Vybrat barvu",
+       "rcfilters-highlightmenu-help": "Vyberte barvu pro zvýraznění této vlastnosti",
+       "rcfilters-filterlist-noresults": "Nenalezeny žádné filtry",
+       "rcfilters-noresults-conflict": "Nenalezeny žádné výsledky, protože vyhledávací kritéria jsou v konfliktu",
+       "rcfilters-state-message-subset": "Tento filtr nemá žádný vliv, protože jeho výsledky jsou již zahrnuty {{PLURAL:$2|následujícím, širším filtrem|následujícími, širšími filtry}} (pro odlišení zkuste zvýraznění): $1",
+       "rcfilters-state-message-fullcoverage": "Výběr všech filtrů ve skupině odpovídá výběru žádného, proto tento filtr nemá žádný vliv. Skupina zahrnuje: $1",
+       "rcfilters-filtergroup-registration": "Registrace uživatele",
+       "rcfilters-filter-registered-label": "Registrovaní",
+       "rcfilters-filter-registered-description": "Přihlášení editoři.",
+       "rcfilters-filter-unregistered-label": "Neregistrovaní",
+       "rcfilters-filter-unregistered-description": "Editoři, kteří nejsou přihlášení",
+       "rcfilters-filter-unregistered-conflicts-user-experience-level": "Tento filtr je v konfliktu s {{PLURAL:$2|následujícím filtrem|následujícími filtry}} podle zkušeností, {{PLURAL:$2|vyhledávajícím|vyhledávajícími}} pouze registrované uživatele: $1",
        "rcfilters-filtergroup-authorship": "Autorství editace",
+       "rcfilters-filter-editsbyself-label": "Vaše vlastní editace",
+       "rcfilters-filter-editsbyself-description": "Vaše editace.",
+       "rcfilters-filter-editsbyother-label": "Editace ostatních",
+       "rcfilters-filter-editsbyother-description": "Editace vytvořené ostatními uživateli (ne vámi).",
+       "rcfilters-filtergroup-userExpLevel": "Úrveň zkušeností (pouze registrovaných uživatelů)",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "Filtr podle zkušeností vyhledává pouze registrované uživatele, tento filtr je tedy v konfliktu s filtrem „Neregistrovaní“.",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "Filtr „Neregistrovaní“ je v konfliktu s jedním nebo více filtry podle zkušeností, vyhledávajícími pouze registrované uživatele. Dotyčné filtry jsou označeny nahoře, v prostoru „Aktivní filtry“.",
+       "rcfilters-filter-user-experience-level-newcomer-label": "Nováčci",
+       "rcfilters-filter-user-experience-level-newcomer-description": "Méně než 10 editací a 4 dny činnosti.",
+       "rcfilters-filter-user-experience-level-learner-label": "Začátečníci",
+       "rcfilters-filter-user-experience-level-learner-description": "Delší činnost a více editací než „Nováčci“, ale méně než „Zkušení uživatelé“.",
+       "rcfilters-filter-user-experience-level-experienced-label": "Zkušení uživatelé",
+       "rcfilters-filter-user-experience-level-experienced-description": "Více než 30 dní činnosti a 500 editací.",
+       "rcfilters-filtergroup-automated": "Automatizované příspěvky",
+       "rcfilters-filter-bots-label": "Robot",
+       "rcfilters-filter-bots-description": "Editace provedené pomocí automatizovaných nástrojů.",
+       "rcfilters-filter-humans-label": "Člověk (ne robot)",
+       "rcfilters-filter-humans-description": "Editace provedené lidmi.",
+       "rcfilters-filtergroup-reviewstatus": "Stav prověření",
+       "rcfilters-filter-patrolled-label": "Prověřené",
+       "rcfilters-filter-patrolled-description": "Editace označené jako prověřené.",
+       "rcfilters-filter-unpatrolled-label": "Neprověřené",
+       "rcfilters-filter-unpatrolled-description": "Editace označené jako neprověřené.",
+       "rcfilters-filtergroup-significance": "Důležitost",
+       "rcfilters-filter-minor-label": "Malé editace",
+       "rcfilters-filter-minor-description": "Editace, které autor označil jako malé.",
+       "rcfilters-filter-major-label": "Nemalé editace",
+       "rcfilters-filter-major-description": "Editace neoznačené jako malé.",
+       "rcfilters-filtergroup-changetype": "Typ změny",
+       "rcfilters-filter-pageedits-label": "Editace stránek",
+       "rcfilters-filter-pageedits-description": "Editace obsahu wiki, diskusí, popisů kategorií...",
+       "rcfilters-filter-newpages-label": "Založení stránek",
+       "rcfilters-filter-newpages-description": "Editace, které vytvářejí nové stránky.",
+       "rcfilters-filter-categorization-label": "Změny kategorií",
+       "rcfilters-filter-categorization-description": "Záznamy stránek zařazených do nebo vyřazených z kategorií.",
+       "rcfilters-filter-logactions-label": "Zaznamenané činnosti",
+       "rcfilters-filter-logactions-description": "Administrativní úkony, založení účtů, mazání stránek, načtení souborů...",
+       "rcfilters-hideminor-conflicts-typeofchange-global": "Filtr „Malé editace“ je v konfliktu s jedním nebo více filtry podle typu změny, protože určité typy změn nelze označit jako malé. Dotyčné filtry jsou označeny nahoře, v prostoru „Aktivní filtry.",
+       "rcfilters-hideminor-conflicts-typeofchange": "Určité typy změn nelze označit jako malé, tento filtr je proto v konfliktu s následujícími filtry podle typu změny: $1",
+       "rcfilters-typeofchange-conflicts-hideminor": "Tento filtr podle typu změny je v konfliktu s filtrem „Malé editace“. Určité typy změn nelze označit jako malé.",
        "rcnotefrom": "Níže {{PLURAL:$5|je změna|jsou změny}} od <strong>$3, $4</strong> ({{PLURAL:$1|zobrazena|zobrazeny|zobrazeno}} nejvýše <strong>$1</strong>).",
+       "rclistfromreset": "Obnovit výběr data",
        "rclistfrom": "Ukázat nové změny, počínaje od $2, $3",
        "rcshowhideminor": "$1 malé editace",
        "rcshowhideminor-show": "Zobrazit",
        "undeleteviewlink": "prohlédnout",
        "undeleteinvert": "Invertovat výběr",
        "undeletecomment": "Důvod:",
-       "undeletedrevisions": "{{PLURAL:$1|Obnovena jedna verze|Obnoveny $1 verze|Obnoveno $1 verzí}}",
-       "undeletedrevisions-files": "{{PLURAL:$1|Obnovena jedna verze|Obnoveny $1 verze|Obnoveno $1 verzí}} a {{PLURAL:$2|jeden soubor|$2 soubory|$2 souborů}}.",
-       "undeletedfiles": "{{PLURAL:$1|Obnoven jeden soubor|Obnoveny $1 soubory|Obnoveno $1 souborů}}",
        "cannotundelete": "Některá nebo všechna obnovení se nezdařila:\n$1",
        "undeletedpage": "<strong>Stránka „$1“ byla obnovena</strong>\n\nZáznam o posledních mazáních a obnoveních najdete v [[Special:Log/delete|knize smazaných stránek]].",
        "undelete-header": "Vizte nedávno smazané stránky v [[Special:Log/delete|knize smazaných stránek]].",
        "newimages-summary": "Na této speciální stránce se zobrazují poslední načtené soubory.",
        "newimages-legend": "Filtr",
        "newimages-label": "Název souboru (nebo jeho část):",
+       "newimages-user": "IP adresa nebo uživatelské jméno",
        "newimages-showbots": "Zobrazit soubory načtené roboty",
        "newimages-hidepatrolled": "Skrýt prověřená načtení souborů",
        "noimages": "Není co zobrazit.",
        "hebrew-calendar-m6": "adar",
        "hebrew-calendar-m6a": "adar I",
        "hebrew-calendar-m6b": "adar II",
-       "hebrew-calendar-m7": "nisan",
+       "hebrew-calendar-m7": "Nisan",
        "hebrew-calendar-m8": "ijar",
        "hebrew-calendar-m9": "sivan",
        "hebrew-calendar-m10": "tamuz",
        "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-restore": "$1 {{GENDER:$2|obnovil|obnovila}} stránku $3 ($4)",
+       "logentry-delete-restore-nocount": "$1 {{GENDER:$2|obnovil|obnovila}} stránku $3",
+       "restore-count-revisions": "{{PLURAL:$1|jedna revize|$1 revize|$1 revizí}}",
+       "restore-count-files": "{{PLURAL:$1|jeden soubor|$1 soubory|$1 souborů}}",
        "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",
        "logentry-delete-event-legacy": "$1 {{GENDER:$2|změnil|změnila}} viditelnost protokolovacích záznamů ke stránce $3",
        "restrictionsfield-label": "Povolené rozsahy IP adres:",
        "restrictionsfield-help": "Jedna IP adresa nebo CIDR rozsah na řádek. Všechno povolíte pomocí:<pre>0.0.0.0/0\n::/0</pre>",
        "revid": "revize $1",
-       "pageid": "Stránka s ID $1"
+       "pageid": "Stránka s ID $1",
+       "rawhtml-notallowed": "Značky &lt;html&gt; nelze používat mimo běžné stránky.",
+       "gotointerwiki": "Opustit {{GENDER:4sg|{{SITENAME}}}}",
+       "gotointerwiki-invalid": "Zadaný název byl neplatný.",
+       "gotointerwiki-external": "Chystáte se opustit {{GRAMMAR:4sg|{{SITENAME}}}} a navštívit [[$2]], což je jiná webová stránka.\n\n[$1 Kliknutím zde budete pokračovat na $1].",
+       "undelete-cantedit": "Tuto stránku nemůžete obnovit, protože ji nejste oprávněni editovat.",
+       "undelete-cantcreate": "Tuto stránku nemůžete obnovit, protože stránka s tímto názvem neexistuje a vy ji nejste oprávněni vytvořit."
 }
index daebbc1..2c9f789 100644 (file)
@@ -10,7 +10,8 @@
                        "לערי ריינהארט",
                        "아라",
                        "Kirsan",
-                       "Ankry"
+                       "Ankry",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Pòdsztrëchiwùjë lënczi:",
        "aboutsite": "Ò {{SITENAME}}",
        "aboutpage": "Project:Ò_{{SITENAME}}",
        "copyright": "Zamkłosc hewòtny starnë je ùprzëstãpnianô wedle reglów $1, jeżlë nie pòdóno jinaczi.",
-       "copyrightpage": "{{ns:project}}:Ùsôdzkòwé_prawa",
+       "copyrightpage": "{{ns:project}}:Ùsôdzkòwé prawa",
        "currentevents": "Aktualné wëdarzenia",
        "currentevents-url": "Project:Aktualné wëdarzenia",
        "disclaimers": "Prawné zastrzedżi",
        "yourdomainname": "Twòjô domena",
        "login": "Wlogùjë mie",
        "nav-login-createaccount": "Logòwanié",
-       "userlogin": "Logòwanié",
-       "userloginnocreate": "Wlogùjë mie",
        "logout": "Wëlogùj mie",
        "userlogout": "Wëlogòwanié",
        "notloggedin": "Felëje logòwóniô",
        "userlogin-noaccount": "Ni môsz kònta?",
-       "nologin": "Ni môsz kònta? '''$1'''.",
-       "nologinlink": "Ùsadzë kònto",
        "createaccount": "Założë nowé kònto",
-       "gotaccount": "Masz ju kònto? '''$1'''.",
-       "gotaccountlink": "Wlogùjë",
        "userlogin-resetpassword-link": "Zabôcził jes hasło?",
        "userlogin-helplink2": "Pòmòc przë logòwaniu",
        "createacct-emailoptional": "Adres e-mail (òptacëjno)",
        "createacct-email-ph": "Pòdôj swój adres e-mail.",
        "createaccountmail": "Ùżij timczasowégò hasła i wësli je na pòdóny adres e-mail.",
-       "createaccountreason": "Przëczëna:",
        "createacct-reason": "Przëczëna",
        "createacct-submit": "Ùsadzë kònto",
        "badretype": "Wprowadzone parole jinaczą sã midze sobą.",
        "revdelete-restricted": "nastôwi ògrańczenia dlô sprôwników",
        "revdelete-unrestricted": "rëmôj ògrańczenia dlô sprôwników",
        "logentry-protect-protect": "$1 {{GENDER:$2|zazychrowôł|zazychrowała}} $3 $4",
-       "revdelete-summary": "òpisënk zjinaczi",
        "pagelang-reason": "Przëczëna",
        "special-characters-group-ipa": "IPA",
        "special-characters-group-symbols": "Céchë",
index e1d254c..b74fbb1 100644 (file)
        "post-expand-template-argument-warning": "'''Warnung:''' Diese Seite enthält mindestens einen Parameter in einer Vorlage, der expandiert zu groß ist. Diese Parameter werden ignoriert.",
        "post-expand-template-argument-category": "Seiten mit ignorierten Vorlagenparametern",
        "parser-template-loop-warning": "Vorlagenschleife entdeckt: [[$1]]",
+       "template-loop-category": "Seiten mit Vorlagenschleifen",
+       "template-loop-category-desc": "Die Seite enthält eine Vorlagenschleife, z.&nbsp;B. eine Vorlage, die sich selbst rekursiv aufruft.",
        "parser-template-recursion-depth-warning": "Vorlagenrekursionstiefengrenze überschritten ($1)",
        "language-converter-depth-warning": "Sprachkonvertertiefenlimit überschritten ($1)",
        "node-count-exceeded-category": "Seiten, die die Knotenanzahl überschritten haben",
        "page_first": "Anfang",
        "page_last": "Ende",
        "histlegend": "Zur Anzeige der Änderungen einfach die zu vergleichenden Versionen auswählen und die Schaltfläche „{{int:compareselectedversions}}“ klicken.<br />\n* ({{int:cur}}) = Unterschied zur aktuellen Version, ({{int:last}}) = Unterschied zur vorherigen Version\n* Uhrzeit/Datum = Version zu dieser Zeit, Benutzername/IP-Adresse des Bearbeiters, {{int:minoreditletter}} = Kleine Änderung",
-       "history-fieldset-title": "In der Versionsgeschichte suchen",
+       "history-fieldset-title": "Nach Versionen suchen",
        "history-show-deleted": "Nur gelöschte Versionen zeigen",
        "histfirst": "älteste",
        "histlast": "neueste",
        "userrights-groupsmember": "Mitglied von:",
        "userrights-groupsmember-auto": "Automatisch Mitglied von:",
        "userrights-groupsmember-type": "$2",
-       "userrights-groups-help": "Du kannst die Gruppenzugehörigkeit {{GENDER:$1|dieses Benutzers|dieser Benutzerin}} ändern:\n* Ein markiertes Kästchen bedeutet, dass {{GENDER:$1|der Benutzer|die Benutzerin}} Mitglied dieser Gruppe ist.\n* Ein nicht markiertes Kästchen bedeutet, dass {{GENDER:$1|der Benutzer|die Benutzerin}} nicht Mitglied dieser Gruppe ist.\n* Ein * bedeutet, dass du das Benutzerrecht nach Erteilung nicht wieder zurücknehmen kannst (oder umgekehrt).\n* Ein # bedeutet, dass du den Zeitpunkt des Ablaufs dieser Gruppe nur nach hinten verschieben kannst. Du kannst ihn nicht vorverlegen.",
+       "userrights-groups-help": "Du kannst die Gruppenzugehörigkeit {{GENDER:$1|dieses Benutzers|dieser Benutzerin}} ändern:\n* Ein markiertes Kästchen bedeutet, dass {{GENDER:$1|der Benutzer|die Benutzerin}} Mitglied dieser Gruppe ist.\n* Ein nicht markiertes Kästchen bedeutet, dass {{GENDER:$1|der Benutzer|die Benutzerin}} nicht Mitglied dieser Gruppe ist.\n* Ein * bedeutet, dass du das Benutzerrecht nach Erteilung nicht wieder zurücknehmen kannst (oder umgekehrt).\n* Ein # bedeutet, dass du den Zeitpunkt des Ablaufs dieser Gruppenmitgliedschaft nur nach hinten verschieben kannst. Du kannst ihn nicht vorverlegen.",
        "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-expiry-options": "1 Tag:1 day,1 Woche:1 week,1 Monat:1 month,3 Monate:3 months,6 Monate:6 months,1 Jahr:1 year",
        "userrights-invalid-expiry": "Die Ablaufzeit für die Gruppe „$1“ ist ungültig.",
        "userrights-expiry-in-past": "Die Ablaufzeit für die Gruppe „$1“ liegt in der Vergangenheit.",
-       "userrights-cannot-shorten-expiry": "Du kannst den Ablauf der Gruppe „$1“ nicht vorverlegen. Nur Benutzer mit der Berechtigung, diese Gruppe hinzuzufügen und zu entfernen, können Ablaufzeiten vorverlegen.",
+       "userrights-cannot-shorten-expiry": "Du kannst den Ablauf der Mitgliedschaft in der Gruppe „$1“ nicht vorverlegen. Nur Benutzer mit der Berechtigung, diese Gruppe hinzuzufügen und zu entfernen, können Ablaufzeiten vorverlegen.",
        "userrights-conflict": "Benutzerrechteänderungskonflikt! Bitte überprüfe und bestätige deine Änderungen.",
        "group": "Gruppe:",
        "group-user": "Benutzer",
        "rcfilters-invalid-filter": "Ungültiger Filter",
        "rcfilters-empty-filter": "Keine aktiven Filter. Es werden alle Beiträge angezeigt.",
        "rcfilters-filterlist-title": "Filter",
+       "rcfilters-filterlist-whatsthis": "Was ist das?",
        "rcfilters-filterlist-feedbacklink": "Rückmeldung zu den neuen (Beta-)Filtern hinterlassen",
        "rcfilters-highlightbutton-title": "Ergebnisse hervorheben",
        "rcfilters-highlightmenu-title": "Eine Farbe auswählen",
        "rcfilters-highlightmenu-help": "Eine Farbe auswählen, um diese Eigenschaft hervorzuheben.",
        "rcfilters-filterlist-noresults": "Keine Filter gefunden",
+       "rcfilters-noresults-conflict": "Keine Ergebnisse gefunden, da sich die Suchkriterien in Konflikt befinden.",
+       "rcfilters-state-message-subset": "Dieser Filter hat keinen Effekt, da seine Ergebnisse mit denen {{PLURAL:$2|des folgenden breiteren Filters|der folgenden breiteren Filter}} einbezogen sind (versuche die Hervorhebung, um sie zu unterscheiden): $1",
+       "rcfilters-state-message-fullcoverage": "Das Auswählen aller Filter in einer Gruppe ist das Gleiche wie das Auswählen keines Filters. Deshalb hat dieser Filter keinen Effekt. Die Gruppe enthält: $1",
        "rcfilters-filtergroup-registration": "Benutzerregistrierung",
        "rcfilters-filter-registered-label": "Angemeldet",
        "rcfilters-filter-registered-description": "Angemeldete Autoren.",
        "rcfilters-filter-unregistered-label": "Unangemeldet",
        "rcfilters-filter-unregistered-description": "Autoren, die nicht angemeldet sind.",
-       "rcfilters-filter-unregistered-conflicts-user-experience-level": "Der Filter „Unangemeldet“ ist inaktiv, da sein Effekt durch {{PLURAL:$2|den|die}} folgenden Erfahrungsfilter aufgehoben wird, {{PLURAL:$2|der nur angemeldete Benutzer finden kann|die nur angemeldete Benutzer finden können}}: $1",
+       "rcfilters-filter-unregistered-conflicts-user-experience-level": "Dieser Filter befindet sich in Konflikt mit {{PLURAL:$2|dem folgenden Erfahrungsfilter, der nur angemeldete Benutzer finden kann|den folgenden Erfahrungsfiltern, die nur angemeldete Benutzer finden können}}: $1",
        "rcfilters-filtergroup-authorship": "Bearbeitungs-Autorenschaft",
        "rcfilters-filter-editsbyself-label": "Deine eigenen Bearbeitungen",
        "rcfilters-filter-editsbyself-description": "Bearbeitungen von dir.",
        "rcfilters-filter-editsbyother-label": "Bearbeitungen von anderen",
        "rcfilters-filter-editsbyother-description": "Bearbeitungen von anderen Benutzern (nicht von dir).",
        "rcfilters-filtergroup-userExpLevel": "Erfahrungsniveau (nur für angemeldete Benutzer)",
-       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "Dieser Filter ist inaktiv, da er nur angemeldete Benutzer findet, so dass der Filter „Unangemeldet“ seinen Effekt aufhebt.",
-       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "Der Filter „Unangemeldet“ befindet sich in Konflikt mit einem oder mehreren Erfahrungsfiltern. Erfahrungsfilter finden nur angemeldete Benutzer. Die kollidierenden Filter sind oben als inaktiv markiert.",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "Erfahrungsfilter finden nur angemeldete Benutzer. Deshalb befindet sich dieser Filter in Konflikt mit dem Filter „Unangemeldet“.",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "Der Filter „Unangemeldet“ befindet sich in Konflikt mit einem oder mehreren Erfahrungsfiltern, die nur angemeldete Benutzer finden können. Die kollidierenden Filter sind oben im Bereich der aktiven Filter markiert.",
        "rcfilters-filter-user-experience-level-newcomer-label": "Neulinge",
        "rcfilters-filter-user-experience-level-newcomer-description": "Weniger als 10 Bearbeitungen und eine Aktivität von weniger als 4 Tagen.",
        "rcfilters-filter-user-experience-level-learner-label": "Anfänger",
        "rcfilters-filter-categorization-description": "Einträge von Seiten, die zu Kategorien hinzugefügt oder aus ihnen entfernt wurden.",
        "rcfilters-filter-logactions-label": "Protokollierte Aktionen",
        "rcfilters-filter-logactions-description": "Administrative Aktionen, Benutzerkontenerstellungen, Seitenlöschungen, hochgeladene Dateien …",
+       "rcfilters-hideminor-conflicts-typeofchange-global": "Der Filter „Kleine Bearbeitungen“ kollidiert mit einem oder mehreren Änderungstypfiltern, da bestimmte Änderungstypen nicht als „klein“ festgelegt werden können. Die kollidierenden Filter sind oben im Bereich der aktiven Filter markiert.",
+       "rcfilters-hideminor-conflicts-typeofchange": "Bestimmte Änderungstypen können nicht als „klein“ festgelegt werden, so dass dieser Filter mit den folgenden Änderungstypfiltern kollidiert: $1",
+       "rcfilters-typeofchange-conflicts-hideminor": "Dieser Änderungstypfilter kollidiert mit dem Filter „Kleine Bearbeitungen“. Bestimmte Änderungstypen können nicht als „klein“ festgelegt werden.",
        "rcnotefrom": "Angezeigt {{PLURAL:$5|wird die Änderung|werden die Änderungen}} seit <strong>$3, $4</strong> (max. <strong>$1</strong> Einträge).",
+       "rclistfromreset": "Datumsauswahl zurücksetzen",
        "rclistfrom": "Nur Änderungen seit $3, $2 Uhr zeigen.",
        "rcshowhideminor": "Kleine Änderungen $1",
        "rcshowhideminor-show": "anzeigen",
        "php-uploaddisabledtext": "Das Hochladen von Dateien wurde in PHP deaktiviert.\nBitte überprüfe die <code>file_uploads</code>-Einstellung.",
        "uploadscripted": "Diese Datei enthält HTML- oder Scriptcode, der irrtümlich von einem Webbrowser ausgeführt werden könnte.",
        "upload-scripted-pi-callback": "Es kann keine Datei hochgeladen werden, die XML-Stylesheet-Verarbeitungsbefehle enthält.",
+       "upload-scripted-dtd": "Es können keine SVG-Dateien hochgeladen werden, die keine Standard-DTD-Deklaration enthalten.",
        "uploaded-script-svg": "Skriptelement „$1“ in der hochgeladenen SVG-Datei gefunden.",
        "uploaded-hostile-svg": "Unsicheres CSS im Styleelement der hochgeladenen SVG-Datei gefunden.",
        "uploaded-event-handler-on-svg": "Das Festlegen von Ereignis-Handler-Attributen <code>$1=\"$2\"</code> ist in SVG-Dateien nicht erlaubt.",
        "undeleteviewlink": "ansehen",
        "undeleteinvert": "Auswahl umkehren",
        "undeletecomment": "Grund:",
-       "undeletedrevisions": "{{PLURAL:$1|1 Version wurde|$1 Versionen wurden}} wiederhergestellt",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 Version|$1 Versionen}} und {{PLURAL:$2|1 Datei|$2 Dateien}} wurden wiederhergestellt",
-       "undeletedfiles": "{{PLURAL:$1|1 Datei wurde|$1 Dateien wurden}} wiederhergestellt",
        "cannotundelete": "Einige oder alle Wiederherstellungen sind fehlgeschlagen:\n$1",
        "undeletedpage": "'''„$1“''' wurde wiederhergestellt.\n\nIm [[Special:Log/delete|Lösch-Logbuch]] findest du eine Übersicht der gelöschten und wiederhergestellten Seiten.",
        "undelete-header": "Siehe das [[Special:Log/delete|Lösch-Logbuch]] für kürzlich gelöschte Seiten.",
        "unblocked-id": "Sperr-ID $1 wurde freigegeben",
        "unblocked-ip": "[[Special:Contributions/$1|$1]] wurde freigegeben.",
        "blocklist": "Gesperrte Benutzer",
+       "autoblocklist": "Automatische Sperren",
+       "autoblocklist-submit": "Suchen",
+       "autoblocklist-legend": "Automatische Sperren auflisten",
+       "autoblocklist-localblocks": "Lokale automatische {{PLURAL:$1|Sperre|Sperren}}",
+       "autoblocklist-empty": "Die Liste der automatischen Sperren ist leer.",
+       "autoblocklist-otherblocks": "Andere automatische {{PLURAL:$1|Sperre|Sperren}}",
        "ipblocklist": "Gesperrte Benutzer",
        "ipblocklist-legend": "Suche nach einem gesperrten Benutzer",
        "blocklist-userblocks": "Benutzersperren ausblenden",
        "newimages-summary": "Diese Spezialseite zeigt die zuletzt hochgeladenen Dateien an.",
        "newimages-legend": "Filter",
        "newimages-label": "Dateiname (oder ein Teil davon):",
+       "newimages-user": "IP-Adresse oder Benutzername",
        "newimages-showbots": "Von Bots hochgeladene Dateien anzeigen",
        "newimages-hidepatrolled": "Kontrollierte Dateien ausblenden",
        "noimages": "Keine Dateien gefunden.",
        "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-restore": "$1 {{GENDER:$2|stellte}} die Seite „$3“ wieder her ($4)",
+       "logentry-delete-restore-nocount": "$1 {{GENDER:$2|stellte}} die Seite „$3“ wieder her",
+       "restore-count-revisions": "{{PLURAL:$1|Eine Version|$1 Versionen}}",
+       "restore-count-files": "{{PLURAL:$1|Eine Datei|$1 Dateien}}",
        "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",
        "logentry-delete-event-legacy": "$1 {{GENDER:$2|änderte}} die Sichtbarkeit von Logbucheinträgen auf $3",
        "special-characters-group-thai": "Thailändisch",
        "special-characters-group-lao": "Laotisch",
        "special-characters-group-khmer": "Khmer",
+       "special-characters-group-canadianaboriginal": "Kanadische Silbenschrift",
        "special-characters-title-endash": "Halbgeviertstrich",
        "special-characters-title-emdash": "Geviertstrich",
        "special-characters-title-minus": "Minus",
        "restrictionsfield-label": "Erlaubte IP-Adressbereiche:",
        "restrictionsfield-help": "Eine IP-Adresse oder ein CIDR-Bereich pro Zeile. Um alles zu aktivieren, verwende:\n<pre>\n0.0.0.0/0\n::/0\n</pre>",
        "revid": "Version $1",
-       "pageid": "Seitenkennung $1"
+       "pageid": "Seitenkennung $1",
+       "rawhtml-notallowed": "&lt;html&gt;-Tags können nicht außerhalb von normalen Seiten verwendet werden.",
+       "gotointerwiki": "{{SITENAME}} verlassen",
+       "gotointerwiki-invalid": "Der angegebene Titel war ungültig.",
+       "gotointerwiki-external": "Du bist dabei, {{SITENAME}} zu verlassen, um [[$2]] zu besuchen, was eine externe Website ist.\n\n[$1 Hier klicken, um auf $1 fortzufahren].",
+       "undelete-cantedit": "Du kannst diese Seite nicht wiederherstellen, da du nicht berechtigt bist, diese Seite zu bearbeiten.",
+       "undelete-cantcreate": "Du kannst diese Seite nicht wiederherstellen, da es keine vorhandene Seite mit diesem Namen gibt und du nicht berechtigt bist, diese Seite zu erstellen."
 }
index 860822c..735f273 100644 (file)
        "january": "Çele",
        "february": "Sıbat",
        "march": "Adar",
-       "april": "Lisan",
+       "april": "Nisane",
        "may_long": "Gulan",
        "june": "Heziran",
        "july": "Temuz",
        "january-gen": "Çele",
        "february-gen": "Sıbat",
        "march-gen": "Adar",
-       "april-gen": "Lisan",
+       "april-gen": "Nisane",
        "may-gen": "Gulan",
        "june-gen": "Heziran",
        "july-gen": "Temuz",
        "january-date": "$1 Çele",
        "february-date": "$1 Sıbat",
        "march-date": "$1 Adar",
-       "april-date": "$1 Lisan",
+       "april-date": "$1 Nisane",
        "may-date": "$1 Gulan",
        "june-date": "$1 Heziran",
        "july-date": "$1 Temuze",
        "and": "&#32;u",
        "qbfind": "Bıvin",
        "qbbrowse": "Çım ra viyarne",
-       "qbedit": "Bıvurne",
+       "qbedit": "Bıvırne",
        "qbpageoptions": "Na perrer",
        "qbmyoptions": "Perrê mı",
        "faq": "PVP",
        "undelete_short": "{{PLURAL:$1|Yew vırnayışi|$1 Vırnayışan}} mestere",
        "viewdeleted_short": "{{PLURAL:$1|Jew vurnayış esternayi|$1 Vurnayışanê esternayan}} bımotne",
        "protect": "Bıstarnê",
-       "protect_change": "bıvurne",
+       "protect_change": "bıvırne",
        "protectthispage": "Ena perre şeveknê",
        "unprotect": "Starnayışi bıvurne",
        "unprotectthispage": "Şeveknayışê ena perre bıvırne",
        "newmessageslinkplural": "{{PLURAL:$1|yew mesaco newe|999=mesacê newey}}",
        "newmessagesdifflinkplural": "{{PLURAL:$1|vurnayışo peyên|999=vurnayışê peyêni}}",
        "youhavenewmessagesmulti": "$1 mesaco newe esto",
-       "editsection": "bıvurne",
+       "editsection": "bıvırne",
        "editold": "bıvurne",
        "viewsourceold": "çımey cı bıvinê",
-       "editlink": "bıvurne",
+       "editlink": "bıvırne",
        "viewsourcelink": "çımey bıvêne",
        "editsectionhint": "Leteyo ke bıvuriyo: $1",
        "toc": "Zerreki",
        "viewsource-title": "Cı geyrayışê $1'i bıvin",
        "actionthrottled": "Kerden peysnaya",
        "actionthrottledtext": "Riyê tedbirê anti-spami ra,  wextê do kılmek de şıma nê fealiyeti nêşkenê zaf zêde bıkerê, şıma ki no hedi viyarna ra.\nÇend deqey ra tepeya reyna bıcerrebnên.",
-       "protectedpagetext": "Na per qey nêvuriyayiş ho pawyeno ya zi kerdışe bini.",
-       "viewsourcetext": "To şikinay çımey na pele bıvêne u kopya kerê:{{MediaWiki Wesiqe malumat}}",
+       "protectedpagetext": "Ena perre vırnayış u kerdışanê binan rê şevekniyaya.",
+       "viewsourcetext": "Şıma şenê çımey ena perre bıvênê u kopya kerê {{MediaWiki Wesiqe malumat}}",
        "viewyourtext": "Na pela '''Vurnayışê ke kerdê''' re şıma şenê kopya kerê:",
        "protectedinterface": "Na pela qandê nusnerin destegê verri dana u kes xırabin nêqero deye kerda kılit.",
        "editinginterface": "'''İqaz:''' Şıma yew perra ke softwarei rê nuştey miyan-bestoği dana cı, aye vırnenê.\nVırnayışê ena perre do eno wiki sero asayışê miyan-bestoğê karberanê binan de bıaso.\n\nTadayışi (çarnayışi) rê , yardımê [https://translatewiki.net/wiki/Main_Page?setlang=diq translatewiki.net]i ra haydarê procêdoşkerdışi de vınderê.",
-       "cascadeprotected": "No pel de vurnayiş qedexe biyo, çunke şıma tuşa \"kademeyın\" aqtif kerdo u no {{PLURAL:$1|pele|pelo}} pawıteyo de xebıtyeno:\n$2",
+       "cascadeprotected": "Ena perre vırnayışan rê akerde niya, çunke a {{PLURAL:$1|perre|perranê}} bınênan de zi yew be yew ravêrdeya, gırweniyena:\n$2",
        "namespaceprotected": "No '''$1''' ca de icazetê şıma çino şıma pel rêz keri.",
-       "customcssprotected": "Mısadeyê şıma çıniyo ke na pela CSSi bıvurnên, çıke na pela xısusiye eyaranê karberan muhtewa kena.",
-       "customjsprotected": "Mısadeyê şıma çıniyo ke na pela Java Scripti bıvurnên, çıke na pela xısusiye eyaranê karberan muhtewa kena.",
+       "customcssprotected": "İzına şıma çıniya ke ena perra CSSi bıvırnên, çıke ena perra xısusiye eyaranê karberan gêna xo miyan.",
+       "customjsprotected": "İzına şıma çıniya ke ena perra Java Scripti bıvırnên, çıke ena perra xısusiye eyaranê karberan gêna xo miyan.",
        "mycustomcssprotected": "Desturê şıma çıniyo ke na pela CSSi bıvurnê.",
        "mycustomjsprotected": "Desturê şıma çıniyo ke na pela JavaScripti bıvurnê.",
        "myprivateinfoprotected": "Ğısusi malumatana ğo timar kerdışire icazeta şıma çıniya.",
        "userlogin-joinproject": "Cıkewe {{SITENAME}}",
        "createaccount": "Hesab vıraze",
        "userlogin-resetpassword-link": "Parola xo kerda xo vira?",
-       "userlogin-helplink2": "Heqa qeydbiyayışi de peşti bıgêrên",
+       "userlogin-helplink2": "Qeydbiyayışi sero peşti bıgêrên",
        "userlogin-loggedin": "Tı xora namey {{GENDER:$1|$1}} ra kewtê/kewtay cı.\nFormê cêrêni bıgureyne ke namey karberio bin ra cı kewê.",
        "userlogin-reauth": "Eger ke {{GENDER:$1|$1}} şımayê se xo araşt kerdışirê fına ronıştış akerê.",
        "userlogin-createanother": "Zewbi hesab vıraz",
        "watchthis": "Şıma bewnê ena perre",
        "savearticle": "Perre qeyd ke",
        "savechanges": "Vırnayışan qeyd kerê",
-       "publishpage": "Perer bıhesırne",
-       "publishchanges": "Vurnayışa vıla ke",
+       "publishpage": "Riperri bare ke",
+       "publishchanges": "Vırnayışan qeyd ke",
        "preview": "Verqayt",
        "showpreview": "Verasayışi bımocne",
        "showdiff": "Vurnayışan bımotne",
        "sectioneditnotsupported-text": "Destekê vurnayışiê qısımi ena pela vurnayışi de çıniyo.",
        "permissionserrors": "İdari xeta",
        "permissionserrorstext": "Qey {{PLURAL:$1|sebeb|sebebê}} cêrini ra icazetê şıma çıniyo:",
-       "permissionserrorstext-withaction": "{{PLURAL:$1|Sebeba|Sebeb da}} cêri ra icazetê $2 çıniyo:",
-       "recreate-moveddeleted-warn": "'''Hişyari: no pel o ke şıma vırazeni vere cû vırazyayo.'''\n\nDiqet bıkeri no vurnayişê şıma re gerek esto:",
+       "permissionserrorstext-withaction": "{{PLURAL:$1|Sebebê|Sebebê}} cêri ra icazetê $2y çıniyo:",
+       "recreate-moveddeleted-warn": "'''Hişyari: Şıma yew nuşteyo ke veri de esteriyao, ey vırazenê.'''\n\nHetê bınêni de qeydê esterıtışi u kırıştışi esto:",
        "moveddeleted-notice": "Ena pela esteriya ya.\nQeydé  esternayışi u wedarnayışi cér dé deya yo.",
        "log-fulllog": "Temamê rocaneyi bıvine",
        "edit-hook-aborted": "Vurnayiş vınderiya.\nYew sebeb beyan nibı.",
        "page_first": "verên",
        "page_last": "peyên",
        "histlegend": "Ferqê weçinayışi: Qutiya versiyonan qandé  têversanayış işaret ke u dest be ''enter''i ya zi gocega cêrêne rone.<br />\nCetwel: <strong>({{int:ferq}})</strong> = ferqê versiyonê peyêni, <strong>({{int:peyên}})</strong> = ferqê versiyonê verêni, <strong>{{int:q}}</strong> = vırnayışo werdiyo.",
-       "history-fieldset-title": "Çımberz verori",
+       "history-fieldset-title": "Çım ra viyarnayışan cı geyre",
        "history-show-deleted": "Tenya esterıtey",
        "histfirst": "Verênêr",
        "histlast": "Peyênêr",
        "rev-deleted-text-permission": "Çımraviyarnayışê ena pele '''esteriyo'''.\nBeno ke [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log] de teferruat esto.",
        "rev-suppressed-text-permission": "Çımraviyarnayışê ena pele '''degusneyayo'''.\nŞıma be idarekerina xo ra şenê ey bıvênê; beno ke [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} degusnayış] de teferruat esto.",
        "rev-deleted-text-unhide": "Çım ra viyarnayışê enê riperri <strong>esteriya</strong>.\nTeferruati [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} qeydê esterıtışi] yenê diyene.\nŞıma hewna şenê [$1 nê vırnayışi bıvênê], eke wazenê dewam kerê.",
-       "rev-suppressed-text-unhide": "Çımra viyarnayışê ena pele '''Degusneyayo'''.\nBeno ke [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} degustış] de teferruat esto.\nŞıma be idarekerina xo ra şenê hewna [$1 nê çımraviyarnayışi bıvênê], eke wazenê dewam kerê.",
+       "rev-suppressed-text-unhide": "Çım ra viyarnayışê ena perre <strong>dewesnaeyê</strong>.\nEtıya [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} dewesnayış] de teferruat esto.\nŞıma pê idarekerina xo hewna şenê [$1 nê çım ra viyarnayışi bıvênê], eke wazenê dewam kerê.",
        "rev-deleted-text-view": "Çım ra viyarnayışê enê riperri '''vındarnao'''.\nŞıma şenê bıvênê; teferruat nao naca [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} besternayış].",
        "rev-suppressed-text-view": "Çımraviyarnayışê ena pele '''degusneyayo'''.\nŞıma be idarekerina xo ra şenê ey bıvênê; beno ke [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} degusnayış] de teferruat esto.",
        "rev-deleted-no-diff": "Şıma nêşenê nê ferqi bıvênê, çıke çımraviyarnayışan ra  yew '''esteriyo'''.\nBeno ke [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log] de teferruat esto.",
        "rev-suppressed-no-diff": "Revizyon '''esteriyayo\"' aye ra ti nieşkeno ena diff bivine.",
-       "rev-deleted-unhide-diff": "Çımra viyarnayışanê na ferqi ra  yew '''besterneyayo'''.\nBeno ke [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} besternayış] dı teferruat esto.\nŞıma be idarekerina xo ra şenê hewna [$1 nê ferqi bıvênê], eke wazenê dewam kerê.",
+       "rev-deleted-unhide-diff": "Çım ra viyarnayışanê nê ferqi ra  yew '''esterdeo'''.\nEtıya [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} esterey] de teferruat esto.\nŞıma pê idarekerina xo hewna şenê [$1 nê ferqi bıvênê], eke wazenê dewam kerê.",
        "rev-suppressed-unhide-diff": "Nê Timarkerdışi ra yewi '''çap biyo'''.\n[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} rocaneyê vındertışi] de teferru'ati esti.\nEke şıma serkari u devam bıkeri [$1 no vurnayiş şıma eşkeni bıvini].",
        "rev-deleted-diff-view": "Jew timarkerdışê ena versiyon '''wedariyayo''.\nÎdarekarî şenê ena versiyon bivîne; belki tiya de [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} wedarnayişî] de teferruat esto.",
        "rev-suppressed-diff-view": "Jew timarkerdışê ena versiyon '''Ploxneyış'' biyo.\nÎdarekarî eşkeno ena dif bivîne; belki tiya de [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ploxnayış] de teferruat esto.",
        "notextmatches": "tekê (zewcê) nuştey pele çıniyê",
        "prevn": "{{PLURAL:$1|$1}} verên",
        "nextn": "{{PLURAL:$1|$1}} peyên",
-       "prev-page": "Pela verên",
+       "prev-page": "Perra verêne",
        "next-page": "Pela peyên",
        "prevn-title": "$1o verên  {{PLURAL:$1|netice|neticeyan}}",
        "nextn-title": "$1o ke yeno {{PLURAL:$1|netice|neticey}}",
        "action-mergehistory": "tarixê ena perre yew ke",
        "action-userrights": "heqqa karberanê hemî bivurne",
        "action-userrights-interwiki": "heqqa karberanê ke wikiyê binî de hemî bivurne",
-       "action-siteadmin": "database kilit bike ya zi a bike",
+       "action-siteadmin": "Databasei kılit ke ya zi a ke",
        "action-sendemail": "e-posta bırşe",
        "action-editmyoptions": "Tercihanê xo bıvurne",
        "action-editmywatchlist": "Lista xoya ewniyayışi bıvırnê",
        "recentchanges": "Vırnayışê peyêni",
        "recentchanges-legend": "Tercihê vırnayışanê peyênan",
        "recentchanges-summary": "Wiki sero vırnayışê peyêni asenê.",
-       "recentchanges-noresult": "Goreyê kriteranê kıfşkerdeyan ra qet yew vurnayış nêvêniya.",
+       "recentchanges-noresult": "Demê periyodi de vırnayış be enê kriteran çıniyo.",
        "recentchanges-feed-description": "Ena feed dı vurnayişanê tewr peniyan teqip bık.",
        "recentchanges-label-newpage": "Enê vırnayışi yew perra newiye vıraşta.",
        "recentchanges-label-minor": "No yew vırnayışo werdiyo",
        "double-redirect-fixer": "Fixerî redirek bike",
        "brokenredirects": "Serşıkıtışê xırabeyi",
        "brokenredirectstext": "Redireksiyonê ey ki pelanê hama çiniyeno ra link dano:",
-       "brokenredirects-edit": "bıvurne",
+       "brokenredirects-edit": "bıvırne",
        "brokenredirects-delete": "bestere",
        "withoutinterwiki": "Perrê ke zıwananê binan rê gıreyê cı çıni yo",
        "withoutinterwiki-summary": "Enê pelî ke versiyonê ziwanî binî ra link nidano.",
        "wantedtemplates": "Şablonê ke waziyenê",
        "mostlinked": "Pelî ke tewr zafî lînk bîy.",
        "mostlinkedcategories": "Kategoriyê ke tewr zehf meqaley tede estê",
-       "mostlinkedtemplates": "Pelê ke zêdêr gureniyenê",
+       "mostlinkedtemplates": "Perrê ke vêşêr gırweniyenê",
        "mostcategories": "Pelan ke tewr zaf kategorî estê.",
        "mostimages": "Dosyayan ke tewr zaf link estê.",
        "mostinterwikis": "Pelan ke tewr zaf interwiki biyê.",
        "changecontentmodel-title-label": "Sernameyê pele",
        "changecontentmodel-model-label": "Modelê zerrekiyo newe",
        "changecontentmodel-reason-label": "Sebeb:",
-       "changecontentmodel-submit": "Bıvurne",
+       "changecontentmodel-submit": "Bıvırne",
        "log-name-contentmodel": "Qeydê vurnayışanê modelê zerreki",
        "logentry-contentmodel-change-revertlink": "peyser biya",
        "logentry-contentmodel-change-revert": "peyser biya",
        "undeleteviewlink": "bıvin",
        "undeleteinvert": "Weçinayışi dimlaşt ke",
        "undeletecomment": "Sebeb:",
-       "undeletedrevisions": "pêro piya{{PLURAL:$1|1 qeyd|$1 qeyd}} tepiya anciya.",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 revizyon|$1 revizyon}} u {{PLURAL:$2|1 dosya|$2 dosya}} ameyê halê xo yê verıni",
-       "undeletedfiles": "{{PLURAL:$1|1 dosya|$1 dosya}} tepiya anciyayi.",
        "cannotundelete": "Besternayışonhemembyana tayno nêbeno:\n$1",
        "undeletedpage": "'''$1 pel tepiya anciya'''\n\nqey karê tepiya ardışi u qey karê hewn a kerdışê verıni bıewnê [[Special:Log/delete|qeydê hewn a kerdışi]].",
        "undelete-header": "Peleyê ke veror de besterneyayê êna bıvinê: [[Special:Log/delete|qeydê esterneya]].",
        "block": "Karberi vındarne",
        "unblock": "Hesabê karberi akerê",
        "blockip": "{{GENDER:$1|Karberi}} kılit ke",
-       "blockip-legend": "Karber blok bike",
+       "blockip-legend": "Karberi blok ke",
        "blockiptext": "pê şuxulnayişê formê cêrıni, şıma eşkeni verniyê vurnayişkerdışê yew karberi ya zi yew IPyi bıgêrî. No têna qey verni-gırewtışê vandalizmiyo u gani şıma [[{{MediaWiki:Policy-url}}|qaydeyan]] re diqqet bıkeri. cêr de muheqqeq sebebê verni-grewtışi bınusi. (mesela: -nê- pelani de vandalizm kerdo)",
        "ipaddressorusername": "Adresa IPy ya zi nameyê karberi:",
        "ipbexpiry": "Qedyayış:",
        "ipbsubmit": "Nê karberi kılit ke",
        "ipbother": "Waxtê bini:",
        "ipboptions": "2 saeti:2 hours,1 roce:1 day,3 roci:3 days,1 hefte:1 week,2 heftey:2 weeks,1 aşme:1 month,3 aşmi:3 months,6 aşmi:6 months,1 serre:1 year,ebedi:infinite",
-       "ipbhidename": "Nameyê karberî listeyan u vurnayîşan ra binumne",
-       "ipbwatchuser": "Pela miniqaşe u pela ena karberî seyr bike",
+       "ipbhidename": "Namey karberi vırnayış u listan ra bınımne",
+       "ipbwatchuser": "Perra karberanê karberi u werênayışi cı ewne.",
        "ipb-disableusertalk": "No karber wexto ke bloqedeyo wa pela da xodı vurnayış kerdışi rê izin medı",
-       "ipb-change-block": "Pê ena ayaran, karberî reyna bloke bike",
+       "ipb-change-block": "Karberi be enê eyaran reyna piya bloke ke.",
        "ipb-confirm": "Bloke kerdışi tesdik ke",
        "badipaddress": "Adresê IPî raşt niyo",
        "blockipsuccesssub": "Blok biyo",
        "ipb-confirmhideuser": "Wexto ke \"karberi bınımnê\" nışandeyo se şıma ye kenê karberi bloke kerê. No, Namey karberi lista pêron dı u dekewtışê rocekan dı aktiv bo.Şıma qayıli ney bıkerê?",
        "ipb-edit-dropdown": "Sebebê blokî bivurne",
        "ipb-unblock-addr": "$1 a bik",
-       "ipb-unblock": "Yew adresê IPî ya zi nameyê karberî blok bike",
+       "ipb-unblock": "Yew adresê IPy ya zi namey karberi bloke ke",
        "ipb-blocklist": "Blokî ke hama estê ey bivîne",
        "ipb-blocklist-contribs": "İştirakê {{GENDER:$1|$1}}`i",
        "ipb-blocklist-duration-left": "$1 vet",
-       "unblockip": "Hesabê karberî a bike",
+       "unblockip": "Hesabê karberi a ke",
        "unblockiptext": "Cıreştışê nuştışê IP ya zi karberio ke ver ra gêriyayo, seba peyser barkerdışi dey rê formê cêrêni bıgurenên.",
        "ipusubmit": "Enê kılit kerdışi wedarnê",
        "unblocked": "[[User:$1|$1]] blok biyo",
        "move-page": "$1 Bıkırış",
        "move-page-legend": "Pele bere",
        "movepagetext": "Pe form ki ho bın de, tı eşkeno name yew pele bıvurni u tarixê pele hemi ya zi pyeran beri.\nMa nameyê kıhanyeri keno pele redireksiyoni ser nameyê newe.\nTı eşkeno pele redireksiyoni ki şıno nameyê originali bıvurni.\nEg tı nıwazeno, ma tı ra rica keni tı [[Special:DoubleRedirects|double]] ya zi [[Special:BrokenRedirects|broken redirects]] qontrol bıki.\nTı gani qontrol bıki eg gıreyan şıno peleyanê raşti.\n\nTeme eka ser yew name de yew nuşte esti, sistemê ma '''nıeşkeno''' nuşte tı beri. Eka ser ena name de yew pele vengi esti, sistemê ma eşkeno nuşte tı beri.\nTı nıeşkeni name yew pele reyna bıvurni.\n\n'''Teme!'''\nEna transfer ser peleyanê populari zaf muhumo;\nMa tu ra rica keni, tı en verni dı qontrol bıki u bışıravi.",
-       "movepagetext-noredirectfixer": "Pe form ki ho bın de, tı eşkeno name yew pele bıvurni u tarixê pele hemi ya zi pyeran beri.\nMa nameyê kıhanyeri keno pele redireksiyoni ser nameyê newe.\nTı eşkeno pele redireksiyoni ki şıno nameyê originali bıvurni.\nEg tı nıwazeno, ma tı ra rica keni tı [[Special:DoubleRedirects|raçarnayışo dılet]] ya zi [[Special:BrokenRedirects|raçarnayışo xırab]]i qontrol bıke.\nTı gani qontrol bıki eg gıreyan şıno peleyanê raşti.\n\nTeme eka ser yew name de yew nuşte esti, sistemê ma '''nıeşkeno''' nuşte tı beri. Eka ser ena name de yew pele vengi esti, sistemê ma eşkeno nuşte tı beri.\nTı nıeşkeni name yew pele reyna bıvurni.\n\n'''İkaz!'''\nEna transfer ser peleyanê populari zaf muhumo;\nMa tu ra rica keni, tı en verni dı qontrol bıki u bışıravi.",
+       "movepagetext-noredirectfixer": " Gırwenayışê formê bınêni do namey perre newe vırazo, pêro vêrorê cı bıkırışo namey newe ser.\nMa namey kıhanêri keni perra serşıkıtışi ser nameyo newe.\nŞıma şenê perra serşıkıtışı zi berê namey raştıkên bıvırnên.\n\nEger şıma nêwazenê, ma şıma ra reca keni şıma [[Special:DoubleRedirects|açarnayışo (tadayışo) dılet]] ya zi [[Special:BrokenRedirects|açarnayışo (tadayışon) çewt]]i kontrol kerên.\nŞıma gani kontrol kerên eger linki şınê perranê raştan ser.\n\nTeme eger ser yew name de yew nuşte esto, sistemê wiki '''nêşeno''' nuştey şıma bıkırışo. Eger ser enê namey de yew perra venge esta, sistemê wiki şeno nuştey şıma bıkırışo.\nTı nıeşkeni name yew pele reyna bıvurni.\n\n'''İqaz!'''\nNo kırıştış şeno yew perra populere rê wışkên u nêpawiyay bo. Ma şıma ra reca kenime, kerdışê xo ra ver peyniyê cı bıvênên.",
        "movepagetalktext": "Ma peleyê mınaqeşeyê ena pele otomatik beno, '''ma nıeşken ber, eg:'''\n*Yew peleyê mınaqeşeyê ser ena name rona esto, ya zi\n*Tı quti check nıkerd.\n\nOturse, tı gani peleyê mınaqeşeyê manually beri.",
        "moveuserpage-warning": "'''Diqet:''' Ti eka yew pelê karberi beni. Diqet bike teyna pel beni feqat ena pele reyna nameyê newi \"nebeno''.",
        "movenologintext": "qey vurnayişê nameyê peli şıma gani qeyd kerde u cıkewteyê [[Special:UserLogin|sistemi]] bıbiy.",
        "tooltip-ca-nstab-category": "Pela kategoriye bıvêne",
        "tooltip-minoredit": "Ney vırnayışo werdi nışan bıkerê",
        "tooltip-save": "Vurnayışanê xo qeyd ke",
-       "tooltip-publish": "Vurnayışê xo vıla kı",
+       "tooltip-publish": "Vırnayışê xo aşkera ke",
        "tooltip-preview": "Vurnayışanê xo çım ra bıviyarnê. Qeydkerdış ra ver bıgurê cı!",
        "tooltip-diff": "Kamci vırnayışê ke şıma nuştey sero kerdê, inan bıvênê.",
        "tooltip-compareselectedversions": "Ena per de ferqê rewziyonan de dı weçinaya bıvinê",
        "unit-pixel": "px",
        "confirm_purge_button": "Temam",
        "confirm-purge-top": "Vervirê na pele bestere?",
-       "confirm-purge-bottom": "Purge kerdişê yew pel cacheyî estereno u revizyonê penîyî mucneno.",
+       "confirm-purge-bottom": "Pakkerdışê yew perre virê verêni estereno u çımraviyarnayışê peyêni gêno ver.",
        "confirm-watch-button": "TEMAM",
        "confirm-watch-top": "Ena pele lista xoya seyrkerdışi ke",
        "confirm-unwatch-button": "TEMAM",
        "hebrew-calendar-m6": "Adar",
        "hebrew-calendar-m6a": "Adar I",
        "hebrew-calendar-m6b": "Adar II",
-       "hebrew-calendar-m7": "Nisan",
+       "hebrew-calendar-m7": "Nisane",
        "hebrew-calendar-m8": "Iyar",
        "hebrew-calendar-m9": "Sivan",
        "hebrew-calendar-m10": "Tamuz",
        "hebrew-calendar-m6-gen": "Adar",
        "hebrew-calendar-m6a-gen": "Adar I",
        "hebrew-calendar-m6b-gen": "Adar II",
-       "hebrew-calendar-m7-gen": "Nisan",
+       "hebrew-calendar-m7-gen": "Nisane",
        "hebrew-calendar-m8-gen": "Iyar",
        "hebrew-calendar-m9-gen": "Sivan",
        "hebrew-calendar-m10-gen": "Tamuz",
        "htmlform-chosen-placeholder": "Opsiyon weçine",
        "htmlform-cloner-create": "Tayêna cı ke",
        "htmlform-cloner-delete": "Wedare",
-       "logentry-delete-delete": "$1 pela $3 {{GENDER:$2|esterıte}}",
+       "logentry-delete-delete": "$1 perra $3 {{GENDER:$2|esterıte}}",
        "logentry-delete-restore": "$1 pela $3 {{GENDER:$2|peyser arde}}",
        "logentry-delete-event": "$1 $3: $4 de asayışê {{PLURAL:$5|cıkerdışi|cıkerdışan}} {{GENDER:$2|vurna}}",
        "logentry-delete-revision": "$1 pela $3: $4 de asayışê {{PLURAL:$5|yew revizyoni|$5 revizyonan}} {{GENDER:$2|vurna}}",
index cb1e286..30cc41c 100644 (file)
        "login": "प्रवेश (लगईन)",
        "login-security": "तमरो पहिचान जाचँ गर",
        "nav-login-createaccount": "प्रवेश गर्ने/नयाँ खाता बनाउन्या",
-       "userlogin": "प्रवेश गर्ने / नयाँ खाता बनाउन्या",
-       "userloginnocreate": "प्रवेश",
        "logout": "बाहिर निस्कन्या",
        "userlogout": "बाहिर निस्कन्या",
        "notloggedin": "प्रवेश (लग ईन) नगरिएको",
        "userlogin-noaccount": "के खाता छैन ?",
        "userlogin-joinproject": "{{SITENAME}} मी खाता खोल ।",
-       "nologin": "तमरो खाता छैन? $1।",
-       "nologinlink": "नयाँ खाता खोल",
        "createaccount": "खाता खोल",
-       "gotaccount": "तमरो खाता छनोई छ? $1।",
-       "gotaccountlink": "प्रवेश",
-       "userlogin-resetlink": "प्रवेश सम्बन्धी विवरणहरू बिसरया भयो?",
        "userlogin-resetpassword-link": "पासवर्ड भुलिगया?",
        "userlogin-helplink2": "प्रवेश गद्दलाई सहयोग",
        "userlogin-loggedin": "तमी {{GENDER:$1|$1}}को रूपमी प्रवेश (लग इन) भइ सक्यौ ।\nअर्को प्रयोगकर्ताको रूपमी प्रवेश (लग इन) गर्न तलको फारम प्रयोग गर ।",
        "createacct-email-ph": "तमरो इमेल ठेगाना भरऽ",
        "createacct-another-email-ph": "इमेल ठेगाना भर",
        "createacct-realname": "वास्तविक नाम (ऐच्छिक)",
-       "createaccountreason": "कारण:",
        "createacct-reason": "कारण",
        "createacct-reason-ph": "क्याई तम नयाँ खाता खोल्ला छौ?",
        "createacct-submit": "तमरो खाता बनाऽ",
        "undeletehistory": "यदि कुनै पानालाई पुन: स्थापन गरायौ भण्या सम्पूर्ण संस्करणहरू इतिहासमी पुन:स्थापन हुन्याछन् ।\nयदि यै नामबठे  नयाँ पानो निर्माण भैसक्याको छ भण्या पुन: स्थापित संस्करणहरू पूर्व इतिहासको रुपमी स्थापित हुन्याछन् ।",
        "undeleterevdel": "यदि यो मल्लो पानो बणन्छ  या फाइल संस्करणहरू आंशिक मेटियाका छन् भण्या मेट्न्या काम रद्द गरिन्या छैन।\nत्यै अवस्थामी तमीले छनौटमी अन्तिम मेटियाको नयाँ संस्करण नलुकाउन्यामी चिनो लगाउनु पडन्छ ।",
        "undelete-revision": "$3द्वारा $1को ($4को  समय $5 मी) मेट्याका संशोधनहरू :",
-       "undeletedrevisions": "{{PLURAL:$1|एउटा संशोधन|$1 संशोधनहरू}} पुनर्स्थापित गरियो",
-       "undeletedrevisions-files": "{{PLURAL:$1|एउटा संशोधन|$1 संशोधनहरू}} र {{PLURAL:$2|एउटा फाइल|$2 फाइलहरू}} पुनर्स्थापित गरियो",
-       "undeletedfiles": "{{PLURAL:$1|१ फाइल|$1 फाइलहरू }} पूर्वस्थितिमी ल्याइयो",
        "undelete-header": "भर्खरै मेटायाका पानाहरू हेद्दाकीलाई [[Special:Log/delete|मेटायाका लग]]मी जाओ।",
        "undelete-search-prefix": "सुरुवाती शब्द अनुसार पानाहरू खोज",
        "undelete-no-results": "मेटियाका पानाहरूको अभिलेखमी क्वै पन मिल्दा पानाहरू नाइभेटिया ।",
        "newimages": "नौला फाइलहरूको ग्यालरी",
        "imagelisttext": " '''$1''' {{PLURAL:$1|फाइल|फाइलहरू}} को निम्न सुची ,क्रमवद्ध $2.",
        "newimages-summary": "यै खास पानाले अन्तिम अपलोड गर्याका फाइलहरू धेकाउँन्छ ।",
+       "newimages-user": "आइपी(IP) ठेगाना या प्रयोगकर्ता नाउँ",
        "days": "{{PLURAL:$1|$1 दिन|$1 दिनहरू}}",
        "metadata": "मेटाडेटा",
        "metadata-help": "यै फाइलमि अतिरिक्त जानकारीहरू छन्, यैलाई बणुउन सम्भवतः डिजिटल क्यामरा और स्क्यानर प्रयोग गरियाको हुनसकन्छ । यदि यै फाइललाई खास अवस्थाबठे फेरबदल गरियाको हो भण्या यै फाइलले  सब्बै विवरण प्रतिबिम्बित गद्द सक्यानाइथी ।",
index 219c204..1a94c80 100644 (file)
@@ -49,7 +49,8 @@
                        "Nemo bis",
                        "Αντιγόνη",
                        "Matma Rex",
-                       "Ανώνυμος Βικιπαιδιστής"
+                       "Ανώνυμος Βικιπαιδιστής",
+                       "GR"
                ]
        },
        "tog-underline": "Υπογράμμιση συνδέσμων:",
        "rcfilters-invalid-filter": "Μη έγκυρο φίλτρο",
        "rcfilters-empty-filter": "Χωρίς ενεργά φίλτρα. Εμφανίζονται όλες οι συνεισφορές.",
        "rcfilters-filterlist-title": "Φίλτρα",
+       "rcfilters-filterlist-whatsthis": "Τι είναι αυτό;",
        "rcfilters-filterlist-noresults": "Δεν βρέθηκαν φίλτρα",
+       "rcfilters-noresults-conflict": "Δε βρέθηκαν αποτελέσματα γιατί τα κριτήρια αναζήτησης είναι σε διένεξη.",
        "rcfilters-filtergroup-registration": "Επωνυμία χρηστών",
        "rcfilters-filter-registered-label": "Εγγεγραμμένοι",
        "rcfilters-filter-registered-description": "Συνδεδεμένοι συντάκτες.",
        "rcfilters-filter-editsbyother-label": "Επεξεργασίες από άλλους",
        "rcfilters-filter-editsbyother-description": "Επεξεργασίες που δημιουργήθηκαν από άλλους χρήστες (όχι εσάς).",
        "rcfilters-filtergroup-userExpLevel": "Επίπεδο εμπειρίας (για εγγεγραμμένους χρήστες μόνο)",
-       "rcfilters-filter-userExpLevel-newcomer-label": "Νεοφερμένοι",
-       "rcfilters-filter-userExpLevel-newcomer-description": "Λιγότερες από 10 επεξεργασίες και 4 ημέρες δραστηριότητας.",
-       "rcfilters-filter-userExpLevel-learner-label": "Μαθητευόμενοι",
-       "rcfilters-filter-userExpLevel-learner-description": "Περισσότερες ημέρες δραστηριότητας και επεξεργασίες από τους «νεοφερμένους» αλλά λιγότερες από τους «έμπειρους χρήστες».",
-       "rcfilters-filter-userExpLevel-experienced-label": "Έμπειροι χρήστες",
-       "rcfilters-filter-userExpLevel-experienced-description": "Περισσότερες από 30 ημέρες δραστηριότητας και 500 αλλαγές.",
+       "rcfilters-filter-user-experience-level-newcomer-label": "Νεοφερμένοι",
+       "rcfilters-filter-user-experience-level-newcomer-description": "Λιγότερες από 10 επεξεργασίες και 4 ημέρες δραστηριότητας.",
+       "rcfilters-filter-user-experience-level-learner-label": "Μαθητευόμενοι",
+       "rcfilters-filter-user-experience-level-learner-description": "Περισσότερες ημέρες δραστηριότητας και επεξεργασίες από τους «νεοφερμένους» αλλά λιγότερες από τους «έμπειρους χρήστες».",
+       "rcfilters-filter-user-experience-level-experienced-label": "Έμπειροι χρήστες",
+       "rcfilters-filter-user-experience-level-experienced-description": "Περισσότερες από 30 ημέρες δραστηριότητας και 500 αλλαγές.",
        "rcfilters-filtergroup-automated": "Αυτοματοποιημένες συνεισφορές",
        "rcfilters-filter-bots-label": "Ρομπότ",
        "rcfilters-filter-bots-description": "Επεξεργασίες που έγιναν από αυτοματοποιημένα εργαλεία.",
        "undeleteviewlink": "προβολή",
        "undeleteinvert": "Ανατροπή επιλογής",
        "undeletecomment": "Αιτία:",
-       "undeletedrevisions": "{{PLURAL:$1|τροποποίηση|τροποποιήσεις}} αποκαταστάθηκαν",
-       "undeletedrevisions-files": "$1 {{PLURAL:$1|αναθεώρηση|αναθεωρήσεις}} και $2 {{PLURAL:$2|αρχείο|αρχεία}} επαναφέρθηκαν",
-       "undeletedfiles": "$1 {{PLURAL:$1|αρχείο|αρχεία}} επαναφέρθηκαν",
        "cannotundelete": "Μερικές ή όλες οι  αναιρέσεις διαγραφής απέτυχαν: $1",
        "undeletedpage": "'''Η $1 έχει επαναφερθεί'''\n\nΣυμβουλευτείτε το [[Special:Log/delete|αρχείο καταγραφής διαγραφών]] για ένα μητρώο των πρόσφατων διαγραφών και επαναφορών.",
        "undelete-header": "Δείτε [[Special:Log/delete|το αρχείο καταγραφής διαγραφών]] για πρόσφατα διαγεγραμμένες σελίδες.",
        "newimages-summary": "Αυτή η ειδική σελίδα δείχνει τα πιο πρόσφατα ανεβασμένα αρχεία.",
        "newimages-legend": "Φίλτρο",
        "newimages-label": "Όνομα αρχείου (ή μέρος αυτού):",
+       "newimages-user": "Διεύθυνση IP ή όνομα χρήστη",
        "newimages-showbots": "Εμφάνιση αρχείων ανεβασμένων από ρομπότ",
        "newimages-hidepatrolled": "Απόκρυψη ελεγμένων αρχείων.",
        "noimages": "Δεν υπάρχουν εικόνες.",
index 2ef4f3a..e90e86c 100644 (file)
        "post-expand-template-argument-warning": "<strong>Warning:</strong> This page contains at least one template argument that has a too large expansion size.\nThese arguments have been omitted.",
        "post-expand-template-argument-category": "Pages containing omitted template arguments",
        "parser-template-loop-warning": "Template loop detected: [[$1]]",
+       "template-loop-category": "Pages with template loops",
+       "template-loop-category-desc": "The page contains a template loop, ie. a template which calls itself recursively.",
        "parser-template-recursion-depth-warning": "Template recursion depth limit exceeded ($1)",
        "language-converter-depth-warning": "Language converter depth limit exceeded ($1)",
        "node-count-exceeded-category": "Pages where node count is exceeded",
        "page_first": "first",
        "page_last": "last",
        "histlegend": "Diff selection: Mark the radio boxes of the revisions to compare and hit enter or the button at the bottom.<br />\nLegend: <strong>({{int:cur}})</strong> = difference with latest revision, <strong>({{int:last}})</strong> = difference with preceding revision, <strong>{{int:minoreditletter}}</strong> = minor edit.",
-       "history-fieldset-title": "Browse history",
+       "history-fieldset-title": "Search for revisions",
        "history-show-deleted": "Revision deleted only",
        "history_copyright": "-",
        "histfirst": "oldest",
        "userrights-groupsmember": "Member of:",
        "userrights-groupsmember-auto": "Implicit member of:",
        "userrights-groupsmember-type": "$1",
-       "userrights-groups-help": "You may alter the groups this user is in:\n* A checked box means the user is in that group.\n* An unchecked box means the user is not in that group.\n* A * indicates that you cannot remove the group once you have added it, or vice versa.\n* A # indicates that you can only put back the expiration time of this group; you cannot bring it forward.",
+       "userrights-groups-help": "You may alter the groups this user is in:\n* A checked box means the user is in that group.\n* An unchecked box means the user is not in that group.\n* A * indicates that you cannot remove the group once you have added it, or vice versa.\n* A # indicates that you can only put back the expiration time of this group membership; you cannot bring it forward.",
        "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-expiry-options": "1 day:1 day,1 week:1 week,1 month:1 month,3 months:3 months,6 months:6 months,1 year:1 year",
        "userrights-invalid-expiry": "The expiry time for group \"$1\" is invalid.",
        "userrights-expiry-in-past": "The expiry time for group \"$1\" is in the past.",
-       "userrights-cannot-shorten-expiry": "You cannot bring forward the expiry of group \"$1\". Only users with permission to add and remove this group can bring forward expiry times.",
+       "userrights-cannot-shorten-expiry": "You cannot bring forward the expiry of membership in group \"$1\". Only users with permission to add and remove this group can bring forward expiry times.",
        "userrights-conflict": "Conflict of user rights changes! Please review and confirm your changes.",
        "group": "Group:",
        "group-user": "Users",
        "recentchanges-legend": "Recent changes options",
        "recentchanges-summary": "Track the most recent changes to the wiki on this page.",
        "recentchangestext": "-",
-       "recentchanges-noresult": "No changes during the given period matching these criteria.",
+       "recentchanges-noresult": "No changes during the given period match these criteria.",
        "recentchanges-feed-description": "Track the most recent changes to the wiki in this feed.",
        "recentchanges-label-newpage": "This edit created a new page",
        "recentchanges-label-minor": "This is a minor edit",
        "rcfilters-invalid-filter": "Invalid filter",
        "rcfilters-empty-filter": "No active filters. All contributions are shown.",
        "rcfilters-filterlist-title": "Filters",
+       "rcfilters-filterlist-whatsthis": "What's this?",
        "rcfilters-filterlist-feedbacklink": "Provide feedback on the new (beta) filters",
        "rcfilters-highlightbutton-title": "Highlight results",
        "rcfilters-highlightmenu-title": "Select a color",
        "rcfilters-highlightmenu-help": "Select a color to highlight this property",
        "rcfilters-filterlist-noresults": "No filters found",
+       "rcfilters-noresults-conflict": "No results found because the search criteria are in conflict",
+       "rcfilters-state-message-subset": "This filter has no effect because its results are included with those of the following, broader {{PLURAL:$2|filter|filters}} (try highlighting to distinguish it): $1",
+       "rcfilters-state-message-fullcoverage": "Selecting all filters in a group is the same as selecting none, so this filter has no effect. Group includes: $1",
        "rcfilters-filtergroup-registration": "User registration",
        "rcfilters-filter-registered-label": "Registered",
        "rcfilters-filter-registered-description": "Logged-in editors.",
        "rcfilters-filter-unregistered-label": "Unregistered",
        "rcfilters-filter-unregistered-description": "Editors who aren’t logged in.",
-       "rcfilters-filter-unregistered-conflicts-user-experience-level": "The \"Unregistered\" filter is inactive because its effect is being canceled by the following Experience {{PLURAL:$2|filter|filters}}, which {{PLURAL:$2|finds|find}} only registered users: $1",
+       "rcfilters-filter-unregistered-conflicts-user-experience-level": "This filter conflicts with the following Experience {{PLURAL:$2|filter|filters}}, which {{PLURAL:$2|finds|find}} only registered users: $1",
        "rcfilters-filtergroup-authorship": "Edit authorship",
        "rcfilters-filter-editsbyself-label": "Your own edits",
        "rcfilters-filter-editsbyself-description": "Edits by you.",
        "rcfilters-filter-editsbyother-label": "Edits by others",
        "rcfilters-filter-editsbyother-description": "Edits created by other users (not you).",
        "rcfilters-filtergroup-userExpLevel": "Experience level (for registered users only)",
-       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "This filter is inactive because it finds only registered users, so the \"Unregistered\" filter is canceling its effect.",
-       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "The \"Unregistered\" filter is in conflict with one or more Experience filters. Experience filters find registered users only. The conflicting filters are marked as inactive above.",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "Experience filters find only registered users, so this filter conflicts with the “Unregistered” filter.",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "The \"Unregistered\" filter conflicts with one or more Experience filters, which find registered users only. The conflicting filters are marked in the Active Filters area, above.",
        "rcfilters-filter-user-experience-level-newcomer-label": "Newcomers",
        "rcfilters-filter-user-experience-level-newcomer-description": "Fewer than 10 edits and 4 days of activity.",
        "rcfilters-filter-user-experience-level-learner-label": "Learners",
        "rcfilters-filter-categorization-description": "Records of pages being added or removed from categories.",
        "rcfilters-filter-logactions-label": "Logged actions",
        "rcfilters-filter-logactions-description": "Administrative actions, account creations, page deletions, uploads....",
+       "rcfilters-hideminor-conflicts-typeofchange-global": "The \"Minor edits\" filter conflicts with one or more Type of Change filters, because certain types of change cannot be designated as \"minor.\" The conflicting filters are marked in the Active Filters area, above.",
+       "rcfilters-hideminor-conflicts-typeofchange": "Certain types of change cannot be designated as \"minor,\" so this filter conflicts with the following Type of Change filters: $1",
+       "rcfilters-typeofchange-conflicts-hideminor": "This Type of Change filter conflicts with the \"Minor Edits\" filter. Certain types of change cannot be designated as \"minor.\"",
        "rcnotefrom": "Below {{PLURAL:$5|is the change|are the changes}} since <strong>$3, $4</strong> (up to <strong>$1</strong> shown).",
+       "rclistfromreset": "Reset date selection",
        "rclistfrom": "Show new changes starting from $2, $3",
        "rcshowhideminor": "$1 minor edits",
        "rcshowhideminor-show": "Show",
        "php-uploaddisabledtext": "File uploads are disabled in PHP.\nPlease check the file_uploads setting.",
        "uploadscripted": "This file contains HTML or script code that may be erroneously interpreted by a web browser.",
        "upload-scripted-pi-callback": "Cannot upload a file that contains XML-stylesheet processing instruction.",
+       "upload-scripted-dtd": "Cannot upload SVG files that contain a non-standard DTD declaration.",
        "uploaded-script-svg": "Found scriptable element \"$1\" in the uploaded SVG file.",
        "uploaded-hostile-svg": "Found unsafe CSS in the style element of uploaded SVG file.",
        "uploaded-event-handler-on-svg": "Setting event-handler attributes <code>$1=\"$2\"</code> is not allowed in SVG files.",
        "undeleteviewlink": "view",
        "undeleteinvert": "Invert selection",
        "undeletecomment": "Reason:",
-       "undeletedrevisions": "{{PLURAL:$1|1 revision|$1 revisions}} restored",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 revision|$1 revisions}} and {{PLURAL:$2|1 file|$2 files}} restored",
-       "undeletedfiles": "{{PLURAL:$1|1 file|$1 files}} restored",
        "cannotundelete": "Some or all of the undeletion failed:\n$1",
        "undeletedpage": "<strong>$1 has been restored</strong>\n\nConsult the [[Special:Log/delete|deletion log]] for a record of recent deletions and restorations.",
        "undelete-header": "See [[Special:Log/delete|the deletion log]] for recently deleted pages.",
        "unblocked-id": "Block $1 has been removed.",
        "unblocked-ip": "[[Special:Contributions/$1|$1]] has been unblocked.",
        "blocklist": "Blocked users",
+       "autoblocklist": "Autoblocks",
+       "autoblocklist-submit": "Search",
+       "autoblocklist-legend": "List autoblocks",
+       "autoblocklist-localblocks": "Local {{PLURAL:$1|autoblock|autoblocks}}",
+       "autoblocklist-empty": "The autoblock list is empty.",
+       "autoblocklist-otherblocks": "Other {{PLURAL:$1|autoblock|autoblocks}}",
        "ipblocklist": "Blocked users",
        "ipblocklist-legend": "Find a blocked user",
        "blocklist-userblocks": "Hide account blocks",
        "newimages-summary": "This special page shows the last uploaded files.",
        "newimages-legend": "Filter",
        "newimages-label": "Filename (or a part of it):",
+       "newimages-user": "IP address or username",
        "newimages-showbots": "Show uploads by bots",
        "newimages-hidepatrolled": "Hide patrolled uploads",
        "noimages": "Nothing to see.",
        "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-restore": "$1 {{GENDER:$2|restored}} page $3 ($4)",
+       "logentry-delete-restore-nocount": "$1 {{GENDER:$2|restored}} page $3",
+       "restore-count-revisions": "{{PLURAL:$1|1 revision|$1 revisions}}",
+       "restore-count-files": "{{PLURAL:$1|1 file|$1 files}}",
        "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",
        "logentry-delete-event-legacy": "$1 {{GENDER:$2|changed}} visibility of log events on $3",
        "special-characters-group-thai": "Thai",
        "special-characters-group-lao": "Lao",
        "special-characters-group-khmer": "Khmer",
+       "special-characters-group-canadianaboriginal": "Canadian Aboriginal",
        "special-characters-title-endash": "en dash",
        "special-characters-title-emdash": "em dash",
        "special-characters-title-minus": "minus sign",
        "restrictionsfield-label": "Allowed IP ranges:",
        "restrictionsfield-help": "One IP address or CIDR range per line. To enable everything, use:<pre>0.0.0.0/0\n::/0</pre>",
        "revid": "revision $1",
-       "pageid": "page ID $1"
+       "pageid": "page ID $1",
+       "rawhtml-notallowed": "&lt;html&gt; tags cannot be used outside of normal pages.",
+       "gotointerwiki": "Leaving {{SITENAME}}",
+       "gotointerwiki-invalid": "The specified title was invalid.",
+       "gotointerwiki-external": "You are about to leave {{SITENAME}} to visit [[$2]] which is a separate website.\n\n[$1 Click here to continue on to $1].",
+       "undelete-cantedit": "You cannot undelete this page as you are not allowed to edit this page.",
+       "undelete-cantcreate": "You cannot undelete this page as there is no existing page with this name and you are not allowed to create this page."
 }
index d5c5258..32cb092 100644 (file)
        "login": "Ensaluti",
        "login-security": "Kontrolu vian identecon",
        "nav-login-createaccount": "Ensaluti / Krei novan konton",
-       "userlogin": "Ensaluti / Krei novan konton",
-       "userloginnocreate": "Ensaluti",
        "logout": "Elsaluti",
        "userlogout": "Elsaluti",
        "notloggedin": "Ne ensalutinta",
        "userlogin-noaccount": "Ĉu vi ne havas konton?",
        "userlogin-joinproject": "Aliĝu al {{SITENAME}}",
-       "nologin": "Ĉu vi ne havas konton? $1.",
-       "nologinlink": "Krei konton",
        "createaccount": "Krei konton",
-       "gotaccount": "Ĉu vi jam havas konton? $1.",
-       "gotaccountlink": "Ensaluti",
-       "userlogin-resetlink": "Ĉu vi forgesis ensalutajn detalojn?",
        "userlogin-resetpassword-link": "Ĉu vi forgesis vian pasvorton?",
        "userlogin-helplink2": "Helpo pri ensaluto",
        "userlogin-loggedin": "Vi jam estas ensalutita kiel {{GENDER:$1|$1}}.\nUzu la formularon suben por ensaluti kiel alia uzanto.",
        "createaccountmail": "Uzi provizoran hazardsignan pasvorton kaj sendi ĝin al la retpoŝta adreso ĉi-suba",
        "createaccountmail-help": "Uzebla por krei konton de alia persono sen lerni la pasvorton.",
        "createacct-realname": "Vera nomo (nedeviga)",
-       "createaccountreason": "Kialo:",
        "createacct-reason": "Kialo",
        "createacct-reason-ph": "Kial vi kreas plian konton",
        "createacct-reason-help": "Mesaĝo vidigita en la protokolo pri kreado de konto",
        "savearticle": "Konservi paĝon",
        "savechanges": "Konservi ŝanĝojn",
        "publishpage": "Eldoni paĝon",
-       "publishchanges": "Eldoni ŝanĝojn",
+       "publishchanges": "Publikigi ŝanĝojn",
        "preview": "Antaŭrigardo",
        "showpreview": "Antaŭrigardo",
        "showdiff": "Montri ŝanĝojn",
        "post-expand-template-argument-warning": "Averto: Ĉi tiu paĝo enhavas almenaŭ unu ŝablonan argumenton, kiu havas tro grandan etendan pezon.\nĈi tiuj argumentoj estis forlasitaj.",
        "post-expand-template-argument-category": "Paĝoj enhavantaj forlasitajn argumentojn de ŝablonoj",
        "parser-template-loop-warning": "Rekursiva ŝablono estis trovita: [[$1]]",
+       "template-loop-category": "Paĝoj kun ŝablonaj iteracioj",
        "parser-template-recursion-depth-warning": "Ŝablona profundeco transpasis limon ($1)",
        "language-converter-depth-warning": "Profundo de lingvo-konvertilo preterpasis limon ($1)",
        "node-count-exceeded-category": "Paĝoj kie la nombro da nodoj estas preterpasita",
        "rcfilters-filter-editsbyother-label": "Redaktoj de aliuloj",
        "rcfilters-filter-editsbyother-description": "Redaktoj kreitaj far aliaj uzantoj (krom vi).",
        "rcfilters-filtergroup-userExpLevel": "Spertonivelo (nur por registritaj uzantoj)",
-       "rcfilters-filter-userExpLevel-newcomer-label": "Novuloj",
-       "rcfilters-filter-userExpLevel-newcomer-description": "Malpli ol 10 redaktoj kaj 4 tagoj de aktiveco.",
-       "rcfilters-filter-userExpLevel-learner-label": "Lernantoj",
-       "rcfilters-filter-userExpLevel-learner-description": "Pliaj tagoj da aktiveco kaj redaktoj ol \"Novuloj\" sed malpli ol \"Spertaj uzantoj\".",
-       "rcfilters-filter-userExpLevel-experienced-label": "Spertaj uzantoj",
-       "rcfilters-filter-userExpLevel-experienced-description": "Pli ol 30 tagoj da aktiveco kaj 500 redaktoj.",
+       "rcfilters-filter-user-experience-level-newcomer-label": "Novuloj",
+       "rcfilters-filter-user-experience-level-newcomer-description": "Malpli ol 10 redaktoj kaj 4 tagoj de aktiveco.",
+       "rcfilters-filter-user-experience-level-learner-label": "Lernantoj",
+       "rcfilters-filter-user-experience-level-learner-description": "Pliaj tagoj da aktiveco kaj redaktoj ol \"Novuloj\" sed malpli ol \"Spertaj uzantoj\".",
+       "rcfilters-filter-user-experience-level-experienced-label": "Spertaj uzantoj",
+       "rcfilters-filter-user-experience-level-experienced-description": "Pli ol 30 tagoj da aktiveco kaj 500 redaktoj.",
        "rcfilters-filtergroup-automated": "Aŭtomatigitaj kontribuoj",
        "rcfilters-filter-bots-label": "Roboto",
        "rcfilters-filter-bots-description": "Redaktoj farita de aŭtomatigitaj iloj.",
        "undeleteviewlink": "vidi",
        "undeleteinvert": "Inversigi selektaĵon",
        "undeletecomment": "Kialo:",
-       "undeletedrevisions": "{{PLURAL:$1|1 versio restarigita|$1 versioj restarigitaj}}",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 versio|$1 versioj}} kaj {{PLURAL:$2|1 dosiero|$2 dosieroj}} restarigitaj",
-       "undeletedfiles": "{{PLURAL:$1|1 dosiero restarigita|$1 dosieroj restarigitaj}}",
        "cannotundelete": "Iu aŭ ĉiuj restarigoj malsukcesis: \n$1",
        "undeletedpage": "'''$1 estis restarigita'''\n\nKonsultu la [[Special:Log/delete|deletion log]] por protokolo pri la lastatempaj forigoj kaj restarigoj.",
        "undelete-header": "Konsulti la [[Special:Log/delete|protokolo de forigoj]] por lastatempaj forigoj.",
        "logentry-tag-update-revision": "$1 {{GENDER:$2|ĝisdatigis}} etikedojn de la revizio $4 de la paĝo $3 ({{PLURAL:$7|aldonita|aldonitaj}} $6; {{PLURAL:$9|forigita|forigitaj}} $8)",
        "logentry-tag-update-logentry": "$1 {{GENDER:$2|ĝisdatigis}} etikedojn de la protokolero $5 de la paĝo $3 ({{PLURAL:$7|aldonita|aldonitaj}} $6; {{PLURAL:$9|forigita|forigitaj}} $8)",
        "rightsnone": "(nenia)",
-       "revdelete-summary": "redaktoresumon",
        "feedback-adding": "Aldonanta respondon al la paĝo...",
        "feedback-back": "Reen",
        "feedback-bugcheck": "Bonega! Nur konfirmu ke ĝi ne jam ekzistas inter la [$1 konataj cimoj].",
index 5b5e0e4..3cecd14 100644 (file)
                        "Sophivorus",
                        "Pompilos",
                        "Igv",
-                       "Juanpabl"
+                       "Juanpabl",
+                       "AlimanRuna"
                ]
        },
        "tog-underline": "Subrayar los enlaces:",
        "post-expand-template-argument-warning": "Aviso: Esta página contiene al menos un parámetro de plantilla con un tamaño de expansión demasiado grande.\nSe han descartado esos parámetros.",
        "post-expand-template-argument-category": "Páginas que contienen plantillas con parámetros descartados",
        "parser-template-loop-warning": "Se ha detectado un bucle de plantilla: [[$1]]",
+       "template-loop-category": "Páginas con bucles de plantillas",
+       "template-loop-category-desc": "Esta página contiene un bucle de plantillas, es decir, una plantilla que se llama a sí misma recursivamente.",
        "parser-template-recursion-depth-warning": "Se ha superado el límite de profundidad de la recursividad de plantillas ($1)",
        "language-converter-depth-warning": "Se ha superado el límite de profundidad del convertidor de idioma ($1)",
        "node-count-exceeded-category": "Páginas que sobrepasan la cantidad de nodos",
        "page_first": "primeras",
        "page_last": "últimas",
        "histlegend": "Selección de diferencias: marca las casillas correspondientes a las versiones a comparar y pulsa Intro o el botón de abajo.<br />\nLeyenda: <strong>({{int:cur}})</strong> = diferencias con la versión actual,\n<strong>({{int:last}})</strong> = diferencias con la versión anterior, <strong>{{int:minoreditletter}}</strong> = edición menor.",
-       "history-fieldset-title": "Buscar en el historial",
-       "history-show-deleted": "Solo eliminadas",
+       "history-fieldset-title": "Buscar revisiones",
+       "history-show-deleted": "Solo revisiones eliminadas",
        "histfirst": "primeras",
        "histlast": "últimas",
        "historysize": "({{PLURAL:$1|1 byte|$1 bytes}})",
        "prefs-help-prefershttps": "Los cambios surtirán efecto en tu próximo inicio de sesión.",
        "prefswarning-warning": "Has hecho cambios en tus preferencias que todavía no se han guardado. Si sales de esta página sin pulsar en «$1» no se actualizarán las preferencias.",
        "prefs-tabs-navigation-hint": "Sugerencia: Puede utilizar las teclas de flecha izquierda y derecha para navegar entre las pestañas de la lista de pestañas.",
-       "userrights": "Gestión de permisos de usuario",
+       "userrights": "Permisos de usuario",
        "userrights-lookup-user": "Selecciona una cuenta de usuario",
        "userrights-user-editname": "Escribe un nombre de usuario:",
        "editusergroup": "Cargar grupos de usuarios",
        "saveusergroups": "Guardar grupos {{GENDER:$1|del usuario|de la usuaria}}",
        "userrights-groupsmember": "Miembro de:",
        "userrights-groupsmember-auto": "Miembro implícito de:",
-       "userrights-groups-help": "Usted puede alterar los grupos en que está este usuario:\n* Una casilla marcada significa que el usuario está en ese grupo.\n* Una casilla sin marcar significa que el usuario no está en ese grupo.\n* Un * indica que no se puede eliminar el grupo una vez que se han añadido o viceversa.\n* Un # indica que sólo se puede volver a poner la fecha de caducidad de este grupo; no se pueden llevar adelante.",
+       "userrights-groups-help": "Puedes cambiar los grupos en que está este usuario:\n* Una casilla marcada significa que el usuario está en ese grupo.\n* Una casilla sin marcar significa que el usuario no está en ese grupo.\n* Un * indica que no se puede eliminar el grupo una vez que se ha añadido o viceversa.\n* Un # indica que sólo se puede volver a poner la fecha de caducidad de membresía de este grupo; no se pueden llevar adelante.",
        "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.",
        "right-suppressredirect": "Trasladar páginas sin dejar redirección",
        "right-upload": "Subir archivos",
        "right-reupload": "Subir una nueva versión de un archivo existente",
-       "right-reupload-own": "Subir una nueva versión de un archivo creado por uno mismo",
+       "right-reupload-own": "Subir una nueva versión de un archivo propio",
        "right-reupload-shared": "Sobrescribir localmente archivos presentes en el repositorio multimedia compartido",
        "right-upload_by_url": "Subir un archivo a traves de un URL",
        "right-purge": "Purgar la caché en el servidor sin tener que dar confirmación",
        "right-edituserjs": "Editar las páginas de JavaScript de otros usuarios",
        "right-editmyusercss": "Editar tus archivos CSS",
        "right-editmyuserjs": "Editar tus archivos JavaScript",
-       "right-viewmywatchlist": "Ver tu lista de seguimiento",
-       "right-editmywatchlist": "Editar tu lista de seguimiento. Algunas acciones seguirán agregando páginas aun sin este permiso.",
-       "right-viewmyprivateinfo": "Ver tu información privada (ej. correo electrónico, nombre real)",
-       "right-editmyprivateinfo": "Editar tu información privada (ej: correo electrónico, nombre real)",
+       "right-viewmywatchlist": "Ver su propia lista de seguimiento",
+       "right-editmywatchlist": "Editar su propia lista de seguimiento (algunas acciones seguirán añadiendo páginas aun sin este permiso).",
+       "right-viewmyprivateinfo": "Ver su propia información privada (ej.: correo electrónico, nombre real)",
+       "right-editmyprivateinfo": "Editar su propia información privada (ej.: correo electrónico, nombre real)",
        "right-editmyoptions": "Editar tus preferencias",
        "right-rollback": "Revertir rápidamente las ediciones del último usuario que modificó una página en particular",
        "right-markbotedits": "Marcar ediciones revertidas como ediciones de bot",
        "rcfilters-invalid-filter": "Filtro no válido",
        "rcfilters-empty-filter": "No hay filtros activos. Se muestran todas las contribuciones.",
        "rcfilters-filterlist-title": "Filtros",
+       "rcfilters-filterlist-whatsthis": "¿Qué es esto?",
        "rcfilters-highlightbutton-title": "Resaltar los resultados",
        "rcfilters-highlightmenu-title": "Selecciona un color",
        "rcfilters-highlightmenu-help": "Selecciona un color para resaltar esta propiedad",
        "rcfilters-filterlist-noresults": "No se encontraron filtros",
+       "rcfilters-noresults-conflict": "No se encontraron resultados porque los criterios de búsqueda están en conflicto.",
        "rcfilters-filtergroup-registration": "Registro de usuario",
        "rcfilters-filter-registered-label": "Registrados",
        "rcfilters-filter-registered-description": "Editores conectados.",
        "rcfilters-filter-humans-label": "Ser humano (no bot)",
        "rcfilters-filter-humans-description": "Ediciones realizadas por editores humanos.",
        "rcfilters-filtergroup-reviewstatus": "Estado de revisión",
+       "rcfilters-filter-patrolled-label": "Patrulladas",
+       "rcfilters-filter-patrolled-description": "Ediciones marcadas como patrulladas.",
+       "rcfilters-filter-unpatrolled-label": "No patrulladas",
+       "rcfilters-filter-unpatrolled-description": "Ediciones no marcadas como patrulladas.",
        "rcfilters-filtergroup-significance": "Significación",
        "rcfilters-filter-minor-label": "Ediciones menores",
        "rcfilters-filter-minor-description": "Ediciones etiquetadas por el autor como menores.",
        "listgrouprights-addgroup-all": "Agregar todos los grupos",
        "listgrouprights-removegroup-all": "Eliminar todos los grupos",
        "listgrouprights-addgroup-self": "Agregar {{PLURAL:$2|grupo|grupos}} a tu propia cuenta: $1",
-       "listgrouprights-removegroup-self": "Eliminar {{PLURAL:$2|grupo|grupos}} de tu propia cuenta: $1",
+       "listgrouprights-removegroup-self": "Eliminar {{PLURAL:$2|grupo|grupos}} de su propia cuenta: $1",
        "listgrouprights-addgroup-self-all": "Agregar todos los grupos a tu propia cuenta",
        "listgrouprights-removegroup-self-all": "Eliminar todos los grupos de tu propia cuenta",
        "listgrouprights-namespaceprotection-header": "Restricciones del espacio de nombres",
        "protect-cascadeon": "Actualmente esta página está protegida porque está transcluida en {{PLURAL:$1|la siguiente página, que tiene|las siguientes páginas, que tienen}} activada la opción de protección de cascada.\nPuedes cambiar el nivel de protección de esta página, pero no afectará a la protección de cascada.",
        "protect-default": "Permitir todos los usuarios",
        "protect-fallback": "Solo permitir usuarios con el permiso «$1»",
-       "protect-level-autoconfirmed": "Solo permitir usuarios autoconfirmados",
-       "protect-level-sysop": "Solo permitir administradores",
+       "protect-level-autoconfirmed": "Solo usuarios autoconfirmados",
+       "protect-level-sysop": "Solo administradores",
        "protect-summary-cascade": "en cascada",
        "protect-expiring": "caduca el $1 (UTC)",
        "protect-expiring-local": "caduca el $1",
        "undeleteviewlink": "ver",
        "undeleteinvert": "Invertir selección",
        "undeletecomment": "Razón:",
-       "undeletedrevisions": "{{PLURAL:$1|Una revisión restaurada|$1 revisiones restauradas}}",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 revisión|$1 revisiones}} y {{PLURAL:$2|1 archivo|$2 archivos}} restaurados",
-       "undeletedfiles": "$1 {{PLURAL:$1|archivo restaurado|archivos restaurados}}",
        "cannotundelete": "Hubo un error en la totalidad o en parte del proceso de la restauración:\n$1",
        "undeletedpage": "<strong>Se ha restaurado $1</strong>\n\nConsulta el [[Special:Log/delete|registro de borrados]] para ver una lista de los últimos borrados y restauraciones.",
        "undelete-header": "En el [[Special:Log/delete|registro de borrados]] se listan las páginas eliminadas.",
        "newimages-summary": "Esta página especial muestra una galería de los últimos archivos subidos.",
        "newimages-legend": "Filtro",
        "newimages-label": "Nombre del archivo (o una parte):",
+       "newimages-user": "Dirección IP o nombre de usuario",
        "newimages-showbots": "Mostrar cargas de bots",
        "newimages-hidepatrolled": "Ocultar las subidas verificadas",
        "noimages": "No hay nada que ver.",
        "htmlform-user-not-valid": "<strong>$1</strong> no es un nombre de usuario válido.",
        "logentry-delete-delete": "$1 {{GENDER:$2|borró}} la página $3",
        "logentry-delete-delete_redir": "$1 {{GENDER:$2|borró}} la redirección $3 con un traslado",
-       "logentry-delete-restore": "$1 restauró la página «$3»",
+       "logentry-delete-restore": "$1 {{GENDER:$2|restauró}} la página $3 ($4)",
+       "logentry-delete-restore-nocount": "$1 {{GENDER:$2|restauró}} la página $3",
+       "restore-count-revisions": "{{PLURAL:$1|1 revisión|$1 revisiones}}",
+       "restore-count-files": "{{PLURAL:$1|1 archivo|$1 archivos}}",
        "logentry-delete-event": "$1 {{GENDER:$2|modificó}} la visibilidad de {{PLURAL:$5|un evento|$5 eventos}} del registro en $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|modificó}} la visibilidad de {{PLURAL:$5|una revisión |$5 revisiones}} en la página  $3: $4",
        "logentry-delete-event-legacy": "$1 ha {{GENDER:$2|cambiado}} la visibilidad de eventos del registro en $3",
        "logentry-suppress-event-legacy": "$1 {{GENDER:$2|modificó}} secretamente la visibilidad de los eventos del registro en $3",
        "logentry-suppress-revision-legacy": "$1 {{GENDER:$2|modificó}} secretamente la visibilidad de las revisiones en la página $3",
        "revdelete-content-hid": "contenido ocultado",
-       "revdelete-summary-hid": "resumen de edición oculto",
+       "revdelete-summary-hid": "resumen de edición ocultado",
        "revdelete-uname-hid": "nombre de usuario ocultado",
        "revdelete-content-unhid": "contenido mostrado",
        "revdelete-summary-unhid": "resumen de edición mostrado",
        "revdelete-restricted": "restricciones para administradores aplicadas",
        "revdelete-unrestricted": "restricciones para administradores eliminadas",
        "logentry-block-block": "$1 {{GENDER:$2|bloqueó}} a {{GENDER:$4|$3}} durante un plazo de $5 $6",
-       "logentry-block-unblock": "$1 {{GENDER:$2|desbloqueó}} {{GENDER:$4|$3}}",
+       "logentry-block-unblock": "$1 {{GENDER:$2|desbloqueó}} {{GENDER:$4|$3}}",
        "logentry-block-reblock": "$1 {{GENDER:$2|cambió}} la configuración del bloqueo de {{GENDER:$4|$3}} durante un plazo de $5 $6",
-       "logentry-suppress-block": "$1 {{GENDER:$2|bloqueó}} {{GENDER:$4|$3}} durante un plazo de $5 $6",
+       "logentry-suppress-block": "$1 {{GENDER:$2|bloqueó a}} {{GENDER:$4|$3}} durante un plazo de $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|cambió}} la configuración del bloqueo de {{GENDER:$4|$3}} durante un plazo de $5 $6",
        "logentry-import-upload": "$1 {{GENDER:$2|importó}} $3 subiendo un archivo",
        "logentry-import-upload-details": "$1 {{GENDER:$2|importó}} $3 subiendo un archivo ($4 {{PLURAL:$4|revisión|revisiones}})",
        "logentry-newusers-autocreate": "Se ha {{GENDER:$2|creado}} automáticamente la cuenta de {{GENDER:$4|usuario|usuaria}} $1",
        "logentry-protect-move_prot": "$1 {{GENDER:$2|trasladó}} las preferencias de protección de $4 a $3",
        "logentry-protect-unprotect": "$1 {{GENDER:$2|eliminó}} la protección de $3",
-       "logentry-protect-protect": "$1 {{GENDER:$2|protegió}} $3 $4",
-       "logentry-protect-protect-cascade": "$1 {{GENDER:$2|protegió}} a $3 $4 [en cascada]",
+       "logentry-protect-protect": "$1 {{GENDER:$2|protegió}} la página $3 $4",
+       "logentry-protect-protect-cascade": "$1 {{GENDER:$2|protegió}} la página $3 $4 [en cascada]",
        "logentry-protect-modify": "$1 {{GENDER:$2|cambió}} el nivel de protección de $3 $4",
        "logentry-protect-modify-cascade": "$1 {{GENDER:$2|cambió}} el nivel de protección de $3 $4 [en cascada]",
        "logentry-rights-rights": "$1 {{GENDER:$2|modificó}} los grupos a los que pertenece {{GENDER:$6|$3}}: de $4 a $5",
        "restrictionsfield-label": "Intervalos de IP permitidos:",
        "restrictionsfield-help": "Una dirección IP o intervalo de CIDR por renglón. Para activarlo todo, utiliza <pre>0.0.0.0/0\n::/0</pre>",
        "revid": "revisión $1",
-       "pageid": "ID de página $1"
+       "pageid": "ID de página $1",
+       "gotointerwiki": "Salir de {{SITENAME}}",
+       "gotointerwiki-invalid": "El título especificado no es válido."
 }
index 28a2d34..9daa40e 100644 (file)
        "page_first": "esimene",
        "page_last": "viimane",
        "histlegend": "Märgi versioonid, mida tahad võrrelda ja vajuta võrdlemisnupule.\nLegend: (viim) = erinevused võrreldes viimase redaktsiooniga,\n(eel) = erinevused võrreldes eelmise redaktsiooniga, P = pisimuudatus",
-       "history-fieldset-title": "Ajaloo sirvimine",
+       "history-fieldset-title": "Redaktsioonide otsimine",
        "history-show-deleted": "Üksnes kustutatud redaktsioonid",
        "histfirst": "vanimad",
        "histlast": "uusimad",
        "right-createpage": "Luua lehekülgi (mis pole aruteluleheküljed)",
        "right-createtalk": "Luua arutelulehekülgi",
        "right-createaccount": "Luua uusi kasutajakontosid",
+       "right-autocreateaccount": "Automaatselt välise kasutajakontoga sisse logida",
        "right-minoredit": "Märkida muudatusi pisimuudatusteks",
        "right-move": "Teisaldada lehekülgi",
        "right-move-subpages": "Teisaldada lehekülgi koos nende alamlehtedega",
        "action-createpage": "seda lehekülge luua",
        "action-createtalk": "seda arutelulehekülge luua",
        "action-createaccount": "seda kasutajakontot luua",
+       "action-autocreateaccount": "välise kasutajakontoga automaatselt sisse logida",
        "action-history": "vaadata selle lehekülje ajalugu",
        "action-minoredit": "seda muudatust pisimuudatuseks märkida",
        "action-move": "seda lehekülge teisaldada",
        "action-move-rootuserpages": "teisaldada kasutajalehekülgi",
        "action-move-categorypages": "teisaldada kategoorialehekülgi",
        "action-movefile": "seda faili teisaldada",
-       "action-upload": "seda faili üles laadida",
+       "action-upload": "faile üles laadida",
        "action-reupload": "seda olemasolevat faili üle kirjutada",
        "action-reupload-shared": "seda jagatud varamus asuvat faili üle kirjutada",
        "action-upload_by_url": "seda faili internetiaadressilt üles laadida",
        "newimages-summary": "Sellel erilehel on viimati üles laaditud failid.",
        "newimages-legend": "Filter",
        "newimages-label": "Failinimi (või selle osa):",
+       "newimages-user": "IP-aadress või kasutajanimi",
        "newimages-showbots": "Näita robotite üles laaditud faile",
        "newimages-hidepatrolled": "Peida kontrollitud failid",
        "noimages": "Uusi pilte ei ole.",
        "pagelang-language": "Keel",
        "pagelang-use-default": "Kasuta vaikekeelt",
        "pagelang-select-lang": "Vali keel",
+       "pagelang-reason": "Põhjus",
+       "pagelang-submit": "Saada",
+       "pagelang-nonexistent-page": "Lehekülge $1 pole olemas.",
+       "pagelang-unchanged-language": "Lehekülje $1 keeleks on juba määratud \"$2\".",
+       "pagelang-unchanged-language-default": "Lehekülje $1 keeleks on juba määratud viki sisu vaikekeel.",
+       "pagelang-db-failed": "Andmebaasis ei õnnestunud lehekülje keelt muuta.",
        "right-pagelang": "Muuta lehekülje keelt",
        "action-pagelang": "muuta lehekülje keelt",
        "log-name-pagelang": "Keele muutmise logi",
        "log-action-filter-suppress-reblock": "Kasutaja varjamine taasblokeerimise teel",
        "log-action-filter-upload-upload": "Uus üleslaadimine",
        "log-action-filter-upload-overwrite": "Uuesti üleslaadimine",
+       "authmanager-authn-not-in-progress": "Autentimine pole teoksil või seansiandmed läksid kaduma. Palun alusta uuesti.",
+       "authmanager-authn-no-primary": "Ette antud autentimisandmeid ei õnnestunud autentida.",
+       "authmanager-authn-no-local-user": "Ette antud autentimisandmed pole selles vikis seotud ühegi kasutajaga.",
+       "authmanager-authn-no-local-user-link": "Ette antud autentimisandmeid on kehtivad, aga pole selles vikis seotud ühegi kasutajaga. Logi sisse muul viisil või loo uus kasutajakonto, et saaksid siduda oma varasemad autentimisandmed selle kontoga.",
+       "authmanager-authn-autocreate-failed": "Kohaliku konto automaatne loomine ebaõnnestus: $1",
+       "authmanager-change-not-supported": "Ette antud autentimisandmeid ei õnnestunud muuta, kuna neil poleks edaspidi ühtegi kasutajat.",
+       "authmanager-create-disabled": "Kontode loomine on keelatud.",
+       "authmanager-create-from-login": "Et luua konto, täida palun väljad.",
+       "authmanager-create-not-in-progress": "Konto loomine pole teoksil või läksid seansiandmed kaduma. Palun alusta uuesti.",
+       "authmanager-create-no-primary": "Ette antud autentimisandmetega ei õnnestunud kontot luua.",
+       "authmanager-link-no-primary": "Ette antud autentimisandmetega ei õnnestunud kontot linkida.",
+       "authmanager-link-not-in-progress": "Konto linkimine pole teoksil või läksid seansiandmed kaduma. Palun alusta uuesti.",
+       "authmanager-authplugin-setpass-failed-title": "Parooli muutmine ebaõnnestus",
+       "authmanager-authplugin-setpass-failed-message": "Autentimise tarkvaralisa keeldus parooli muutmast.",
+       "authmanager-authplugin-create-fail": "Autentimise tarkvaralisa keeldus kontot loomast.",
+       "authmanager-authplugin-setpass-denied": "Autentimise tarkvaralisa ei luba paroole muuta.",
+       "authmanager-authplugin-setpass-bad-domain": "Vigane domeen.",
+       "authmanager-autocreate-noperm": "Kontode automaatne loomine pole lubatud.",
+       "authmanager-autocreate-exception": "Kontode automaatne loomine on varasemate tõrgete tõttu ajutiselt keelatud.",
+       "authmanager-userdoesnotexist": "Kasutajakonto \"$1\" pole registreeritud.",
+       "authmanager-userlogin-remembermypassword-help": "Kas parooli tuleks meeles pidada kauem kui seansi kestel.",
+       "authmanager-username-help": "Autentitav kasutajanimi.",
+       "authmanager-password-help": "Autentitav parool.",
+       "authmanager-domain-help": "Väliselt autentitav domeen.",
+       "authmanager-retype-help": "Uuesti parool, mida kinnitada.",
+       "authmanager-email-label": "E-post",
+       "authmanager-email-help": "E-posti aadress",
+       "authmanager-realname-label": "Pärisnimi",
+       "authmanager-realname-help": "Kasutaja pärisnimi",
        "authmanager-provider-password": "Paroolipõhine autentimine",
        "authmanager-provider-password-domain": "Parooli- ja domeenipõhine autentimine",
        "authmanager-provider-temporarypassword": "Ajutine parool",
+       "authprovider-confirmlink-message": "Sinu viimaste sisselogimiskatsete põhjal saab sinu vikikontoga linkida järgmiseid kontosid. Linkimine võimaldab sisse logida nende kontode kaudu. Palun vali, millised kontod tuleks linkida.",
+       "authprovider-confirmlink-request-label": "Kontod, mis tuleks linkida",
+       "authprovider-confirmlink-success-line": "$1: Edukalt lingitud.",
+       "authprovider-confirmlink-failed": "Konto linkimine ei õnnestunud täielikult: $1",
+       "authprovider-confirmlink-ok-help": "Jätka pärast linkimise nurjumissõnumite kuvamist.",
+       "authprovider-resetpass-skip-label": "Jäta vahele",
+       "authprovider-resetpass-skip-help": "Jäta parooli lähtestamine vahele.",
+       "authform-nosession-login": "Autentimine oli edukas, aga brauseril ei õnnestunud meeles pidada, et oled sisse logitud.\n\n$1",
+       "authform-nosession-signup": "Konto on loodud, aga brauseril ei õnnestunud meeles pidada, et oled sisse logitud.\n\n$1",
+       "authform-newtoken": "Luba puudub. $1",
+       "authform-notoken": "Luba puudub",
+       "authform-wrongtoken": "Vale luba",
+       "specialpage-securitylevel-not-allowed-title": "Pole lubatud",
+       "specialpage-securitylevel-not-allowed": "Kahjuks ei lubata sul seda lehekülge kasutada, kuna sinu identiteeti ei õnnestunud tõestada.",
+       "authpage-cannot-login": "Sisselogimisega ei õnnestu alustada.",
+       "authpage-cannot-login-continue": "Sisselogimisega ei õnnestu jätkata. Suure tõenäosusega on sinu seansi ajalõpp möödunud.",
+       "authpage-cannot-create": "Konto loomisega ei õnnestu alustada.",
+       "authpage-cannot-create-continue": "Konto loomisega ei õnnestu jätkata. Suure tõenäosusega on sinu seansi ajalõpp möödunud.",
+       "authpage-cannot-link": "Konto linkimisega ei õnnestu alustada.",
+       "authpage-cannot-link-continue": "Konto linkimisega ei õnnestu jätkata. Suure tõenäosusega on sinu seansi ajalõpp möödunud.",
        "changecredentials": "Autentimisandmete muutmine",
        "changecredentials-submit": "Muuda autentimisandmed",
        "changecredentials-success": "Sinu autentimisandmed on muudetud.",
        "removecredentials-success": "Sinu autentimisandmed on eemaldatud.",
        "credentialsform-provider": "Andmete tüüp:",
        "credentialsform-account": "Konto nimi:",
+       "authenticationdatachange-ignored": "Autentimisandmete muutmine jäi rahuldamata. Võimalik, et ühtegi pakkujat polnud häälestatud.",
        "userjsispublic": "Pea silmas, et JavaScripti alamleheküljed ei tohiks sisaldada konfidentsiaalseid andmeid, kuna neid näevad teised kasutajad.",
+       "usercssispublic": "Palun pane tähele: CSS-alamleheküljel ei peaks olema konfidentsiaalseid andmeid, kuna teised kasutajad näevad seda.",
        "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 järgmist süntaksit:<pre>0.0.0.0/0\n::/0</pre>"
+       "restrictionsfield-help": "Üks IP-aadress või CIDR-vahemik rea kohta. Et lubada kõik, kasuta järgmist süntaksit:<pre>0.0.0.0/0\n::/0</pre>",
+       "revid": "redaktsioon $1",
+       "pageid": "lehekülje identifikaator $1"
 }
index b0b5e1f..bce9bf8 100644 (file)
@@ -27,7 +27,8 @@
                        "Asierog",
                        "Matma Rex",
                        "Gorkaazk",
-                       "Vriullop"
+                       "Vriullop",
+                       "Osoitz"
                ]
        },
        "tog-underline": "Azpimarratu loturak:",
        "no-null-revision": "Ezin izan da \"$1\" orrialdearen berrikuspen huts bat sortu",
        "badtitle": "Izenburu ezegokia",
        "badtitletext": "Eskatutako orri izenburua ez da baliozkoa, hutsik dago, edo gaizki lotutako hizkuntzen arteko lotura da. Baliteke izenburuetan erabili ezin den karaktereren bat edukitzea.",
+       "title-invalid-talk-namespace": "Eskatutako orriaren izenburuak agian existitzen ez den eztabaida-orri bati egiten dio erreferentzia.",
+       "title-invalid-characters": "Eskatutako orriaren izenburuak baliagarri ez diren karaktereak ditu: \"$1\".",
        "perfcached": "Hurrengo datuak katxean gordeta daude eta litekeena da guztiz eguneratuta ez egotea. Gehienez {{PLURAL:$1|emaitza 1 dago|$1 emaitza daude}} eskuragarri katxean.",
        "perfcachedts": "Hurrengo datuak katxean daude, $1 eguneratu zen azkenekoz. {{PLURAL:$4|emaitza 1 dago|$4 emaitza daude}} eskuragarri katxean.",
        "querypage-no-updates": "Orrialde honen berritzeak ez dira baimentzen. Hemen dagoen data ez da zuzenean berrituko.",
        "cannotloginnow-title": "Ezin da saioa hasi orain",
        "cannotloginnow-text": "Saioa ezin da hasi $1 erabiltzean.",
        "cannotcreateaccount-title": "Kontuak ezin dira sortu",
+       "cannotcreateaccount-text": "Wiki honetan ezin da zuzenean kontu berri bat sortu.",
        "yourdomainname": "Zure domeinua",
        "password-change-forbidden": "Ezin duzu pasahitzarik aldatu wiki honetan.",
        "externaldberror": "Kanpoko datu-base autentifikazio errorea gertatu da edo ez duzu zure kanpo kontua eguneratzeko baimenik.",
        "login": "Hasi saioa",
        "login-security": "Zure nortasuna egiaztatu",
        "nav-login-createaccount": "Hasi saioa / sortu kontua",
-       "userlogin": "Saioa hasi / kontua sortu",
-       "userloginnocreate": "Hasi saioa",
        "logout": "Saioa itxi",
        "userlogout": "Saioa itxi",
        "notloggedin": "Saioa hasi gabe",
        "userlogin-noaccount": "Ez al duzu konturik?",
        "userlogin-joinproject": "Batu {{SITENAME}}(r)ekin",
-       "nologin": "Ez duzu erabiltzaile konturik? '''$1'''.",
-       "nologinlink": "Kontua sortu",
        "createaccount": "Kontua sortu",
-       "gotaccount": "Baduzu erabiltzaile kontua? '''$1'''.",
-       "gotaccountlink": "Hasi saioa",
-       "userlogin-resetlink": "Saioa hasteko datuak ahaztu dituzu?",
        "userlogin-resetpassword-link": "Zure pasahitza ahaztu duzu?",
        "userlogin-helplink2": "Saioa hasteko laguntza",
        "userlogin-loggedin": "Dagoeneko izena emana zaude {{GENDER:$1|$1}}.\nBeheko formularioa erabil ezazu beste erabiltzaile baten izenean sartzeko.",
+       "userlogin-reauth": "Saioa berriro hasi beharko duzu {{GENDER:$1|$1}} zarela baieztatzeko.",
        "userlogin-createanother": "Beste kontu bat sortu",
        "createacct-emailrequired": "E-posta helbidea",
        "createacct-emailoptional": "E-posta helbidea (hautazkoa)",
        "createacct-email-ph": "Sartu zure e-posta helbidea",
        "createacct-another-email-ph": "Posta elektronikoaren helbidea sartu",
        "createaccountmail": "Erabili behin-behineko pasahitz ausazko bat eta bidali agertzen den e-posta helbidera",
+       "createaccountmail-help": "Beste pertsona batentzat kontu berri bat sortzeko erabil daiteke, pasahitza ikasi gabe.",
        "createacct-realname": "Benetako izena (hautazkoa)",
-       "createaccountreason": "Arrazoia:",
        "createacct-reason": "Arrazoia",
        "createacct-reason-ph": "Zergatik ari zaren beste erabiltzaile kontu bat",
        "createacct-submit": "Kontua sortu",
        "botpasswords-label-cancel": "Utzi",
        "botpasswords-label-delete": "Ezabatu",
        "botpasswords-label-resetpassword": "Pasahitza berrezarri",
+       "botpasswords-label-grants-column": "Baimenduta",
+       "botpasswords-bad-appid": "Bot horren \"$1\" izen hori ez da baliagarria.",
+       "botpasswords-insert-failed": "Ezin izan da bot \"$1\" izen hori gehitu. Dagoeneko gehituta zegoen?",
        "resetpass_forbidden": "Ezin dira pasahitzak aldatu",
        "resetpass-no-info": "Orrialde honetara zuzenean sartzeko izena eman behar duzu.",
        "resetpass-submit-loggedin": "Pasahitza aldatu",
        "prefs-diffs": "Ezberdintasunak",
        "prefs-help-prefershttps": "Hobespen hauek eragina izango dute sartzen zaren hurrengoan.",
        "prefs-tabs-navigation-hint": "Gomendioa: Fitxen zerrendan nabigatzeko ezker eta eskuin geziak erabil ditzakezu.",
-       "userrights": "Erabiltzaile baimenen kudeaketa",
+       "userrights": "Erabiltzaile-baimenak",
        "userrights-lookup-user": "Erabiltzailea aukeratu",
        "userrights-user-editname": "Erabiltzaile izena idatzi:",
        "editusergroup": "Erabiltzaile taldeak kargatu",
        "undeleteviewlink": "ikusi",
        "undeleteinvert": "Alderanztu aukera",
        "undeletecomment": "Arrazoia:",
-       "undeletedrevisions": "{{PLURAL:$1|Berrikuspen 1 leheneratu da|$1 berrikuspen leheneratu dira}}",
-       "undeletedrevisions-files": "{{PLURAL:$1|berrikuspen|berrikuspen}} eta {{PLURAL:$2|fitxategi|fitxategi}} leheneratu dira",
-       "undeletedfiles": "{{PLURAL:$1|fitxategi|fitxategi}} leheneratu dira",
        "cannotundelete": "Ezabatutako birgaitze betean edo hainbatetan akatsa: $1",
        "undeletedpage": "'''«$1» leheneratu da'''\n\nAzken ezabatze eta leheneratzeak ikusteko, jo ezazu [[Special:Log/delete|ezabaketa erregistrora]].",
        "undelete-header": "Berriki ezabatutako orriak ikusteko, jo ezazu [[Special:Log/delete|ezabaketa erregistrora]].",
        "htmlform-user-not-valid": "<strong>$1</strong> erabiltzaile izena ezin da erabili.",
        "logentry-delete-delete": "$1 {{GENDER:$2|wikilariak}} «$3» orria ezabatu du",
        "logentry-delete-restore": "$1 administratzaileak «$3» orria {{GENDER:$2|lehengoratu}} du",
-       "logentry-delete-event": "$1 wikilariak ikusgaitasuna {{{{GENDER:$2|}}|aldatu}} {{PLURAL:$5|dio erregistroko sarrera bati|die erregistroko $5 sarrerari}}, $3 orrian: $4",
+       "logentry-delete-event": "$1 wikilariak ikusgaitasuna {{GENDER:$2|aldatu}} {{PLURAL:$5|dio erregistroko sarrera bati|die erregistroko $5 sarrerari}}, $3 orrian: $4",
        "logentry-delete-revision": "$1 erabiltzaileak {{PLURAL:$5|berrikuste baten|$5 berrikusteren}} ikusgaitasuna aldatu du «$3» orrian: $4",
-       "logentry-suppress-delete": "$1 erabiltzaileak $3 orrialdea {{GENDER:$2|ezabatu}} du",
+       "logentry-suppress-delete": "$1 erabiltzaileak $3 orria {{GENDER:$2|ezabatu}} du",
        "logentry-suppress-event": "$1 wikilariak ezkutuan ikusgaitasuna aldatu {{PLURAL:$5|dio erregistroko sarrera bati|die erregistroko $5 sarrerari}}, «$3» orrian: $4",
        "revdelete-content-hid": "edukia ezkutatu da",
        "revdelete-summary-hid": "edizioaren laburpena ezkutatu da",
        "logentry-upload-upload": "$1(e)k $3 {{GENDER:$2|igo du}}",
        "log-name-tag": "Etiketen erregistroa",
        "rightsnone": "(bat ere ez)",
-       "revdelete-summary": "aldaketaren laburpena",
        "feedback-adding": "Orriari feedbacka gehitzen...",
        "feedback-back": "Atzera",
        "feedback-bugnew": "Txekeatu dut. Bug berria bidaliko",
index aa7e5e6..3769c68 100644 (file)
@@ -57,7 +57,8 @@
                        "4nn1l2",
                        "Namo",
                        "Alifakoor",
-                       "Dejavu"
+                       "Dejavu",
+                       "AzorAhai"
                ]
        },
        "tog-underline": "خط کشیدن زیر پیوندها:",
        "post-expand-template-argument-warning": "'''هشدار:''' این صفحه شامل دست کم یک پارامتر الگو است که بیش از اندازه بزرگ است.\nاین پارامترها نادیده گرفته شدند.",
        "post-expand-template-argument-category": "صفحه‌های حاوی الگوهایی با پارامترهای نادیده‌گرفته‌شده",
        "parser-template-loop-warning": "حلقه در الگو پیدا شد: [[$1]]",
+       "template-loop-category": "صفحه‌های دارای حلقه در الگو",
+       "template-loop-category-desc": "صفحه دارای حلقه در الگو، مثلا الگویی که از خودش درون خودش استفاده‌کرده‌است.",
        "parser-template-recursion-depth-warning": "محدودیت عمق بازگشت الگو رد شد ($1)",
        "language-converter-depth-warning": "محدودیت عمق مبدل زبانی رد شد ($1)",
        "node-count-exceeded-category": "صفحه‌هایی که از حداکثر تعداد گره تجاوز کرده‌اند",
        "page_first": "نخست",
        "page_last": "واپسین",
        "histlegend": "انتخاب تفاوت: دکمه‌های گرد کنار ویرایش‌هایی که می‌خواهید با هم مقایسه کنید را علامت بزنید و دکمهٔ Enter را بزنید یا دکمهٔ پایین را فشار دهید.<br />\nاختصارات: '''({{int:cur}})''' = تفاوت با نسخهٔ فعلی، '''({{int:last}})''' = تفاوت با نسخهٔ قبلی، '''({{int:minoreditletter}})''' = ویرایش جزئی.",
-       "history-fieldset-title": "مرور تاریخچه",
-       "history-show-deleted": "فقط حذف‌شده",
+       "history-fieldset-title": "جستجو برای نسخه‌ها",
+       "history-show-deleted": "فقط حذف‌شدهفقط نسخه‌های حذف شده",
        "histfirst": "قدیمی‌ترین",
        "histlast": "جدیدترین",
        "historysize": "({{PLURAL:$1|۱ بایت|$1 بایت}})",
        "recentchanges": "تغییرات اخیر",
        "recentchanges-legend": "گزینه‌های تغییرات اخیر",
        "recentchanges-summary": "آخرین تغییرات ویکی را در این صفحه پی‌گیری کنید.",
-       "recentchanges-noresult": "هیچ تغییری در طول دورهٔ تعیین‌شده با این معیارها هم‌خوانی نداشت.",
+       "recentchanges-noresult": "در فاصله زمانی ارائه شده هیچ تغییری با این معیارهای صورت نگرفته است",
        "recentchanges-feed-description": "آخرین تغییرات ویکی را در این خوراک پی‌گیری کنید.",
        "recentchanges-label-newpage": "این ویرایش صفحه‌ای تازه ایجاد کرد",
        "recentchanges-label-minor": "این یک ویرایش جزئی است",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (همچنین به [[Special:NewPages|فهرست صفحات تازه]] نگاه کنید)",
        "recentchanges-legend-plusminus": "(<em>±۱۲۳</em>)",
        "recentchanges-submit": "نمایش",
-       "rcfilters-activefilters": "Ù\81عاÙ\84â\80\8cکردÙ\86 Ù¾Ø§Ù\84اÛ\8cÙ\87â\80\8cÙ\87ا",
+       "rcfilters-activefilters": "پاÙ\84اÛ\8cÙ\87â\80\8cÙ\87اÛ\8c Ù\81عاÙ\84",
        "rcfilters-restore-default-filters": "بازگردانی پالایه‌های پیش‌فرض",
-       "rcfilters-clear-all-filters": "پاک‌کردن پالایش‌ها",
+       "rcfilters-clear-all-filters": "پاک‌کردن تمام پالایه‌ها",
        "rcfilters-search-placeholder": "پالایش تغییرات اخیر (جستجو یا شروع به تایپ)",
        "rcfilters-invalid-filter": "پالایهٔ نامعتبر",
        "rcfilters-empty-filter": "پالایه‌ای فعال نیست. همهٔ مشارکت‌های دیده می‌شوند.",
        "rcfilters-filterlist-title": "پالایه‌ها",
+       "rcfilters-filterlist-whatsthis": "این چیست؟",
        "rcfilters-filterlist-feedbacklink": "ارسال بازخورد برای پالایه‌های جدید (آزمایشی)",
        "rcfilters-highlightbutton-title": "پررنگ کردن نتایج",
        "rcfilters-highlightmenu-title": "انتخاب رنگ",
        "rcfilters-highlightmenu-help": "یک رنگ انتخاب کنید تا این خصوصیت پر رنگ شود",
        "rcfilters-filterlist-noresults": "پالایه‌ای یافت نشد",
-       "rcfilters-filtergroup-registration": "ثبت‌نام کاربر",
+       "rcfilters-noresults-conflict": "نتیجه‌ای یافت نشد چون محدودهٔ جستجو دارای تعارض است",
+       "rcfilters-state-message-subset": "این پالایه تاثیری ندارد چون نتایج آن توسط {{PLURAL:$2|پالایهٔ|پالایه‌های}} گسترده‌تری که در ادامه {{PLURAL:$2|آمده‌است|آمده‌اند}} شامل می‌شود (از پررنگ‌کننده برای تمایز استفاده کنید): $1",
+       "rcfilters-state-message-fullcoverage": "انتخاب تمام پالایه‌ها در یک گروه مثل این است که هیچ‌کدام را انتخاب نکنید، بنابراین پالایه‌ها اثری نداشتند. گروه شامل این موارد است: $1",
+       "rcfilters-filtergroup-registration": "ثبت نام کاربر",
        "rcfilters-filter-registered-label": "ثبت شده",
-       "rcfilters-filter-registered-description": "ورود ویرایشگران.",
+       "rcfilters-filter-registered-description": "ویرایشگران وارد شده به سامانه.",
        "rcfilters-filter-unregistered-label": "ثبت‌نام نکرده",
        "rcfilters-filter-unregistered-description": "ویرایشگرانی که به سامانه وارد نشده‌اند.",
-       "rcfilters-filter-unregistered-conflicts-user-experience-level": "پالایهٔ ثبت‌نشده غیرفعال می‌شود و تاثیرات آن توسط  {{PLURAL:$2|پالایه|پالایه‌های}} تجربه شده که فقط توسط کاربران ثبت‌نام شده {{PLURAL:$2|می‌یابد|می‌یابند}}:$1",
-       "rcfilters-filtergroup-authorship": "ویرایش نویسندگی",
-       "rcfilters-filter-editsbyself-label": "Ù\88Û\8cراÛ\8cØ´â\80\8cÙ\87اÛ\8c Ø´Ù\85ا",
-       "rcfilters-filter-editsbyself-description": "Ù\88Û\8cراÛ\8cØ´â\80\8cÙ\87اÛ\8c Ø§Ù\86جاÙ\85 Ø´Ø¯Ù\87 ØªÙ\88سط Ø´Ù\85ا.",
+       "rcfilters-filter-unregistered-conflicts-user-experience-level": "این پالایه با {{PLURAL:$2|پالایه|پالایه‌های}} تجربهٔ زیر که فقط کاربران ثبت‌نام شده را {{PLURAL:$2|می‌یابد|می‌یابند}} تعارض دارد: $1",
+       "rcfilters-filtergroup-authorship": "ویرایشگر",
+       "rcfilters-filter-editsbyself-label": "Ù\88Û\8cراÛ\8cØ´â\80\8cÙ\87اÛ\8c Ø®Ù\88دتاÙ\86",
+       "rcfilters-filter-editsbyself-description": "ویرایش‌های شما.",
        "rcfilters-filter-editsbyother-label": "ویرایش‌های دیگران",
-       "rcfilters-filter-editsbyother-description": "ویرایش‌های ایجاد شده توسط دیگران (نه شما).",
+       "rcfilters-filter-editsbyother-description": "ویرایش‌های ایجاد شده توسط دیگر کاربران (نه شما).",
        "rcfilters-filtergroup-userExpLevel": "درجهٔ تجربه (فقط برای کاربران ثبت‌نام کرده)",
-       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "این پالایه غیرفعال شد چون فقط کاربران ثبت‌نام کرده را پیدا می کرد در نتیجه پالایه کاربران ثبت‌نام نکرده تاثیرات آن را لغو می‌کند.",
-       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "پالایه کاربران ثبت‌نام نکرده با پالایه‌های دیگر در تعارض است. پالایه‌‌های دیگر فقط کاربران ثبت‌نام شده را می‌یابند. این پالایه‌های در تعارض در بالا غیرفعال شده‌اند.",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "پالایه‌های تجربه فقط کاربران ثبت‌نام کرده را پیدا می‌کنند، در نتیجه با پالایهٔ «کاربران ثبت‌نام نکرده» تعارض دارند.",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "پالایه «کاربران ثبت‌نام نکرده» با یک یا چند مورد از پالایه‌های تجربه در تعارض است. پالایه‌های دیگر در قسمت «پالایه‌های فعال» در بالا نشان داده شده‌اند.",
        "rcfilters-filter-user-experience-level-newcomer-label": "تازه‌واردها",
        "rcfilters-filter-user-experience-level-newcomer-description": "کمتر از ۱۰ ویرایش یا ۴ روز فعالیت.",
        "rcfilters-filter-user-experience-level-learner-label": "آموزندگان",
-       "rcfilters-filter-user-experience-level-learner-description": "فعالیت و تعداد روز بیشتر از تازه‌وارد ولی کمتر از کاربر باتجریه.",
+       "rcfilters-filter-user-experience-level-learner-description": "حجم و مدت فعالیت بیشتر از تازه‌واردان ولی کمتر از کاربران باتجریه.",
        "rcfilters-filter-user-experience-level-experienced-label": "کاربران باتجربه",
        "rcfilters-filter-user-experience-level-experienced-description": "بیشتر از ۳۰ روز فعالیت و ۵۰۰ ویرایش.",
        "rcfilters-filtergroup-automated": "ویرایش‌های خودکار",
        "rcfilters-filter-humans-description": "ویرایش توسط انسان.",
        "rcfilters-filtergroup-reviewstatus": "وضعیت بازبینی",
        "rcfilters-filter-patrolled-label": "گشت‌خورده",
-       "rcfilters-filter-patrolled-description": "برچسب ویرایش به عنوان گشت‌خورده.",
+       "rcfilters-filter-patrolled-description": "ویرایش‌های گشت‌خورده.",
        "rcfilters-filter-unpatrolled-label": "گشت‌نخورده",
-       "rcfilters-filter-unpatrolled-description": "ویرایش‌ها به عنوان گشت‌نخورده.",
+       "rcfilters-filter-unpatrolled-description": "ویرایش‌های گشت‌نخورده.",
        "rcfilters-filtergroup-significance": "اهمیت",
        "rcfilters-filter-minor-label": "ویرایش‌های جزئی",
        "rcfilters-filter-minor-description": "ویرایش‌هایی که به عنوان جزئی برچسب خورده‌اند.",
        "rcfilters-filter-newpages-label": "ایجاد صفحه",
        "rcfilters-filter-newpages-description": "ویرایش‌هایی که منجر به ایجاد صفحه شده‌اند.",
        "rcfilters-filter-categorization-label": "تغییرات رده",
-       "rcfilters-filter-categorization-description": "سیاههٔ صفحاتی که به رده افزوده یا حذف شده‌اند.",
+       "rcfilters-filter-categorization-description": "سوابق صفحه‌هایی که به رده‌ها افزوده یا حذف شده‌اند.",
        "rcfilters-filter-logactions-label": "سیاههٔ فعالیت‌ها",
        "rcfilters-filter-logactions-description": "فعالیت‌های مدیریتی، ایجاد حساب، حذف صفحه، بارگذاری‌ها ....",
+       "rcfilters-hideminor-conflicts-typeofchange-global": "پالایهٔ «ویرایش جزئی» با یک یا چند تا از پالایه‌های «نوع تغییرات» تعارض دارد چرا که برخی از انواع تغییرات را نمی‌توان به عنوان «جزئی» علامت زد. پالایه‌های دیگر در قسمت «پالایه‌های فعال» در بالا نشان داده شده‌اند.",
+       "rcfilters-hideminor-conflicts-typeofchange": "برخی از انواع تغییرات را نمی‌توان به عنوان «جزئی» علامت زد، به همین خاطر این پالایه با پالایه‌های «نوع تغییرات» که در ادامه آمده در تعارض است: $1",
+       "rcfilters-typeofchange-conflicts-hideminor": "این پالایهٔ «نوع تغییرات» با پالایهٔ «تغییرات جزئی» در تعارض است. برخی از انواع تغییرات را نمی‌توان به عنوان «جزئی» علامت زد.",
        "rcnotefrom": "در زیر تغییرات از <strong>$3, $4</strong> (تا <strong>$1</strong> {{PLURAL:$5|نشان داده شده‌است|نشان داده شده‌اند}}).",
+       "rclistfromreset": "از نو کردن انتخاب تاریخ",
        "rclistfrom": "نمایش تغییرات تازه با شروع از $3 $2",
        "rcshowhideminor": "$1 ویرایش‌های جزئی",
        "rcshowhideminor-show": "نمایش",
        "php-uploaddisabledtext": "بارگذاری پرونده‌های پی‌اچ‌پی غیرفعال است.\nلطفاً تنظیمات file_uploads را بررسی کنید.",
        "uploadscripted": "این صفحه حاوی کد اچ‌تی‌ام‌ال یا اسکریپتی است که ممکن است به‌نادرست توسط مرورگر وب تفسیر شود.",
        "upload-scripted-pi-callback": "نمی‌توان یک پرونده شامل دستورالعمل پردازش استایل‌شیت اکس‌ام‌ال بارگذاری کرد.",
+       "upload-scripted-dtd": "امکان بارگذاری پرونده‌های اس‌وی‌جی که حاوی تعارف دی‌تی‌دی غیر استاندارد باشند وجود ندارد.",
        "uploaded-script-svg": "عنصر قابل برنامه‌ریزی «$1» در پرونده بارگذاری اس‌وی‌جی یافت شد.",
        "uploaded-hostile-svg": "سی‌اس‌اس نا امن در عنصر سبک پروندهٔ بارگذاری شدهٔ اس‌وی‌جی یافت شد.",
        "uploaded-event-handler-on-svg": "قرار دادن ویژگی‌های مدیریت رویداد <code>$1=\"$2\"</code> در پرونده‌های اس‌وی‌جی مجاز نیست.",
        "undeleteviewlink": "نمایش",
        "undeleteinvert": "وارونه کردن انتخاب",
        "undeletecomment": "دلیل:",
-       "undeletedrevisions": "$1 نسخه احیا {{PLURAL:$1|شد}}",
-       "undeletedrevisions-files": "$1 نسخه و $2 پرونده احیا {{PLURAL:$1|شد|شدند}}.",
-       "undeletedfiles": "$1 پرونده احیا {{PLURAL:$1|شد|شدند}}.",
        "cannotundelete": "تمام یا بخشی از احیا ناموفق بود:\n$1",
        "undeletedpage": "'''$1 احیا شد'''\n\nبرای دیدن سیاههٔ حذف‌ها و احیاهای اخیر به  [[Special:Log/delete|سیاههٔ حذف]] رجوع کنید.",
        "undelete-header": "برای دیدن صفحه‌های حذف‌شدهٔ اخیر [[Special:Log/delete|سیاههٔ حذف]] را ببینید.",
        "newimages-summary": "این صفحهٔ ویژه آخرین پرونده‌های بارگذاری شده را نمایش می‌دهد",
        "newimages-legend": "پالودن",
        "newimages-label": "نام پرونده (یا قسمتی از آن):",
+       "newimages-user": "نشانی آی‌پی یا نام کاربری",
        "newimages-showbots": "نمایش بارگذاری‌ها توسط ربات‌ها",
        "newimages-hidepatrolled": "مخفی کردن بارگذاری گشت‌زن‌ها",
        "noimages": "چیزی برای دیدن نیست.",
        "htmlform-user-not-valid": "حساب کاربری <strong>$1</strong> معتبر نیست.",
        "logentry-delete-delete": "$1 صفحهٔ $3 را {{GENDER:$2|حذف کرد}}",
        "logentry-delete-delete_redir": "$1 تغییرمسیر $3 را با رونویسی {{GENDER:$2|حذف کرد}}",
-       "logentry-delete-restore": "$1 صفحهٔ $3 را {{GENDER:$2|احیا کرد}}",
+       "logentry-delete-restore": "$1 صفحهٔ $3 را {{GENDER:$2|احیا کرد}} ($4)",
+       "logentry-delete-restore-nocount": "$1 صفحهٔ $3 را {{GENDER:$2|احیا کرد}}",
+       "restore-count-revisions": "{{PLURAL:$1|یک نسخه|$1 نسخه}}",
+       "restore-count-files": "{{PLURAL:$1|یک پرونده|$1 پرونده}}",
        "logentry-delete-event": "$1 پیدایی {{PLURAL:$5|یک مورد سیاهه|$5 مورد سیاهه}} را در $3 {{GENDER:$2|تغییر داد}}: $4",
        "logentry-delete-revision": "$1 پیدایی {{PLURAL:$5|یک نسخه|$5 نسخه}} صفحه $3 را {{GENDER:$2|تغییر داد}}: $4",
        "logentry-delete-event-legacy": "$1 پیدایی موارد سیاهه را در $3 {{GENDER:$2|تغییر داد}}",
        "special-characters-group-thai": "تایلندی",
        "special-characters-group-lao": "لائو",
        "special-characters-group-khmer": "خمر",
+       "special-characters-group-canadianaboriginal": "بومی کانادا",
        "special-characters-title-endash": "خط فاصله",
        "special-characters-title-emdash": "خط فاسله کشیده",
        "special-characters-title-minus": "علامت منفی",
        "restrictionsfield-label": "بازه‌های آی‌پی مجاز:",
        "restrictionsfield-help": "یک نشانی آی‌پی یا بازهٔ سی‌آی‌دی‌ار در هر خط وارد کنید. برای فعال کردن همه‌چیز، این مقدار را استفاده کنید: <code>0.0.0.0/0</code><br /><code>::/0</code>",
        "revid": "نسخهٔ $1",
-       "pageid": "شناسهٔ صفحهٔ $1"
+       "pageid": "شناسهٔ صفحهٔ $1",
+       "rawhtml-notallowed": "برچسب‌های &lt;html&gt; را نمی‌توان خارج از صفحه‌های معمولی استفاده کرد.",
+       "gotointerwiki": "در حال ترک {{SITENAME}}",
+       "gotointerwiki-invalid": "عنوان مشخص شده غیرمجاز بود.",
+       "gotointerwiki-external": "شما در حال ترک {{SITENAME}} هستید تا [[$2]] را ببینید که یک وب‌گاه مجزا است.\n\n[$1 اینجا کلیک کنید تا به $1 بروید]",
+       "undelete-cantedit": "شما نمی‌توانید این صفحه را احیا کنید چون مجاز به ویرایش این صفحه نیستید.",
+       "undelete-cantcreate": "شما نمی‌توانید این صفحه را احیا کنید چرا که صفحه‌ای به این نام همینک وجود ندارد و شما مجاز به ساختن آن نیستید."
 }
index 1f3a4e6..1f7cde0 100644 (file)
        "prefs-help-prefershttps": "Tämä asetus tulee voimaan seuraavan sisäänkirjautumisesi yhteydessä.",
        "prefswarning-warning": "Olet tehnyt asetuksiisi muutoksia, joita ei ole vielä tallennettu.\nJos poistut sivulta klikkaamatta \"$1\", asetuksiasi ei päivitetä.",
        "prefs-tabs-navigation-hint": "Vihje: Voit käyttää vasenta ja oikeata nuolinäppäintä liikkumiseen välilehtien välillä.",
-       "userrights": "Käyttöoikeuksien hallinta",
+       "userrights": "Käyttäjän oikeudet",
        "userrights-lookup-user": "Valitse käyttäjä",
        "userrights-user-editname": "Käyttäjätunnus:",
        "editusergroup": "Lataa käyttäjäryhmät",
        "userrights-expiry-current": "Vanhentuu $1",
        "userrights-expiry-none": "Ei vanhene",
        "userrights-expiry": "Vanhentuu:",
-       "userrights-expiry-existing": "Nykyinen vanhentumisaika: $3, $2",
+       "userrights-expiry-existing": "Nykyinen vanhentumisaika: $2 kello $3",
        "userrights-expiry-othertime": "Muu aika:",
        "userrights-expiry-options": "1 päivä:1 day,1 viikko:1 week,1 kuukausi:1 month,3 kuukautta:3 months,6 kuukautta:6 months,1 vuosi:1 year",
        "userrights-conflict": "Päällekkäinen käyttöoikeuksien muutos! Tarkista tekemäsi muutokset ja vahvista ne.",
        "rcfilters-invalid-filter": "Suodatin on epäkelpo",
        "rcfilters-empty-filter": "Ei aktiivisia suodattimia. Kaikki muutokset näytetään.",
        "rcfilters-filterlist-title": "Suodattimet",
+       "rcfilters-filterlist-whatsthis": "Mikä tämä on?",
+       "rcfilters-highlightbutton-title": "Korosta tulokset",
        "rcfilters-highlightmenu-title": "Valitse väri",
        "rcfilters-filterlist-noresults": "Ei löytynyt suodattimia",
        "rcfilters-filtergroup-registration": "Käyttäjän rekisteröinti",
        "rcfilters-filter-editsbyself-description": "Muokkauksesi",
        "rcfilters-filter-editsbyother-label": "Muiden muokkaukset",
        "rcfilters-filter-editsbyother-description": "Muutokset jotka tehneet muut käyttäjät (et sinä).",
+       "rcfilters-filtergroup-userExpLevel": "Kokemustaso (vain rekisteröityneet käyttäjät)",
        "rcfilters-filter-user-experience-level-newcomer-label": "Tulokkaat",
+       "rcfilters-filter-user-experience-level-newcomer-description": "Vähemmän kuin 10 muokkausta ja 4 päivää aktiivisuutta.",
        "rcfilters-filter-user-experience-level-learner-label": "Oppijat",
        "rcfilters-filter-user-experience-level-experienced-label": "Kokeneet käyttäjät",
        "rcfilters-filter-user-experience-level-experienced-description": "Enemmän kuin 30 päivää aktiivisena ja 500 muokkausta.",
        "rcfilters-filter-bots-label": "Botti",
        "rcfilters-filter-bots-description": "Muokkaukset jotka tehty automaattisilla työkaluilla.",
        "rcfilters-filter-humans-label": "Ihminen (ei botti)",
+       "rcfilters-filter-humans-description": "Muokkaukset, jotka tehnyt ihmismuokkaajat.",
+       "rcfilters-filtergroup-reviewstatus": "Tarkistuksen tila",
        "rcfilters-filtergroup-significance": "Merkitys",
        "rcfilters-filter-minor-label": "Pienet muutokset",
        "rcfilters-filter-major-label": "Ei-pienet muutokset",
        "rcfilters-filtergroup-changetype": "Muutoksen tyyppi",
        "rcfilters-filter-pageedits-label": "Sivun muokkaukset",
        "rcfilters-filter-pageedits-description": "Muokkaukset wikin sisältöön, keskusteluihin, luokkakuvauksiin....",
+       "rcfilters-filter-newpages-label": "Sivujen luonnit",
        "rcfilters-filter-newpages-description": "Muokkaukset jotka luovat uusia sivuja.",
        "rcfilters-filter-categorization-label": "Luokkamuutokset",
        "rcfilters-filter-logactions-label": "Kirjatut toimet",
        "undeleteviewlink": "näytä",
        "undeleteinvert": "Käänteinen valinta",
        "undeletecomment": "Syy:",
-       "undeletedrevisions": "{{PLURAL:$1|Yksi versio|$1 versiota}} palautettiin",
-       "undeletedrevisions-files": "{{PLURAL:$1|Yksi versio|$1 versiota}} ja {{PLURAL:$2|yksi tiedosto|$2 tiedostoa}} palautettiin",
-       "undeletedfiles": "{{PLURAL:$1|1 tiedosto|$1 tiedostoa}} palautettiin",
        "cannotundelete": "Palauttaminen epäonnistui osittain tai kokonaan:\n$1",
        "undeletedpage": "'''$1 on palautettu.'''\n\n[[Special:Log/delete|Poistolokista]] löydät listan viimeisimmistä poistoista ja palautuksista.",
        "undelete-header": "[[Special:Log/delete|Poistolokissa]] on lista viimeisimmistä poistoista.",
        "newimages-summary": "Tällä toimintosivulla on viimeisimmät tallennetut tiedostot.",
        "newimages-legend": "Suodatin",
        "newimages-label": "Tiedostonimi (tai osa siitä)",
+       "newimages-user": "IP-osoite tai käyttäjänimi:",
        "newimages-showbots": "Näytä bottien tekemät tallennukset",
        "newimages-hidepatrolled": "Piilota tarkastetut tiedostotallennukset",
        "noimages": "Ei uusia tiedostoja.",
        "mediastatistics-table-count": "Tiedostojen lukumäärä",
        "mediastatistics-table-totalbytes": "Yhteenlaskettu koko",
        "mediastatistics-header-unknown": "Tuntematon",
-       "mediastatistics-header-bitmap": "Bitmap-kuvat",
+       "mediastatistics-header-bitmap": "Bittikarttakuvat",
        "mediastatistics-header-drawing": "Piirrokset (vektorikuvat)",
        "mediastatistics-header-audio": "Audio",
        "mediastatistics-header-video": "Videot",
index 72264e4..1f49bcc 100644 (file)
        "duplicate-args-category": "Pages utilisant des arguments dupliqués dans les appels de modèle",
        "duplicate-args-category-desc": "La page contient des appels de modèle qui utilisent des arguments dupliqués, comme <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> ou <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "<strong>Attention :</strong> cette page contient de trop nombreux appels à des fonctions coûteuses de l’analyseur syntaxique.\n\nIl devrait y avoir moins de $2 appel{{PLURAL:$2||s}}, alors qu’il y en a maintenant $1.",
-       "expensive-parserfunction-category": "Pages avec trop d'appels dispendieux de fonctions de l'analyseur syntaxique",
+       "expensive-parserfunction-category": "Pages avec trop d'appels dispendieux aux fonctions de l'analyseur syntaxique",
        "post-expand-template-inclusion-warning": "<strong>Attention :</strong> cette page contient trop d’inclusions de modèles. Certaines inclusions ne seront pas effectuées.",
        "post-expand-template-inclusion-category": "Pages contenant trop d'inclusions de modèles",
        "post-expand-template-argument-warning": "<strong>Attention :</strong> cette page contient au moins un paramètre de modèle dont la taille après expansion est trop importante. \nCes arguments n’ont donc pas été inclus.",
        "post-expand-template-argument-category": "Pages contenant des paramètres de modèle non évalués",
        "parser-template-loop-warning": "Modèle en boucle détecté : [[$1]]",
+       "template-loop-category": "Pages avec des boucles de modèle",
+       "template-loop-category-desc": "La page contient une boucle dans le modèle, c.à.d. un modèle qui s’appelle lui-même récursivement.",
        "parser-template-recursion-depth-warning": "Limite de profondeur des appels récursifs de modèles dépassée ($1)",
        "language-converter-depth-warning": "Limite de profondeur du convertisseur de langue dépassée ($1)",
        "node-count-exceeded-category": "Pages dépassant le nombre de nœuds maximal",
        "expansion-depth-exceeded-category": "Pages dépassant la profondeur d'expansion maximale",
        "expansion-depth-exceeded-category-desc": "La page dépasse la profondeur d’expansion maximale.",
        "expansion-depth-exceeded-warning": "Page dépassant la profondeur d’expansion maximale",
-       "parser-unstrip-loop-warning": "Boucle non démontable détectée",
-       "parser-unstrip-recursion-limit": "Limite de récursion non démontable dépassée ($1)",
+       "parser-unstrip-loop-warning": "Boucle non dépilable détectée",
+       "parser-unstrip-recursion-limit": "Limite de récursion non dépilable dépassée ($1)",
        "converter-manual-rule-error": "Erreur détectée dans la règle manuelle de conversion de langue",
        "undo-success": "Cette modification va être annulée.\nVeuillez vérifier les différences ci-dessous, puis publier l’annulation si c’est bien ce que vous voulez faire.",
        "undo-failure": "Cette modification ne peut pas être défaite : cela entrerait en conflit avec les modifications intermédiaires.",
        "page_first": "première",
        "page_last": "dernière",
        "histlegend": "Sélection du diff : cochez les boutons radio des versions à comparer et appuyez sur entrée ou sur le bouton en bas.<br />\nLégende : <strong>({{int:cur}})</strong> = différence avec la dernière version, <strong>({{int:last}})</strong> = différence avec la version précédente, <strong>{{int:minoreditletter}}</strong> = modification mineure.",
-       "history-fieldset-title": "Naviguer dans l’historique",
+       "history-fieldset-title": "Rechercher des révisions",
        "history-show-deleted": "Révision supprimée uniquement",
        "histfirst": "les plus anciennes",
        "histlast": "les plus récentes",
        "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.\n* Un dièse (#) indique que vous ne pouvez que rallonger le délai d'expiration du groupe et non pas le raccourcir.",
+       "userrights-groups-help": "Vous pouvez modifier les groupes auxquels appartient {{GENDER:$1|cet utilisateur|cette utilisatrice}} :\n* Une case cochée signifie que {{GENDER:$1|l’utilisateur|l’utilisatrice}} 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.\n* Un dièse (#) indique que vous ne pouvez que rallonger le délai d’expiration de l’appartenance au groupe et non pas le raccourcir.",
        "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-expiry-options": "1 jour:1 day,1 semaine:1 week,1 mois:1 month,3 mois:3 montghs,6 mois:6 month,1 an:1 year",
        "userrights-invalid-expiry": "La date d'expiration pour le groupe « $1 » n'est pas valide.",
        "userrights-expiry-in-past": "La date d'expiration pour le groupe « $1 » est dépassée.",
-       "userrights-cannot-shorten-expiry": "Vous ne pouvez pas rallonger la durée d'expiration du groupe « $1 ». Seuls les utilisateurs disposant de l'autorisation d'ajouter et de supprimer ce groupe peuvent rallonger les durées d'expiration.",
+       "userrights-cannot-shorten-expiry": "Vous ne pouvez pas raccourcir la durée d’expiration de l’appartenance au groupe « $1 ». Seuls les utilisateurs disposant de l’autorisation d’ajouter et de supprimer ce groupe peuvent raccourcir les durées d’expiration.",
        "userrights-conflict": "Conflit de modification des droits utilisateur ! Veuillez relire et confirmer vos modifications.",
        "group": "Groupe :",
        "group-user": "Utilisateurs",
        "rcfilters-invalid-filter": "Filtre non valide",
        "rcfilters-empty-filter": "Aucun filtre actif. Toutes les contributions sont affichées.",
        "rcfilters-filterlist-title": "Filtres",
+       "rcfilters-filterlist-whatsthis": "Qu’est-ce que c'est ?",
        "rcfilters-filterlist-feedbacklink": "Fournir un commentaire sur les nouveaux filtres (en bêta)",
        "rcfilters-highlightbutton-title": "Mettre en valeur les résultats",
        "rcfilters-highlightmenu-title": "Choisir une couleur",
        "rcfilters-highlightmenu-help": "Sélectionner une couleur pour mettre en évidence cette propriété",
        "rcfilters-filterlist-noresults": "Aucun filtre trouvé",
+       "rcfilters-noresults-conflict": "Aucun résultat trouvé car les critères de recherche sont en conflit",
+       "rcfilters-state-message-subset": "Ce filtre n'a aucun effet, parce que ses résultats sont inclus dans ceux de la recherche suivante, {{PLURAL:$2|filtre plus étendu|filtres plus étendus}} (essayez la mise en forme pour le différencier): $1",
+       "rcfilters-state-message-fullcoverage": "Sélectionner tous les filtres dans un groupe est la même chose que d'en sélectionner aucun, aussi ce filtre n'a aucun effet. Le groupe comprend: $1",
        "rcfilters-filtergroup-registration": "Inscription de l’utilisateur",
        "rcfilters-filter-registered-label": "Connectés",
        "rcfilters-filter-registered-description": "Éditeurs connectés.",
        "rcfilters-filter-unregistered-label": "Non connectés",
        "rcfilters-filter-unregistered-description": "Éditeurs qui ne sont pas connectés.",
-       "rcfilters-filter-unregistered-conflicts-user-experience-level": "Le filtre « Non inscrit » est inactif parce que son effet est annulé par {{PLURAL:$2|le filtre d’expérience suivant|les filtres d’expérience suivants}}, qui ne {{PLURAL:$2|trouve|trouvent}} que des utilisateurs inscrits : $1",
+       "rcfilters-filter-unregistered-conflicts-user-experience-level": "Ce filtre est en conflit avec le{{PLURAL:$2| filtre|s filtres}}      Experience suivant, qui ne {{PLURAL:$2|trouve|trouvent}} que des utilisateurs inscrits : $1",
        "rcfilters-filtergroup-authorship": "Modifier la paternité",
        "rcfilters-filter-editsbyself-label": "Vos propres modifications",
        "rcfilters-filter-editsbyself-description": "Vos modifications.",
        "rcfilters-filter-editsbyother-label": "Modifications par d’autres.",
        "rcfilters-filter-editsbyother-description": "Modifications créées par d’autres utilisateurs (pas vous).",
        "rcfilters-filtergroup-userExpLevel": "Niveau d’expérience (uniquement pour les utilisateurs enregistrés)",
-       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "Ce filtre est désactivé car il ne recherche que les utilisateurs enregistrés, et le filtre \"Unregistered\" annule son effet.",
-       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "Le filtre « Non inscrit » est en conflit avec au moins un filtre d’expérience. Les filtres d’expérience trouvent uniquement des utilisateurs inscrits. Les filtres en conflit sont marqués comme inactifs ci-dessus.",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "Les filtres Experience ne trouvent que des utilisateurs enregistrés, et ce filtre est en conflit avec le filtre \"non enregistré\".",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "Le filtre \"non enregistrés\" est en conflit avec un ou plusieurs  filtres Expérience, qui ne trouvent que les utilisateurs inscrits seulement. Les filtres en conflit sont marqués dans le champ des filtres actifs, ci-dessus.",
        "rcfilters-filter-user-experience-level-newcomer-label": "Nouveaux arrivants",
        "rcfilters-filter-user-experience-level-newcomer-description": "Moins de 10 modifications et 4 jours d’activité.",
        "rcfilters-filter-user-experience-level-learner-label": "Apprentis",
        "rcfilters-filter-humans-description": "Modifications faites par des éditeurs humains.",
        "rcfilters-filtergroup-reviewstatus": "Etat de révision",
        "rcfilters-filter-patrolled-label": "Patrouillé",
-       "rcfilters-filter-patrolled-description": "Modifications marquées comme patrouillées.",
-       "rcfilters-filter-unpatrolled-label": "Non patrouillé",
-       "rcfilters-filter-unpatrolled-description": "Modifications non marquées comme patrouillées.",
+       "rcfilters-filter-patrolled-description": "Modifications marquées comme relues.",
+       "rcfilters-filter-unpatrolled-label": "Non relu",
+       "rcfilters-filter-unpatrolled-description": "Modifications non marquées comme étant relues.",
        "rcfilters-filtergroup-significance": "Signification",
        "rcfilters-filter-minor-label": "Modifications mineures",
        "rcfilters-filter-minor-description": "Modifications que l’auteur a marquées comme mineures.",
        "rcfilters-filter-categorization-description": "Enregistrements de pages ajoutées ou supprimées des catégories.",
        "rcfilters-filter-logactions-label": "Actions tracées",
        "rcfilters-filter-logactions-description": "Actions d’administration, créations de compte, suppression de pages, téléchargements…",
+       "rcfilters-hideminor-conflicts-typeofchange-global": "Le filtre « Modifications mineures » est en conflit avec au moins un filtre de Type de modification, parce que certains types de modification ne peuvent être marqués comme « mineurs ». Les filtres en conflit sont marqués dans la zone Filtres actifs ci-dessus.",
+       "rcfilters-hideminor-conflicts-typeofchange": "Certains types de modification ne peuvent pas être qualifiés de « mineurs », donc ce filtre est en conflit avec les filtres de Type de modification suivants : $1",
+       "rcfilters-typeofchange-conflicts-hideminor": "Ce filtre de Type de modification est en conflit avec le filtre « Modifications mineures ». Certains type sde modification ne peuvent pas être indiqués comme « mineurs ».",
        "rcnotefrom": "Ci-dessous {{PLURAL:$5|la modification effectuée|les modifications effectuées}} depuis le <strong>$3, $4</strong> (affichées jusqu’à <strong>$1</strong>).",
+       "rclistfromreset": "Réinitialiser la sélection de la date",
        "rclistfrom": "Afficher les nouvelles modifications depuis le $3 à $2",
        "rcshowhideminor": "$1 les modifications mineures",
        "rcshowhideminor-show": "Afficher",
        "php-uploaddisabledtext": "L'import de fichiers est désactivé en PHP. Vérifiez l'option de configuration file_uploads.",
        "uploadscripted": "Ce fichier contient du code HTML ou un script qui pourrait être interprété de façon incorrecte par un navigateur web.",
        "upload-scripted-pi-callback": "Impossible de charger un fichier qui contient des instructions de traitement de feuille de style XML.",
+       "upload-scripted-dtd": "Impossible de télécharger des fichiers SVG qui contiennent une déclaration de DTD non standard.",
        "uploaded-script-svg": "Élément scriptable « $1 » trouvé dans le fichier SVG téléchargé.",
        "uploaded-hostile-svg": "CSS non sûr trouvé dans l’élément style d’un fichier SVG téléversé.",
        "uploaded-event-handler-on-svg": "Fixer des attributs de gestionnaire d’événement <code>$1=\"$2\"</code> n’est pas autorisé dans les fichiers SVG.",
        "undeleteviewlink": "voir",
        "undeleteinvert": "Inverser la sélection",
        "undeletecomment": "Motif :",
-       "undeletedrevisions": "$1 {{PLURAL:$1|version restaurée|versions restaurées}}",
-       "undeletedrevisions-files": "$1 version{{PLURAL:$1||s}} et $2 fichier{{PLURAL:$2||s}} restauré{{PLURAL:$2||s}}",
-       "undeletedfiles": "$1 {{PLURAL:$1|fichier restauré|fichiers restaurés}}",
        "cannotundelete": "Certaines ou toutes les restaurations ont échoué :\n$1",
        "undeletedpage": "<strong>La page $1 a été restaurée.</strong>\n\nConsultez le [[Special:Log/delete|journal des suppressions]] pour obtenir la liste des récentes suppressions et restaurations.",
        "undelete-header": "Consultez le [[Special:Log/delete|journal des suppressions]] pour lister les pages récemment supprimées.",
        "newimages-summary": "Cette page spéciale affiche les derniers fichiers importés.",
        "newimages-legend": "Filtre",
        "newimages-label": "Nom du fichier (ou une partie de celui-ci) :",
+       "newimages-user": "Adresse IP ou nom d'utilisateur",
        "newimages-showbots": "Afficher les imports faits par des robots",
        "newimages-hidepatrolled": "Masquer les téléchargements patrouillés",
        "noimages": "Aucune image à afficher.",
        "confirmemail_sendfailed": "{{SITENAME}} n’a pas pu vous envoyer le courriel de confirmation.\nVeuillez vérifiez que votre adresse de courriel ne comprend aucun caractère incorrect.\n\nLe programme d’envoi de courriel a retourné l’indication suivante : $1",
        "confirmemail_invalid": "Code de confirmation incorrect.\nCelui-ci a peut-être expiré.",
        "confirmemail_needlogin": "Vous devez vous $1 pour confirmer votre adresse de courriel.",
-       "confirmemail_success": "Votre adresse de courriel a été confirmée.\nVous pouvez maintenant vous [[Special:UserLogin|{{MediaWiki:Loginreqlink}}]] et profiter du wiki.",
+       "confirmemail_success": "Votre adresse de courriel a été confirmée.\nVous pouvez maintenant vous [[Special:UserLogin|{{MediaWiki:Loginreqlink/fr}}]] et profiter du wiki.",
        "confirmemail_loggedin": "Votre adresse de courriel est maintenant confirmée.",
        "confirmemail_subject": "Confirmation d’adresse de courriel pour {{SITENAME}}",
        "confirmemail_body": "Quelqu’un, probablement vous, à partir de l’adresse IP $1,\na créé un compte « $2 » avec cette adresse de courriel sur le site {{SITENAME}}.\n\nPour confirmer que ce compte vous appartient vraiment et afin\nd’activer les fonctions de messagerie sur {{SITENAME}},\nveuillez suivre ce lien dans votre navigateur :\n\n$3\n\nSi vous n’avez *pas* créé ce compte, suivez le lien ci-dessous \npour annuler la confirmation de votre adresse courriel :\n\n$5\n\nCe code de confirmation expirera le $4.",
        "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 a {{GENDER:$2|supprimé}} la redirection vers $3 par écrasement",
-       "logentry-delete-restore": "$1 {{GENDER:$2|a restauré}} la page $3",
+       "logentry-delete-restore": "$1 {{GENDER:$2|a restauré}} la page $3 ($4)",
+       "logentry-delete-restore-nocount": "$1 {{GENDER:$2|a restauré}} la page $3",
+       "restore-count-revisions": "{{PLURAL:$1|1 révision|$1 révisions}}",
+       "restore-count-files": "{{PLURAL:$1|1 fichier|$1 fichiers}}",
        "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",
        "logentry-delete-event-legacy": "$1 {{GENDER:$2|a modifié}} la visibilité des événements du journal sur $3",
        "special-characters-group-thai": "thaï",
        "special-characters-group-lao": "laotien",
        "special-characters-group-khmer": "khmer",
+       "special-characters-group-canadianaboriginal": "Aborigène canadien",
        "special-characters-title-endash": "tiret demi-cadratin",
        "special-characters-title-emdash": "tiret cadratin",
        "special-characters-title-minus": "signe moins",
        "restrictionsfield-label": "Plages IP autorisées :",
        "restrictionsfield-help": "Une adresse IP ou une plage CIDR par ligne. Pour tout activer, utiliser <pre>0.0.0.0/0\n::/0</pre>",
        "revid": "version $1",
-       "pageid": "ID de page $1"
+       "pageid": "ID de page $1",
+       "rawhtml-notallowed": "Les balises &lt;html&gt; ne peuvent pas être utilisées en dehors des pages normales.",
+       "gotointerwiki": "Quitter {{SITENAME}}",
+       "gotointerwiki-invalid": "Le titre spécifié n’est pas valide.",
+       "gotointerwiki-external": "Vous allez quitter {{SITENAME}} pour visiter [[$2]], qui est un site web distinct.\n\n[$1 Cliquer ici pour continuer vers $1].",
+       "undelete-cantedit": "Vous ne pouvez pas annuler la suppression de cette page car vous n’êtes pas autorisé à la modifier.",
+       "undelete-cantcreate": "Vous ne pouvez pas annuler la suppression de cette page car il n’existe pas de page avec ce nom, et vous n’êtes pas autorisé à la créer."
 }
index 3ae9648..c809c76 100644 (file)
        "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",
        "nav-login-createaccount": "Connecter / créer un compte",
-       "userlogin": "Connecter / créer un compte",
        "logout": "Déconnecter",
        "userlogout": "Déconnecter",
        "notloggedin": "Pas connecté",
-       "nologin": "Vous avez pas de compte? '''$1'''.",
-       "nologinlink": "Créez un compte",
        "createaccount": "Créer un compte",
-       "gotaccount": "Vous avez un compte déjà? '''$1'''.",
-       "gotaccountlink": "Connectez",
-       "userlogin-resetlink": "Oublié vôtre détailes de log in?",
        "createacct-emailrequired": "Adresse d'email",
        "createacct-emailoptional": "Adresse d'email (optional)",
        "createacct-email-ph": "Entres t'adresse d'email",
        "createacct-another-email-ph": "Entres adresse d'email",
        "createaccountmail": "par e-mail",
-       "createaccountreason": "Raison:",
        "createacct-reason": "Raison",
        "createacct-reason-ph": "Pourquoi crées-tu un autre compte",
        "badretype": "Les mots de passe que vous avez mis sont pas pareils.",
        "resetpass-temp-password": "Mot de passe temporaire:",
        "passwordreset-username": "Nom d'useur:",
        "passwordreset-domain": "Domaine:",
-       "passwordreset-capture": "Regarder l'email résultant?",
        "passwordreset-email": "Adresse d'email:",
        "changeemail-none": "(aucun)",
        "changeemail-password": "Ton mot de passe sur {{SITENAME}}:",
index 6a81448..db9be6f 100644 (file)
        "passwordreset-emailtext-ip": "Hoker mä det IP-Adres $1, woorskiinelk dü salew, wul hal brükerinformatsjuunen för {{SITENAME}} tusjüürd fu ($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. \nDü skulst di uunmelde an en nei paaswurd iinracht. Wan hoker ööders detheer uunfraag steld hää an dü din ual paaswurd käänst, do säärst dü niks widjer onernem. Melde di ianfach widjerhen mä din ual paaswurd uun.",
        "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.",
-       "changeemail": "Feranre det E-Mail-adres",
-       "changeemail-header": "Feranre det E-Mail-adres",
+       "passwordreset-emailsentemail": "Diar as en E-Mail tu di onerwais, wan dü en adres uunden heest.",
+       "changeemail": "Feranre of strik det E-Mail-adres",
+       "changeemail-header": "Fal det formulaar ütj, wan dü din E-Mail-adres feranre wel. Wan dü nian adres uundu wel, läät det fial man leesag.",
        "changeemail-no-info": "Dü möist önjmälded weese am ju sid diräkt tu tu gripen.",
        "changeemail-oldemail": "Aktuel e-mail adres",
        "changeemail-newemail": "Nei e-mail adres",
        "sig_tip": "Din onerskraft mä tidjstempel",
        "hr_tip": "Horisontaal streg (ei auerdriiw diarmä)",
        "summary": "Tuupfaadet:",
-       "subject": "Auerskraft:",
+       "subject": "Teemo:",
        "minoredit": "Det as man en letj feranrang",
        "watchthis": "Detdiar sidj uun't uug behual",
        "savearticle": "Sidj seekre",
        "missingsummary": "'''Paase üüb:''' Dü heest det ei tuupfaadet.\nWan dü det sidj seekerst, woort det saner en kurtfaadet beskriiwang auernimen.",
        "selfredirect": "<strong>Paase üüb:</strong> Dü feerst detheer sidj tu detsalew sidj widjer.\nDü heest was det ferkiard mual uunden, of dü bewerkest det ferkiard sidj.\nWan dü noch ans üüb „{{int:savearticle}}“ trakst, woort det widjerfeerang likes iinracht.",
        "missingcommenttext": "Faade det oner tuup.",
-       "missingcommentheader": "'''Paase üüb:''' Dü heest nian auerskraft uunden.\nWan dü det sidj seekerst, woort det saner auerskraft auernimen.",
+       "missingcommentheader": "<strong>Paase üüb:</strong> Dü heest nian teemo uunden. Wan dü noch ans üüb „{{int:savearticle}}“ trakst, woort din feranrang saner auerskraft seekert.",
        "summary-preview": "Föörskau faan det tuupfaadang:",
        "subject-preview": "Föörskau faan det auerskraft:",
        "previewerrortext": "Diar as wat skiaf gingen, üs en föörskau faan din feranrangen wiset wurd skul.",
        "accmailtext": "En tufelag iinracht paaswurd för [[User talk:$1|$1]] as tu $2 ferschüürd wurden. Det koon üüb det spezial-sidj ''[[Special:ChangePassword|Paaswurd anre]]'' feranert wurd, wan dü uunmeldet beest.",
        "newarticle": "(Nei)",
        "newarticletext": "Dü beest en ferwisang tu en sidj fulagt, diar't noch ei jaft.\nAm det sidj iinturachten, skriiw dan tekst uun det fial för't bewerkin iin.\nÜüb det [$1 halepsidj] fanjst dü halep.\nWan dü ütj fersen heer beest, trak ianfach üüb di <strong>turag</strong>-knoop faan dan browser.",
-       "anontalkpagetext": "----''Üüb detheer sidj könst dü en ünbekäänden brüker en nooracht du. Det lääpt auer sin IP adres. IP adresen kön faan flook brükern brükt wurd. Wan dü mä detheer nooracht niks began könst, do as det ferlicht för hoker ööders mend weesen. Dü säärst niks widjer onernem. Wan dü en aanj [[Special:CreateAccount|brükerkonto iinrachst]] of di [[Special:UserLogin|uunmeldest]], komt sowat ei weder föör.",
+       "anontalkpagetext": "----\n<em>Üüb detdiar sidj könst dü hoker, wat ei uunmeldet as, bööd du.</em>\nDiarför woort sin IP-adres brükt. IP-adresen kön oober faan ünlik brükern nadagt wurd.\nWan dü mä jo komentaaren niks began könst, do as was en öödern brüker mend. Ferjid det ianfach.\nDü könst di uk en [[Special:CreateAccount|brükerkonto iinracht]] of di [[Special:UserLogin|uunmelde]], am dat dü ei mä ööder brükern ferwakselt woorst.",
        "noarticletext": "Üüb detdiar sidj stäänt noch niks.\nDü könst didiar tiitel üüb ööder sidjen [[Special:Search/{{PAGENAME}}|schük]],\n<span class=\"plainlinks\">uun [{{fullurl:{{#special:Log}}|page={{FULLPAGENAMEE}}}} logbuken schük] of detdiar sidj [{{fullurl:{{FULLPAGENAME}}|action=edit}} maage]</span>.",
        "noarticletext-nopermission": "Üüb detdiar sidj stäänt noch niks, oober dü mutst diar uk niks iinskriiw.\nDü könst diar üüb ööder sidjen efter [[Special:Search/{{PAGENAME}}|schük]] of a <span class=\"plainlinks\">[{{fullurl:{{#special:Log}}|page={{FULLPAGENAME}}}} logbuken uunluke].</span>",
        "missing-revision": "Det werjuun #$1 faan det sidj \"{{FULLPAGENAME}}\" jaft at ei.\n\nDet komt diar miast faan, dat en ual ferwisang stregen wurden as.\nDü könst det uun't [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} logbuk faan stregen sidjen] efterlees.",
        "userjsyoucanpreview": "'''Tip:''' Brük di „{{int:showpreview}}“-knoop, am din nei JavaScript föör det seekrin tu testin.",
        "usercsspreview": "'''Seenk diaram, dat det bluas en föörskau faan din CSS as.'''\n'''Det as noch ei seekert wurden!'''",
        "userjspreview": "'''Seenk diaram, dat det bluas en föörskau faan din JavaScript as.'''\n'''Det as noch ei seekert wurden!'''",
-       "sitecsspreview": "'''Påås aw dåt dü jüdeer CSS bloot forbekiikest.'''\n'''Dåt as nuch ai spiikerd!'''",
-       "sitejspreview": "'''Påås aw dåt dü jüdeer JavaScript code bloot forbekiikest.'''\n'''Dåt as nuch ai spiikerd!'''",
+       "sitecsspreview": "<strong>Paase üüb! Det as bluas en föörskau faan't CSS. Det as noch ei seekert wurden!</strong>",
+       "sitejspreview": "<strong>Paase üüb! Det as bluas en föörskau faan di JavaScript code. Det as noch ei seekert wurden!</strong>",
        "userinvalidcssjstitle": "''Paase üüb:''' Skak \"$1\" jaft at ei.\nSeenk diaram, dat faan en brüker iinracht .css- an .js-sidjen mä en letjen buksteew began skel. Bispal:\n''{{ns:user}}:Münsterkjarl/vector.css'' uunsteed faan ''{{ns:user}}:Münsterkjarl/Vector.css''.",
        "updated": "(Feranert)",
        "note": "'''Paase üüb:'''",
        "previewnote": "'''Heer könst dü sä, hü det sidj wurd skal.'''\nDet sidj as oober noch ei seekert!",
        "continue-editing": "Gung tu't fial för't bewerkin",
        "previewconflict": "Detdiar föörskau wiset di boowenst dial faan dan tekst. So schocht hi ütj, wan dü ham nü seekerst.",
-       "session_fail_preview": "'''Din werk küd ei ufseekert wurd, diar as wat skiaf gingen.'''\nFerschük det man noch ans an trak do üüb ''Sidj seekre''.\nWan't do imer noch ei loket, [[Special:UserLogout|melde di uf]] an weder uun.",
+       "session_fail_preview": "Entskilage! Din werk küd ei ufseekert wurd. Diar as wat skiaf gingen.\n\nFerlicht beest dü ufmeldet wurden. <strong>Stel seeker, dat dü noch uunmeldet beest an ferschük det man noch ans</strong>.\nWan det ei wal, do mutst dü di man [[Special:UserLogout|ufmelde]] an do weder nei uunmelde. Dan browser skal cookies uunnem kön.",
        "session_fail_preview_html": "'''Din werk küd ei seekert wurd. Diar as wat skiaf gingen.'''\n\n''Uun {{SITENAME}} as HTML aktiwiaret, an diaram as JavaScript deaktiwiaret wurden.''\n\nFerschük det man noch ans an trak do üüb ''Sidj seekre''.\nWan't do imer noch ei loket, [[Special:UserLogout|melde di uf]] an weder uun.",
        "token_suffix_mismatch": "'''Din werk küd ei ufseekert wurd, auer diar frääm tiaken uun san.'''\n\nDet komt flooksis föör, wan Dan anonym Proxy-siinst ei rocht werket.",
        "edit_form_incomplete": "'''Enkelt dialen faan det formulaar san ei rocht uunkimen.'''\nWees so gud an kontroliare ales noch ans.",
        "copyrightwarning2": "Seenk diaram, dat det sidj {{SITENAME}} faan öödern bewerket, feranert of uk stregen wurd koon. Wan dü det ei wel, do skriiw heer niks iin! \n\nWan dü heer wat iinskrafst, do beest dü diarmä iinferstenen an seekerst tu, dat dü det '''salew skrewen''' heest of faan en steed auernimen heest, huar '''nian rochten''' üüb lei. (Luke bi $1, wan dü muar wed wel.)\n\n'''Auerdreeg nään frääm teksten an bilen saner ferloof!'''",
        "editpage-cannot-use-custom-model": "Det muude faan detheer sidj koon ei feranert wurd.",
        "longpageerror": "'''Error: Dan tekst as {{PLURAL:$1|ian kilobyte|$1 kilobytes}} lung, hi mut oober ei linger wees üs {{PLURAL:$2|ian kilobyte|$2 kilobytes}}.'''Hi koon ei ufspiikerd wurd.",
-       "readonlywarning": "'''Paase üüb: Dü könst uun uugenblak ei üüb det dootenbeenk tugrip. Din dooten kön ei seekert wurd.''' Wees so gud an seekre dan tekst iarst ans üüb dan reegner, an ferschük leederhen, ham tu auerdreegen.\n\nGrünj för det sperin: $1",
+       "readonlywarning": "<strong>Paase üüb: Dü könst uun uugenblak ei üüb det dootenbeenk tugrip. Din dooten kön ei seekert wurd.</strong> Wees so gud an seekre dan tekst iarst ans üüb dan reegner, an ferschük leederhen, ham tu auerdreegen.\n\nGrünj för det sper: $1",
        "protectedpagewarning": "'''Paase üüb: Detdiar sidj as speret wurden. Bluas administratooren kön det bewerke.'''\nUun't logbuk stäänt muar diartu:",
        "semiprotectedpagewarning": "'''Paase üüb: Detdiar sidj as dialwiis tu't bewerkin speret wurden. Bluas gudkäänd brükern kön det bewerke.'''\nUun't logbuk stäänt muar diartu:",
        "cascadeprotectedwarning": "<strong>Paase üüb:</strong> Detdiar sidj koon bluas faan administratooren bewerket wurd. Hat as uun {{PLURAL:$1|detdiar ööder sidj|jodiar ööder sidjen}} iinbünjen, diar troch en kaskaadensper seekert {{PLURAL:$1|as|san}}:",
        "page_first": "Began",
        "page_last": "Aanj",
        "histlegend": "Am a feranrangen uuntuwisin, schük tau werjuunen ütj an trak üüb „{{int:compareselectedversions}}“.<br />\n* '''({{int:cur}})''' = ferskeel tu't aktuel werjuun, '''({{int:last}})''' = ferskeel tu't leetst werjuun, '''{{int:minoreditletter}}''' = letj feranrang.",
-       "history-fieldset-title": "Schük uun a ferluup",
-       "history-show-deleted": "Bluas stregen werjuunen",
+       "history-fieldset-title": "Schük efter werjuunen",
+       "history-show-deleted": "Bluas stregen werjuunen wise",
        "histfirst": "Äälst",
        "histlast": "Neist",
        "historysize": "({{PLURAL:$1|1 byte|$1 bytes}})",
        "revdelete-unsuppress": "Weder iinsteld werjuunen luasmaage",
        "revdelete-log": "Grünj:",
        "revdelete-submit": "Widjer för {{PLURAL:$1|ütjsoocht werjuun|ütjsoocht werjuunen}}",
-       "revdelete-success": "'''Det werjuunsuunsicht as aktualisiaret wurden.'''",
+       "revdelete-success": "Det werjuunsuunsicht as aktualisiaret wurden.",
        "revdelete-failure": "'''Jü färsjoonsönjsicht köö ai aktualisiird wårde:'''\n$1",
-       "logdelete-success": "'''Logbukuunsicht as aktualisiaret wurden.'''",
+       "logdelete-success": "Logbukuunsicht as aktualisiaret wurden.",
        "logdelete-failure": "'''Det logbukuunsicht küd ei feranert wurd:'''\n$1",
        "revdel-restore": "Feranre, wat tu sen wees skal",
        "pagehist": "Ferluup faan werjuunen",
        "mergehistory-go": "Wise werjuunen, diar tuupfeerd wurd kön.",
        "mergehistory-submit": "Werjuunen tuupfeer",
        "mergehistory-empty": "Nian werjuunen kön tuupfeerd wurd.",
-       "mergehistory-done": "$3 {{PLURAL:$3|werjuun|werjuunen}} faan $1 tuupfeerd tu [[:$2]].",
+       "mergehistory-done": "{{PLURAL:$3|Ian werjuun as|$3 werjuunen san}} faan „$1“ tu „[[:$2]]“ tuupfeerd wurden.",
        "mergehistory-fail": "Werjuunen kön ei tuupfeerd wurd. Luke noch ans efter at sidj an a tidjen.",
        "mergehistory-fail-toobig": "A werjuunen küd ei tuupfeerd wurd, auer muar üs {{PLURAL:$1|ian werjuun|$1 werjuunen}} fersköwen {{PLURAL:$1|wurd skul|wurd skul}}.",
        "mergehistory-no-source": "Det iarst sidj \"$1\" as ai diar.",
        "prefs-watchlist-token": "Token för uun't uug behualen:",
        "prefs-misc": "Dit an dat",
        "prefs-resetpass": "Paaswurd feranre",
-       "prefs-changeemail": "Feranre det E-Mail-adres",
+       "prefs-changeemail": "Feranre of strik det E-Mail-adres",
        "prefs-setemail": "E-Mail-adres fäästlei:",
        "prefs-email": "E-Mail iinstelangen",
        "prefs-rendering": "Skak",
        "restoreprefs": "Normool iinstelangen weder haale (uun arke kirew)",
        "prefs-editing": "Bewerke",
        "searchresultshead": "Schük",
-       "stub-threshold": "Formatiarang faan links <a href=\"#\" class=\"stub\">för letj sidjen</a> (uun Byte):",
+       "stub-threshold": "Formatiarang faan ferwisangen faan letj sidjen ($1):",
        "stub-threshold-disabled": "Ufsteld",
        "recentchangesdays": "Soföl daar skel a „leetst feranrangen“ uunwise:",
        "recentchangesdays-max": "Ei muar üs {{PLURAL:$1|ään dai|$1 daar}}",
        "prefs-help-prefershttps": "Detdiar iinstelang täält, wan dü di naist tooch uunmeldest.",
        "prefswarning-warning": "A feranrangen bi din iinstelangen san noch ei seekert wurden.\nWan dü detheer sidj ferläätst, saner üüb \"$1\" tu traken, wurd din iinstelangen ei aktualisiaret.",
        "prefs-tabs-navigation-hint": "Halep: Dü könst a lachter of rochter wiiser-knoop brük, am tesken a ridjerkoorden boowen uun't menüü hen an weder tu springen.",
-       "userrights": "Brükerrochten bewerke",
-       "userrights-lookup-user": "Brükersköölen bewerke",
+       "userrights": "Brükerrochten",
+       "userrights-lookup-user": "En brüker besteme",
        "userrights-user-editname": "Brükernööm:",
-       "editusergroup": "Brükersköölen bewerke",
+       "editusergroup": "Brükersköölen loose",
        "editinguser": "Feranre brükerrochten {{GENDER:$1|faan di brüker}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Lasmootskap tu brükersköölen bewerke",
-       "saveusergroups": "Brükersköölen seekre",
+       "userrights-editusergroup": "Lasmootskat tu brükersköölen faan {{GENDER:$1|di brüker|det brüker}} bewerke",
+       "saveusergroups": "{{GENDER:$1|Lasmootskap tu brükersköölen}} feranre",
        "userrights-groupsmember": "Lasmoot faan:",
        "userrights-groupsmember-auto": "Faan salew lasmoot faan:",
-       "userrights-groups-help": "Dü könst feranre, tu hün brükerskööl di brüker hiirt:\n* En uunkrüsagt kasche ment, di brüker hiirt diartu.\n* En ei uunkrüsagt kasche ment, di brüker hiart ei diartu.\n* En * ment, dat dü det brükerrocht ei weder wechnem könst (of amkiard).",
+       "userrights-groups-help": "Dü könst feranre, tu hün brükerskööl di brüker hiirt:\n* En uunkrüsagt kasche ment, di brüker hiirt diartu.\n* En ei uunkrüsagt kasche ment, di brüker hiart ei diartu.\n* En * ment, dat dü det brükerrocht ei weder wechnem könst (of amkiard).\n* En # ment, dat dü di tidjponkt bluas efter bääften fersküüw könst, ei efter föören.",
        "userrights-reason": "Grünj:",
        "userrights-no-interwiki": "Dü heest ei det rocht, am brükerrochten uun ööder wikis tu feranrin.",
        "userrights-nodatabase": "Det dootenbeenk $1 jaft at ei, tumanst ei lokaal.",
        "group-bot": "Bots",
        "group-sysop": "Administratooren",
        "group-bureaucrat": "Bürokraaten",
-       "group-suppress": "Oversighter",
+       "group-suppress": "Fersteeger",
        "group-all": "(Aal a)",
        "group-user-member": "{{GENDER:$1|Brüker}}",
        "group-autoconfirmed-member": "{{GENDER:$1|Registriaret brüker}}",
        "group-bot-member": "{{GENDER:$1|Bot}}",
        "group-sysop-member": "{{GENDER:$1|Administraator}}",
        "group-bureaucrat-member": "{{GENDER:$1|Bürokraat}}",
-       "group-suppress-member": "{{GENDER:$1|Oversighter}}",
+       "group-suppress-member": "{{GENDER:$1|Fersteeger}}",
        "grouppage-user": "{{ns:project}}:Brükern",
        "grouppage-autoconfirmed": "{{ns:project}}:Registriaret brükern",
        "grouppage-bot": "{{ns:project}}:Bots",
        "grouppage-sysop": "{{ns:project}}:Administratooren",
        "grouppage-bureaucrat": "{{ns:project}}:Bürokraaten",
-       "grouppage-suppress": "{{ns:project}}:Oversighter",
+       "grouppage-suppress": "{{ns:project}}:Fersteeg",
        "right-read": "Sidjen lees",
        "right-edit": "Sidjen bewerke",
        "right-createpage": "Sidjen maage (saner diskuschuunsidjen)",
        "right-siteadmin": "Dootenbeenk spere an eebenmaage",
        "right-override-export-depth": "Sidjen an onersidjen bit tu en jipde faan 5 eksportiare",
        "right-sendemail": "E-mails tu ööder brükern schüür",
-       "right-managechangetags": "[[Special:Tags|Markiarangen]] iinracht an uun't dootenbeenk strik",
+       "right-managechangetags": "[[Special:Tags|Markiarangen]] iinracht an (de)aktiwiare",
        "right-applychangetags": "[[Special:Tags|Markiarangen]] tuup mä ööder feranrangen brük",
        "right-changetags": "Feranre [[Special:Tags|markiarangen]] faan enkelt werjuunen of logbukiindracher",
        "newuserlogpage": "Neiuunmeldangs-logbuk",
        "rightslogtext": "Det as det logbuk auer feranrangen faan brükerrochten.",
        "action-read": "jüdeer sid leese",
        "action-edit": "detdiar sidj tu bewerkin",
-       "action-createpage": "nei sidjen tu maagin",
-       "action-createtalk": "diskuschuunsidjen maage",
+       "action-createpage": "an maage detdiar sidj",
+       "action-createtalk": "an maage detdiar diskuschuunsidj",
        "action-createaccount": "jüdeer brükerkonto mååge",
        "action-history": "di ferluup faan detdiar sidj uuntulukin.",
        "action-minoredit": "detdiar feranrang üs letj kääntiakne",
        "action-upload_by_url": "detdiar datei faan en URL-adres huuchtusjüüren",
        "action-writeapi": "iin uun det API tu skriiwen",
        "action-delete": "detdiar sidj strik",
-       "action-deleterevision": "werjuunen tu striken",
-       "action-deletedhistory": "det list mä stregen werjuunen uuntulukin",
+       "action-deleterevision": "an strik werjuunen",
+       "action-deletedhistory": "an luke det list mä stregen werjuunen uun",
        "action-browsearchive": "schük stregen sidjen",
-       "action-undelete": "detdiar sidj weder iinstel",
-       "action-suppressrevision": "det ferbürgen werjuun uuntulukin an weder turagtuhaalin",
+       "action-undelete": "an stel sidjen weder iin",
+       "action-suppressrevision": "an luke ferbürgen werjuunen uun of stel jo weder iin",
        "action-suppressionlog": "iin uun det priwoot logbuk tu lukin",
        "action-block": "di brüker tu sperin",
        "action-protect": "det seekerhaid faan sidjen tu feranrin",
        "action-viewmyprivateinfo": "din priwoot dooten uuntulukin",
        "action-editmyprivateinfo": "din priwoot dooten tu bewerkin",
        "action-editcontentmodel": "det model faan det sidj tu bewerkin",
-       "action-managechangetags": "markiarangen iinracht an uun't dootenbeenk strik",
+       "action-managechangetags": "an racht markiarangen iin an (de)aktiwiare jo",
        "action-applychangetags": "markiarangen tuup mä ööder feranrangen tu brüken",
        "action-changetags": "markiarangen faan enkelt werjuunen of logbukiindracher tu feranrin",
        "nchanges": "$1 {{PLURAL:$1|feranrang|feranrangen}}",
        "recentchangeslinked-page": "Sidjennööm:",
        "recentchangeslinked-to": "Wise feranrangen üüb sidjen, diar heerhen ferwise.",
        "recentchanges-page-added-to-category": "[[:$1]] tu kategorii saat",
-       "recentchanges-page-added-to-category-bundled": "[[:$1]] an [[Special:WhatLinksHere/$1|{{PLURAL:$2|ian sidj muar|$2 muar sidjen}}]] tu kategorii saat",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] tu kategorii saat, [[Special:WhatLinksHere/$1|detdiar sidj as uun ööder sidjen iinbünjen.]]",
        "recentchanges-page-removed-from-category": "[[:$1]] faan't kategorii wechnimen",
-       "recentchanges-page-removed-from-category-bundled": "[[:$1]] an {{PLURAL:$2|ian sidj muar|$2 muar sidjen}} faan det kategorii wechnimen",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] faan det kategorii wechnimen, [[Special:WhatLinksHere/$1|detdiar sidj as uun ööder sidjen iinbünjen]]",
        "upload": "Datei huuchschüür",
        "uploadbtn": "Datei huuchschüür",
        "reuploaddesc": "Ufbreeg an turag tu't sidj för't huuchschüüren",
        "backend-fail-read": "Det datei $1 küd ei leesen wurd.",
        "backend-fail-create": "Det datei $1 küd ei seekert wurd.",
        "backend-fail-maxsize": "Det datei $1 küd ei seekert wurd, auer det grater üs {{PLURAL:$2|1 byte|$2 bytes}} as.",
-       "backend-fail-readonly": "Det süsteem „$1“ koon uun uugenblak bluas lees. Di grünj as: „$2“",
+       "backend-fail-readonly": "Det dootebeenk „$1“ koon uun uugenblak bluas lees. Di grünj as: <em>$2</em>",
        "backend-fail-synced": "Det datei „$1“ woort jüst faan't süsteem bewerket.",
        "backend-fail-connect": "Küd ei mä't süsteem „$1“ ferbinj.",
        "backend-fail-internal": "Uun't süsteem „$1“ as wat skiaf gingen.",
        "nopagetext": "Det sidj, wat fersköwen wurd skal, as ei diar.",
        "pager-newer-n": "{{PLURAL:$1|1 neier|$1 neier}}",
        "pager-older-n": "{{PLURAL:$1|1 ääler|$1 ääler}}",
-       "suppress": "Oversight",
+       "suppress": "Fersteeg",
        "querypage-disabled": "Detdiar spezial-sidj as ei aktiif, am det süsteem ei tu auerläästin.",
        "apihelp": "Halep för API",
        "apihelp-no-such-module": "Moduul \"$1\" ei fünjen.",
        "booksources-text": "Detdiar list ferwiset üüb wääbsteeden, diar nei an brükt buken ferkuupe. Diar feist dü uk muar tu weden. {{SITENAME}} hää mo jodiar kuuplidj oober niks tu dun.",
        "booksources-invalid-isbn": "Detdiar ISBN as woorskiinelk ferkiard. Luke noch ans efter, of det rocht auerdraanj wurden as.",
        "specialloguserlabel": "Brüker:",
-       "speciallogtitlelabel": "Mual (sidjennööm of brüker):",
+       "speciallogtitlelabel": "Mual (Tiitel of {{ns:user}}:brükernööm för di brüker):",
        "log": "Logbuken",
        "all-logs-page": "Aal a öfentelk logbuken",
        "alllogstext": "Diar wurd aal a logbuken faan {{SITENAME}} uunwiset.\nDet woort efter logbukslach, brüker of sidjennööm uunwiset. Grat- an letjskriiwang skel beaachtet wurd.",
        "emailccsubject": "Kopii faan din mädialang tu $1: $2",
        "emailsent": "E-mail as wechschüürd wurden",
        "emailsenttext": "Din e-mail as wechschüürd wurden.",
-       "emailuserfooter": "Detdiar e-mail as faan „$1“ tu „$2“ auer det funktjuun „{{int:emailuser}}“ bi {{SITENAME}} schüürd wurden.",
+       "emailuserfooter": "Detdiar E-Mail as faan „$1“ tu „{{GENDER:$2|$2}}“ mä det funktjuun „{{int:emailuser}}“ bi {{SITENAME}} {{GENDER:$1|schüürd}} wurden. Wan {{GENDER:$2|dü}} üüb detdiar E-Mail swaarest, woort det direkt tu {{GENDER:$1|di|det}} ufschüürer schüürd. Diarbi feit {{GENDER:$1|hi|hat}} {{GENDER:$2|din}} E-Mail-adres tu weden.",
        "usermessage-summary": "Süsteemnooracht seekert.",
        "usermessage-editor": "Süsteemnoorachten siinst",
        "watchlist": "Uun't uug behual",
        "deletepage": "Sidj strik",
        "confirm": "Gudkään",
        "excontent": "diar sted: „$1“",
-       "excontentauthor": "diar sted: „$1“ (iansagst bewerker: [[Special:Contributions/$2|$2]])",
+       "excontentauthor": "Diar sted: „$1“, an di iansagst bewerker wiar: [[Special:Contributions/$2|$2]] ([[User talk:$2|Diskuschuun]])",
        "exbeforeblank": "diar sted föör't leesag maagin: „$1“",
        "delete-confirm": "Strik \"$1\"",
        "delete-legend": "Strike",
        "delete-toobig": "Detdiar sidj hää muar üs $1 {{PLURAL:$1|werjuun|werjuunen}} . Sok sidjen kön ei so gau stregen wurd, ööders san a servers plaat.",
        "delete-warning-toobig": "Detdiar sidj hää muar üs $1 {{PLURAL:$1|werjuun|werjuunen}} . Det striken koon komer maage bi't dootenbeenk.",
        "deleteprotected": "Dü könst detdiar sidj ei strik, auer det seekert wurden as.",
-       "deleting-backlinks-warning": "'''Paase üüb:''' Diar ferwise noch [[Special:WhatLinksHere/{{FULLPAGENAME}}|ööder sidjen]] üüb det sidj, diar dü strik wel. Of det sidj as noch huarööders iinbünjen.",
+       "deleting-backlinks-warning": "<strong>Paase üüb:</strong> Diar ferwise noch [[Special:WhatLinksHere/{{FULLPAGENAME}}|ööder sidjen]] üüb det sidj, diar dü strik wel. Of det sidj as noch huarööders iinbünjen.",
        "rollback": "Feranrangen turagsaat",
        "rollbacklink": "turagsaat",
        "rollbacklinkcount": "$1 {{PLURAL:$1|feranrang|feranrangen}} turagsaat",
        "editcomment": "Tuupfaadet feranrang: <em>$1</em>.",
        "revertpage": "Feranrangen faan [[Special:Contributions/$2|$2]] ([[User talk:$2|Diskuschuun]]) san üüb di leetst stant faan [[User:$1|$1]] turagsaat wurden.",
        "revertpage-nouser": "Feranrangen faan en ferbürgenen brüker turagsaat an det leetst werjuun faan {{GENDER:$1|[[User:$1|$1]]}} weder iinsteld.",
-       "rollback-success": "Feranrangen faan $1 turagsaat an det leetst werjuun faan $2 weder iinsteld.",
+       "rollback-success": "Feranrangen faan {{GENDER:$3|$1}} san turagsaat an det leetst werjuun faan {{GENDER:$4|$2}} as weder iinsteld wurden.",
        "sessionfailure-title": "session feeler",
        "sessionfailure": "Diar as wat skiaf gingen bi't auerdreegen faan din brükerdooten.\nAm dat diar ei noch muar skiaf gongt, as det aktjuun ufbreegen wurden.\nGung turag, an began faan föören.",
        "changecontentmodel": "Det muude faan det sidj feranre",
        "changecontentmodel-cannot-convert": "Det muude faan [[:$1]] koon ei tu typ $2 feranert wurd.",
        "changecontentmodel-nodirectediting": "Uun det $1 muude könst dü ei direkt bewerke",
        "log-name-contentmodel": "Muude-feranrang-logbuk",
-       "log-description-contentmodel": "Föörkemen am det sidjenmuude",
+       "log-description-contentmodel": "Detdiar sidj wiset feranrangen bi det muude faan sidjen, an uk sok sidjen, diar efter en ööder muude maaget san.",
        "logentry-contentmodel-change": "$1 {{GENDER:$2|hää}} det muude faan sidj $3 faan „$4“ efter „$5“ feranert.",
        "logentry-contentmodel-change-revertlink": "turagsaat",
        "logentry-contentmodel-change-revert": "turagsaat",
        "sp-contributions-newbies-sub": "Faan nei brükern",
        "sp-contributions-newbies-title": "Brükerbidracher faan nei brükern",
        "sp-contributions-blocklog": "Sper-logbuk",
-       "sp-contributions-suppresslog": "Ei uunwiset brüker-bidracher",
-       "sp-contributions-deleted": "Stregen bidracher",
+       "sp-contributions-suppresslog": "Fersteecht {{GENDER:$1|brükerbidracher}}",
+       "sp-contributions-deleted": "Stregen {{GENDER:$1|brüker}} bidtacher",
        "sp-contributions-uploads": "Huuchschüürd bilen",
        "sp-contributions-logs": "Logbuken",
        "sp-contributions-talk": "Diskuschuun",
        "whatlinkshere-hideredirs": "$1 widjerfeerangen",
        "whatlinkshere-hidetrans": "$1 iinbünjen föörlaagen",
        "whatlinkshere-hidelinks": "$1 ferwisangen",
-       "whatlinkshere-hideimages": "Ferwisangen tu datein $1",
+       "whatlinkshere-hideimages": "$1 ferwisangen tu datein",
        "whatlinkshere-filters": "Filtere",
        "autoblockid": "Automaatisk sper #$1",
        "block": "Brüker spere",
        "cant-move-to-user-page": "Dü mutst nian sidjen üüb en brükersidj fersküüw (bluas üüb onersidjen).",
        "cant-move-category-page": "Dü mutst nian kategoriisidjen fersküüw.",
        "cant-move-to-category-page": "Dü mutst nian sidj tu en kategoriisidj fersküüw.",
-       "newtitle": "Müülj:",
+       "newtitle": "Nei tiitel:",
        "move-watch": "Jodiar sidjen uun't uug behual",
        "movepagebtn": "Sidj fersküüw",
        "pagemovedsub": "Fersküüwen hää loket",
        "movenosubpage": "Det sidj hää nian onersidjen.",
        "movereason": "Grünj:",
        "revertmove": "turag fersküüw",
-       "delete_and_move_text": "== Striken nuadag  ==\n\nDet sidj „[[:$1]]“ as al diar. Wel dü det strik, am det sidj tu fersküüwen?",
+       "delete_and_move_text": "Det sidj „[[:$1]]“ as al diar. Wel dü det strik, am det sidj tu fersküüwen?",
        "delete_and_move_confirm": "Ja, sidj strik",
        "delete_and_move_reason": "Stregen, am steeds för det fersküüwen faan „[[$1]]“ tu maagin.",
        "selfmove": "A nöömer san likedenang. Dü könst nian sidj üüb ham salew fersküüw.",
        "move-leave-redirect": "Widjerfeerang iinracht",
        "protectedpagemovewarning": "'''Paase üüb: Detdiar sidj as speret wurden. Bluas administratooren kön det fersküüw.'''\nUun't logbuk stäänt muar diartu:",
        "semiprotectedpagemovewarning": "'''Paase üüb:''' Detdiar sidj as dialwiis tu't bewerkin speret wurden. Bluas gudkäänd brükern kön det fersküüw.\nUun't logbuk stäänt muar diartu:",
-       "move-over-sharedrepo": "== Datei as al diar ==\n[[:$1]] stäänt uun en gemiansoom brükt archiif. Det fersküüwen üüb didiar nööm auerskraft det gemiansoom brükt datei.",
+       "move-over-sharedrepo": "[[:$1]] stäänt uun en gemiansoom brükt archiif. Det fersküüwen üüb didiar nööm auerskraft det gemiansoom brükt datei.",
        "file-exists-sharedrepo": "Didiar dateinööm woort al uun en gemiansoom archiif brükt. Wees so gud, an nem en öödern nööm.",
        "export": "Sidjen eksportiare",
        "exporttext": "Mä detdiar spezial-sidj könst dü di tekst mä aal sin werjuunen tu en XML-datei eksportiare. Det nei datei koon do faan en ööder MediaWiki-Wiki [[Special:Import|importiaret]] wurd.\n\nSkriiw a sidjennöömer iin uun det tekstfial (man bluas ään noom uun arke rä).\n\nDi eksport as uk mä [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] mögelk, tun bispal för det [[{{MediaWiki:Mainpage}}]].",
        "tooltip-feed-rss": "RSS-feed för detdiar sidj",
        "tooltip-feed-atom": "Atom-feed för detdiar sidj",
        "tooltip-t-contributions": "List mä bidracher faan {{GENDER:$1|didiar brüker|detdiar brüker}} uunluke",
-       "tooltip-t-emailuser": "En e-mail tu didiar brüker schüür",
+       "tooltip-t-emailuser": "En E-Mail tu {{GENDER:$1|didiar|detdiar}} brüker schüür",
        "tooltip-t-info": "Muar auer detdiar sidj",
        "tooltip-t-upload": "Datein huuchschüür",
        "tooltip-t-specialpages": "Auersicht auer aal a spezial-sidjen",
        "lastmodifiedatby": "Det sidj as tuleetst di $1 am a klook $2 faan $3 feranert wurden.",
        "othercontribs": "Üüb grünjlaag faan det werk faan $1.",
        "others": "öödern",
-       "siteusers": "{{SITENAME}} {{PLURAL:$2|brüker|brükern}} $1",
+       "siteusers": "{{SITENAME}} {{PLURAL:$2|{{GENDER:$1|brüker}}|brükern}} $1",
        "anonusers": "{{PLURAL:$2|anonüümen|anonüüm}} {{SITENAME}}-{{PLURAL:$2|brüker|brükern}} $1",
        "creditspage": "Sidjeninformatsjuunen",
        "nocredits": "Diar san nian sidjeninformatsjuunen",
index e10b921..85fee97 100644 (file)
        "toc": "Ynhâld",
        "showtoc": "sjen litte",
        "hidetoc": "net sjen litte",
+       "collapsible-collapse": "Ynklappe",
+       "collapsible-expand": "Utklappe",
        "confirmable-yes": "Ja",
        "confirmable-no": "Nee",
        "thisisdeleted": "\"$1\" lêze of werombringe?",
        "externaldberror": "Der is in fout by it oanmelden by de database of jo hawwe gjin tastimming om jo ekstern account by te wurkjen.",
        "login": "Oanmelde",
        "nav-login-createaccount": "Oanmelde",
-       "userlogin": "Oanmelde",
-       "userloginnocreate": "Ynlogge",
        "logout": "Ofmelde",
        "userlogout": "Ofmelde",
        "notloggedin": "Net oanmelde",
        "userlogin-noaccount": "Hasto gjin akkount?",
        "userlogin-joinproject": "Meidwaan {{SITENAME}}",
-       "nologin": "Noch net oanmelden as meidogger? $1.",
-       "nologinlink": "Meitsje in brûker oan",
        "createaccount": "Registrearje",
-       "gotaccount": "Hawwe jo jo al as meidogger oanmelde? '''$1'''.",
-       "gotaccountlink": "Oanmelde",
-       "userlogin-resetlink": "Ynlochdata fergetten?",
        "userlogin-resetpassword-link": "Wachtwurd fergetten?",
        "createacct-emailrequired": "E-mailadres",
        "createacct-emailoptional": "E-mailadres (net ferplichte)",
        "createacct-another-email-ph": "E-mailadres ynfiere",
        "createaccountmail": "troch e-mail",
        "createacct-realname": "Echte namme (net ferplichte)",
-       "createaccountreason": "Reden:",
        "createacct-reason": "Reden",
        "createacct-reason-ph": "Wêrom makkesto in oare akkount?",
        "createacct-submit": "Meitsje in akkount",
        "minoredit": "Dit is in tekstwiziging",
        "watchthis": "Folgje dizze side",
        "savearticle": "Side bewarje",
+       "publishpage": "Side fêstlizze",
        "preview": "Oerlêze",
        "showpreview": "Earst oerlêze",
        "showdiff": "Wizigings",
        "revertmerge": "Gearfoeging ûngedien meitsje",
        "mergelogpagetext": "Hjirûnder stiet in list fan resinte gearfoegings fan ien side-skiednis nei in oaren.",
        "history-title": "$1: ferzjeskiednis",
+       "difference-title": "Ferskil tusken ferzjes fan \"$1\"",
        "lineno": "Rigel $1:",
        "compareselectedversions": "Ferlykje selektearre ferzjes",
        "showhideselectedversions": "Oantikke ferzjes wol/net sjen litte",
        "saveprefs": "Bewarje",
        "restoreprefs": "Tebek nei de standertynstellings",
        "prefs-editing": "Siden bewurkje",
-       "rows": "Rigen",
-       "columns": "Kolommen",
        "searchresultshead": "Sykje",
        "stub-threshold": "Drompel foar markearring <a href=\"#\" class=\"stub\">stobbe</a> (bytes):",
        "stub-threshold-disabled": "Utskeakele",
        "userrights-reason": "Reden:",
        "userrights-no-interwiki": "Jo hawwe gjin foech om rjochten fan meidoggers op oare wikis te wizigjen.",
        "userrights-nodatabase": "Databank $1 bestiet net of is net lokaal.",
-       "userrights-nologin": "Jo moatte jo [[Special:UserLogin|oanmelde]] as rjochtenútfurder om rjochten fan meidoggers wizigje te kinnen.",
-       "userrights-notallowed": "Jo hawwe gjin rjochten om rjochten fan meidoggers te wizigjen.",
        "userrights-changeable-col": "Groepen dy't jo beheare kinne",
        "userrights-unchangeable-col": "Groepen dy't jo net beheare kinne",
        "userrights-irreversible-marker": "$1*",
        "recentchanges-label-minor": "Dit is in tekstwiziging",
        "recentchanges-label-bot": "Dizze wiziging is troch in robot makke",
        "recentchanges-label-unpatrolled": "Dizze wiziging is noch net neisjûn",
+       "recentchanges-label-plusminus": "De sidegrutte is mei dit oantal bytes wizige",
        "recentchanges-legend-heading": "<strong>Leginda:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (sjoch ek de [[Special:NewPages|list mei nije siden]])",
        "rcnotefrom": "Dit binne de feroarings sûnt <b>$2</b> (maksimaal <b>$1</b>).",
        "revdelete-restricted": "hat beheinings oplein oan behearders",
        "revdelete-unrestricted": "hat beheinings foar behearders goedmakke",
        "rightsnone": "(gjin)",
-       "revdelete-summary": "gearfetting bewurkje",
        "feedback-back": "Foarige",
        "feedback-cancel": "Annulearje",
        "feedback-close": "Dien",
        "feedback-submit": "Ferstjoere",
        "feedback-useragent": "Useragent:",
        "searchsuggest-search": "Sykje",
-       "api-error-unknown-code": "Unbekende flater: \"$1\".",
        "api-error-unknownerror": "Unbekende flater: \"$1\".",
        "duration-seconds": "$1 {{PLURAL:$1|sekonde|sekonden}}",
        "duration-minutes": "$1 {{PLURAL:$1|minút|minuten}}",
index 4b95c8d..7894932 100644 (file)
        "post-expand-template-argument-warning": "'''Aviso:''' Esta páxina contén, polo menos, un argumento de modelo que ten un tamaño e expansión moi grande.\nEstes argumentos foron omitidos.",
        "post-expand-template-argument-category": "Páxinas que conteñen argumentos de modelo omitidos",
        "parser-template-loop-warning": "Detectouse un modelo en bucle: [[$1]]",
+       "template-loop-category": "Páxinas con bucles de modelo",
+       "template-loop-category-desc": "A páxina contén un bucle de modelo, por exemplo, un modelo que se chama a si mesmo recursivamente.",
        "parser-template-recursion-depth-warning": "Excedeuse o límite de profundidade de recursión do modelo ($1)",
        "language-converter-depth-warning": "Excedeuse o límite de profundidade do convertedor de lingua ($1)",
        "node-count-exceeded-category": "Páxinas nas que se supera o número de nodos",
        "page_first": "primeira",
        "page_last": "derradeira",
        "histlegend": "Selección de diferenzas: Marque as versións que queira comparar e prema no botón ao final.<br />\nLenda: '''({{int:cur}})''' = diferenza coa versión actual, '''({{int:last}})''' = diferenza coa versión precedente, '''{{int:minoreditletter}}''' = edición pequena.",
-       "history-fieldset-title": "Explorar o historial",
-       "history-show-deleted": "Borrados soamente",
+       "history-fieldset-title": "Buscar revisións",
+       "history-show-deleted": "Só con borrados de revisións",
        "histfirst": "as máis antigas",
        "histlast": "as máis novas",
        "historysize": "({{PLURAL:$1|1 byte|$1 bytes}})",
        "prefs-help-prefershttps": "Esta preferencia ha aplicarse no seu vindeiro acceso ao sistema.",
        "prefswarning-warning": "Fixo cambios nas súas preferencias que aínda non se gardaron.\nSe deixa esta páxina sen premer en \"$1\", non se actualizarán as súas preferencias.",
        "prefs-tabs-navigation-hint": "Consello: Pode empregar as frechas esquerda e dereita para navegar polas lapelas da lista.",
-       "userrights": "Xestión dos dereitos de usuario",
+       "userrights": "Dereitos de usuario",
        "userrights-lookup-user": "Seleccionar un usuario",
        "userrights-user-editname": "Escriba un nome de usuario:",
        "editusergroup": "Cargar os grupos de usuario",
        "saveusergroups": "Gardar os grupos {{GENDER:$1|do usuario|da usuaria}}",
        "userrights-groupsmember": "Membro de:",
        "userrights-groupsmember-auto": "Membro implícito de:",
-       "userrights-groups-help": "Pode cambiar os grupos aos que {{GENDER:$1|o usuario|a usuaria}} pertence:\n* Se a caixa ten un sinal (✓) significa que {{GENDER:$1|o usuario|a usuaria}} pertence a ese grupo.\n* Se, pola contra, non o ten, significa que non pertence.\n* Un asterisco (*) indica que non pode eliminar o grupo unha vez que o engadiu, e viceversa.\n* Un # indica que só se pode atrasar a data de caducidade deste grupo; non se pode adiantar.",
+       "userrights-groups-help": "Pode cambiar os grupos aos que {{GENDER:$1|o usuario|a usuaria}} pertence:\n* Se a caixa ten un sinal (✓) significa que {{GENDER:$1|o usuario|a usuaria}} pertence a ese grupo.\n* Se, pola contra, non o ten, significa que non pertence.\n* Un asterisco (*) indica que non pode eliminar o grupo unha vez que o engadiu, e viceversa.\n* Un # indica que só se pode atrasar a data de caducidade de pertenza a este grupo; non se pode adiantar.",
        "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-expiry-options": "1 día:1 día,1 semana:1 semana,1 mes:1 mes,3 meses:3 meses,6 meses:6 meses,1 ano:1 ano",
        "userrights-invalid-expiry": "O tempo de caducidade para o grupo \"$1\" non é válido.",
        "userrights-expiry-in-past": "O tempo de caducidade para o grupo \"$1\" está no pasado.",
-       "userrights-cannot-shorten-expiry": "Non pode adiantar a data de caducidade do grupo \"$1\". Só os usuarios con permisos para engadir e eliminar este grupo poden adiantar datas de caducidade.",
+       "userrights-cannot-shorten-expiry": "Non pode adiantar a data de caducidade de pertenza ó grupo \"$1\". Só os usuarios con permisos para engadir e eliminar este grupo poden adiantar datas de caducidade.",
        "userrights-conflict": "Hai un conflito na modificación dos dereitos de usuario! Por favor, revíseo e confirme os seus cambios.",
        "group": "Grupo:",
        "group-user": "Usuarios",
        "rcfilters-invalid-filter": "Filtro no válido",
        "rcfilters-empty-filter": "Non hai filtros activos. Móstranse tódalas contribucións.",
        "rcfilters-filterlist-title": "Filtros",
+       "rcfilters-filterlist-whatsthis": "Que é isto?",
        "rcfilters-filterlist-feedbacklink": "Deixar comentarios sobre os novos filtros (en fase beta)",
        "rcfilters-highlightbutton-title": "Resaltar resultados",
        "rcfilters-highlightmenu-title": "Seleccione unha cor",
        "rcfilters-highlightmenu-help": "Seleccione unha cor para resaltar esta propiedade",
        "rcfilters-filterlist-noresults": "Non se atoparon filtros",
+       "rcfilters-noresults-conflict": "Non se atoparon resultados porque os criterios de busca están en conflito.",
+       "rcfilters-state-message-fullcoverage": "Seleccionar tódolos filtros dun grupo é o mesmo que non seleccionar ningún, polo que este filtro non ten efecto. O grupo inclúeː $1",
        "rcfilters-filtergroup-registration": "Rexistro de usuario",
        "rcfilters-filter-registered-label": "Rexistrado",
        "rcfilters-filter-registered-description": "Editores autenticados.",
        "rcfilters-filter-unregistered-label": "Non rexistrado",
        "rcfilters-filter-unregistered-description": "Editores que non están autenticados.",
+       "rcfilters-filter-unregistered-conflicts-user-experience-level": "Este filtro está en conflito {{PLURAL:$2|co seguinte filtro|cos seguintes filtros}} Experience, que {{PLURAL:$2|atopa|atopan}} só usuarios rexistradosː $1",
        "rcfilters-filtergroup-authorship": "Editar autoría",
        "rcfilters-filter-editsbyself-label": "As súas propias edicións",
        "rcfilters-filter-editsbyself-description": "Edicións súas.",
        "rcfilters-filter-editsbyother-label": "Edicións doutros.",
        "rcfilters-filter-editsbyother-description": "Edicións creadas por outros usuarios (non por vostede).",
        "rcfilters-filtergroup-userExpLevel": "Nivel de experiencia (só para usuarios rexistrados)",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "Os filtros Experience só atopan usuarios rexistrados, polo que este filtro está en conflito co filtro \"non rexistrado\".",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "O filtro \"non rexistrados\" está en conflito cun ou máis filtros Experience, que só atopan usuarios rexistrados. Os filtros en conflito están marcados na área dos filtros activos, arriba.",
        "rcfilters-filter-user-experience-level-newcomer-label": "Chegados recentemente",
        "rcfilters-filter-user-experience-level-newcomer-description": "Menos de 10 edicións e 4 días de actividade.",
        "rcfilters-filter-user-experience-level-learner-label": "Aprendices",
        "rcfilters-filter-bots-description": "Edicións realizadas por ferramentas automatizadas.",
        "rcfilters-filter-humans-label": "Humano (non bot)",
        "rcfilters-filter-humans-description": "Edicións realizadas por editores humanos.",
+       "rcfilters-filtergroup-reviewstatus": "Estado de revisión",
+       "rcfilters-filter-patrolled-label": "Patrulladas",
+       "rcfilters-filter-patrolled-description": "Edicións marcadas como patrulladas.",
+       "rcfilters-filter-unpatrolled-label": "Sen patrullar",
+       "rcfilters-filter-unpatrolled-description": "Edicións non marcadas como patrulladas.",
        "rcfilters-filtergroup-significance": "Importancia",
        "rcfilters-filter-minor-label": "Edicións menores",
        "rcfilters-filter-minor-description": "Edicións que o autor etiquetou como menores.",
        "rcfilters-filter-logactions-label": "Accións rexistradas",
        "rcfilters-filter-logactions-description": "Accións administrativas, creacións de conta, borrados de páxinas, subas de ficheiros....",
        "rcnotefrom": "A continuación {{PLURAL:$5|móstrase o cambio feito|móstranse os cambios feitos}} desde o <strong>$3</strong> ás <strong>$4</strong> (móstranse <strong>$1</strong> como máximo).",
+       "rclistfromreset": "Reinicializar a selección da data",
        "rclistfrom": "Mostrar os cambios novos desde o $3 ás $2",
        "rcshowhideminor": "$1 as edicións pequenas",
        "rcshowhideminor-show": "Mostrar",
        "undeleteviewlink": "ver",
        "undeleteinvert": "Inverter a selección",
        "undeletecomment": "Motivo:",
-       "undeletedrevisions": "{{PLURAL:$1|Restaurouse $1 revisión|Restauráronse $1 revisións}}",
-       "undeletedrevisions-files": "Restauráronse $1 {{PLURAL:$1|revisión|revisións}} e $2 {{PLURAL:$2|ficheiro|ficheiros}}",
-       "undeletedfiles": "{{PLURAL:$1|Restaurouse $1 ficheiro|Restauráronse $1 ficheiros}}",
        "cannotundelete": "Algunhas ou todas as restauracións fallaronː\n$1",
        "undeletedpage": "'''A páxina \"$1\" foi restaurada'''\n\nComprobe o [[Special:Log/delete|rexistro de borrados]] para ver as entradas recentes no rexistro de páxinas eliminadas e restauradas.",
        "undelete-header": "Consulte [[Special:Log/delete|no rexistro de borrados]] as páxinas borradas recentemente.",
        "newimages-summary": "Esta páxina especial mostra os últimos ficheiros cargados.",
        "newimages-legend": "Filtro",
        "newimages-label": "Nome do ficheiro (ou parte del):",
+       "newimages-user": "Enderezo IP ou nome de usuario",
        "newimages-showbots": "Mostrar as cargas feitas por bots",
        "newimages-hidepatrolled": "Agochar as subidas patrulladas",
        "noimages": "Non hai imaxes que mostrar.",
        "special-characters-group-thai": "Tailandés",
        "special-characters-group-lao": "Laosiano",
        "special-characters-group-khmer": "Camboxano",
+       "special-characters-group-canadianaboriginal": "Aborixe canadense",
        "special-characters-title-endash": "guión",
        "special-characters-title-emdash": "raia",
        "special-characters-title-minus": "signo menos",
        "restrictionsfield-label": "Rangos de IP permitidos:",
        "restrictionsfield-help": "Un único enderezo IP ou rango CIDR por liña. Para habilitalos todos, utiliceː\n<pre>0.0.0.0/0\n::/0</pre>",
        "revid": "revisión $1",
-       "pageid": "identificador de páxina $1"
+       "pageid": "identificador de páxina $1",
+       "rawhtml-notallowed": "As marcas &lt;html&gt; non poden usarse fóra das páxinas normais.",
+       "gotointerwiki": "Deixando {{SITENAME}}",
+       "gotointerwiki-invalid": "O título especificado non era válido."
 }
index 6220a07..f9e1384 100644 (file)
                        "Gothicspeaker"
                ]
        },
+       "tog-previewontop": "𐌰𐌽𐌳𐌷𐌿𐌻𐌴𐌹 𐍆𐌰𐌿𐍂𐌰𐍃𐌹𐌿𐌽 𐍆𐌰𐌿𐍂𐌰 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐌹𐌰𐍂𐌺𐌰",
        "tog-previewonfirst": "𐌰𐍄𐌰𐌿𐌲𐌴𐌹 𐍆𐌰𐌿𐍂𐌰𐍃𐌹𐌿𐌽 𐌰𐍄 𐍆𐍂𐌿𐌼𐌹𐍃𐍄𐌰 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽",
+       "tog-enotifusertalkpages": "𐍃𐌰𐌽𐌳𐌴𐌹 𐌼𐌹𐌺 𐌴-𐌱𐍉𐌺𐍉𐍃 𐌾𐌰𐌱𐌰𐌹 𐌼𐌴𐌹𐌽𐍃 𐌻𐌰𐌿𐍆𐍃 𐌲𐌰𐍅𐌰𐌿𐍂𐌳𐌾𐌹𐍃 𐌹𐌽𐌼𐌰𐌹𐌳𐌾𐌰𐌳𐌰",
+       "tog-shownumberswatching": "𐌰𐌽𐌳𐌷𐌿𐌻𐌴𐌹 𐍂𐌰𐌸𐌾𐍉𐌽 𐍅𐌹𐍄𐌰𐌽𐌳𐌰𐌹𐌶𐌴 𐌱𐍂𐌿𐌺𐌾𐌰𐌽𐌴",
+       "tog-oldsig": "𐌸𐌴𐌹𐌽𐌰 𐍅𐌹𐍃𐌰𐌽𐌳𐌴𐌹 𐌿𐍆𐌼𐌴𐌻𐌴𐌹𐌽𐍃",
        "underline-always": "𐍃𐌹𐌽𐍄𐌴𐌹𐌽𐍉",
        "underline-never": "𐌽𐌹 𐌰𐌹𐍅",
        "sunday": "𐌰𐍆𐌰𐍂𐍃𐌰𐌱𐌱𐌰𐍄𐍉",
        "badtitle": "𐌿𐌽𐍂𐌰𐌹𐌷𐍄𐌰𐍄𐌰 𐌿𐍆𐌰𐍂𐌼𐌴𐌻𐌹",
        "badtitletext": "𐍆𐍂𐌰𐌹𐌷𐌰𐌽𐍃 𐌻𐌰𐌿𐍆𐍃 𐍅𐌰𐍃 𐌿𐌽𐌲𐌰𐌼𐌰𐌲𐌰𐌽𐌳𐍃, 𐌻𐌰𐌿𐍃, 𐌰𐌹𐌸𐌸𐌰𐌿 𐌿𐌽𐍂𐌰𐌹𐌷𐍄𐌰𐌱𐌰 𐌲𐌰𐍅𐌹𐌳𐌰𐌽𐍃 𐌼𐌹𐌸𐍂𐌰𐌶𐌳𐌰 𐌸𐌰𐌿 𐌼𐌹𐌸-𐍅𐌹𐌺𐌹 𐌿𐍆𐌰𐍂𐌼𐌴𐌻𐌹. 𐌼𐌰𐌲𐌹 𐌷𐌰𐌱𐌰𐌽 𐌰𐌹𐌽𐌰 𐌸𐌰𐌿 𐌼𐌰𐌽𐌰𐌲𐌹𐌶𐍉𐍃 𐌱𐍉𐌺𐍉𐍃 𐌱𐍂𐌿𐌺𐌹𐌳𐍉𐍃 𐌹𐌽 𐌿𐍆𐌰𐍂𐌼𐌴𐌻𐌾𐌰𐌼.",
        "viewsource": "𐍃𐌰𐌹𐍈 𐌱𐍂𐌿𐌽𐌽𐌰𐌽",
+       "protectedpagetext": "𐍃𐌰 𐌻𐌰𐌿𐍆𐍃 𐌷𐌰𐌱𐌰𐌹𐌸 𐌼𐌿𐌽𐌳, 𐌴𐌹 𐌽𐌹 𐍅𐌰𐌹𐍂𐌸𐌴𐌹𐌽𐌰 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍉𐍃 𐌸𐌰𐌿 𐌰𐌽𐌸𐌰𐍂𐍉𐍃 𐍅𐌰𐌹𐌷𐍄𐍃 𐌹𐌽 𐌸𐌰𐌼𐌼𐌰 𐌻𐌰𐌿𐌱𐌰",
        "mycustomjsprotected": "𐌽𐌹 𐌷𐌰𐌱𐌰𐌹𐍃 𐌰𐌽𐌳𐌻𐌴𐍄 𐌳𐌿 𐌹𐌽𐌼𐌰𐌹𐌳𐌾𐌰𐌽 𐌸𐌰𐌽𐌰 JavaScript 𐌻𐌰𐌿𐍆.",
        "yourname": "𐌰𐍄𐌲𐌰𐌲𐌲𐌰𐌽𐌰𐌼𐍉:",
        "userlogin-yourname": "𐌰𐍄𐌲𐌰𐌲𐌲𐌰𐌽𐌰𐌼𐍉",
        "cannotloginnow-title": "𐌽𐌿 𐌽𐌹 𐌼𐌰𐌲𐍄 𐌰𐍄𐌲𐌰𐌲𐌲𐌰𐌽",
        "login": "𐌰𐍄𐌲𐌰𐌲𐌲",
        "nav-login-createaccount": "𐌰𐍄𐌲𐌰𐌲𐌲 / 𐍃𐌺𐌰𐍀𐌴𐌹 𐌺𐌰𐍅𐍄𐍃𐌾𐍉𐌽",
-       "userlogin": "𐌰𐍄𐌲𐌰𐌲𐌲 / 𐍃𐌺𐌰𐍀𐌴𐌹 𐌺𐌰𐍅𐍄𐍃𐌾𐍉𐌽",
-       "userloginnocreate": "𐌰𐍄𐌲𐌰𐌲𐌲",
        "logout": "𐌰𐍆𐌻𐌴𐌹𐌸",
        "userlogout": "𐌰𐍆𐌻𐌴𐌹𐌸",
        "userlogin-noaccount": "𐌽𐌹 𐌷𐌰𐌱𐌰𐌹𐍃 𐌺𐌰𐍅𐍄𐍃𐌾𐍉𐌽?",
        "userlogin-joinproject": "𐌲𐌰𐌳𐌰𐌹𐌻𐌴𐌹 𐌹𐌽 𐌽𐌰𐍄𐌾𐌰𐍃𐍄𐌰𐌳𐌰 {{SITENAME}}",
-       "nologinlink": "𐍃𐌺𐌰𐍀𐌴𐌹 𐌺𐌰𐍅𐍄𐍃𐌾𐍉𐌽",
        "createaccount": "𐍃𐌺𐌰𐍀𐌴𐌹 𐌺𐌰𐍅𐍄𐍃𐌾𐍉𐌽",
-       "gotaccount": "𐌾𐌿 𐌺𐌰𐍅𐍄𐍃𐌾𐍉𐌽 𐌷𐌰𐌱𐌰𐌹𐍃? $1.",
-       "gotaccountlink": "𐌰𐍄𐌲𐌰𐌲𐌲",
        "userlogin-resetpassword-link": "𐌿𐍆𐌰𐍂𐌼𐌿𐌽𐌽𐍉𐌳𐌴𐍃 𐌸𐌴𐌹𐌽𐌰𐌼𐌼𐌰 𐌲𐌰𐌼𐍉𐍄𐌰𐍅𐌰𐌿𐍂𐌳𐌰?",
        "userlogin-helplink2": "𐌷𐌹𐌻𐍀𐌰 𐌼𐌹𐌸 𐌰𐍄𐌲𐌰𐌲𐌲𐌰",
        "createacct-emailoptional": "𐌴-𐌱𐍉𐌺𐍉𐍃 (𐌼𐌰𐌷𐍄𐌴𐌹𐌲𐍉𐍃)",
        "createacct-email-ph": "𐌼𐌴𐌻𐌴𐌹 𐌸𐌴𐌹𐌽𐍉𐍃 𐌴-𐌱𐍉𐌺𐍉𐍃",
-       "createaccountreason": "𐌲𐍂𐌿𐌽𐌳𐌿𐍃:",
        "createacct-reason": "𐌲𐍂𐌿𐌽𐌳𐌿𐍃",
        "createacct-submit": "𐍃𐌺𐌰𐍀𐌴𐌹 𐌸𐌴𐌹𐌽𐌰 𐌺𐌰𐍅𐍄𐍃𐌾𐍉𐌽",
        "createacct-benefit-heading": "{{SITENAME}} 𐍄𐌰𐍅𐌹𐌸 𐌹𐍃𐍄 𐍆𐍂𐌰𐌼 𐌼𐌰𐌽𐌽𐌰𐌼 𐍃𐍅𐌴 𐌸𐌿𐌺.",
        "minoredit": "𐌸𐌰𐍄𐌰 𐌹𐍃𐍄 𐌼𐌹𐌽𐌽𐌹𐌶𐌴𐌹 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍃",
        "watchthis": "𐌰𐍄𐍅𐌹𐍄 𐌻𐌰𐌿𐌱𐌰",
        "savearticle": "𐌲𐌰𐍆𐌰𐍃𐍄 𐌻𐌰𐌿𐍆",
+       "publishpage": "𐌼𐌴𐍂𐌴𐌹 𐌻𐌰𐌿𐍆",
        "preview": "𐍆𐌰𐌿𐍂𐌰𐍃𐌹𐌿𐌽𐍃",
        "showpreview": "𐌰𐍄𐌰𐌿𐌲𐌴𐌹 𐍆𐌰𐌿𐍂𐌰𐍃𐌹𐌿𐌽",
        "showdiff": "𐌰𐍄𐌰𐌿𐌲𐌴𐌹 𐌹𐌽𐌼𐌰𐌹𐌳𐌹𐌽𐌹𐌽𐍃",
index b4db8f3..e6d3e06 100644 (file)
@@ -46,7 +46,7 @@
        "tog-previewontop": "Vorschou oberhalb vom Editierfänschter aazeige",
        "tog-previewonfirst": "Vorschou scho bim ersten Editieren azeige",
        "tog-enotifwatchlistpages": "Schick mer e Mail, wänn e Syte oder e Datei gänderet wird, wun i beobachte due",
-       "tog-enotifusertalkpages": "Schick mer es Mail, we öpper myni Benutzerdiskussionssyte het gänderet",
+       "tog-enotifusertalkpages": "Schick mer es Mail, we öpper myni Benutzerdiskussionssyte het gänderet",
        "tog-enotifminoredits": "Au bi chlaine Änderige an Syte oder Dateie ne Mail schicke",
        "tog-enotifrevealaddr": "Dyni E-Mail-Adrässe wird i Benachrichtigungsmails zeigt",
        "tog-shownumberswatching": "Aazahl Benutzer aazeige, wo ne Syten am Aaluege sy (i den Artikelsyte, i de «letschten Änderigen» und i der Beobachtigslischte)",
@@ -58,6 +58,7 @@
        "tog-watchlisthidebots": "Bot-Änderige in d Beobachtigslischt usblende",
        "tog-watchlisthideminor": "Chlyni Änderige nit in de Beobachtigslischte aazeige",
        "tog-watchlisthideliu": "Bearbeitige vu aagmäldete Benutzer usblände",
+       "tog-watchlistreloadautomatically": "Wänn e Filter gänderet woren isch, d Beobachtigslischt automatisch nei lade (brucht JavaScript)",
        "tog-watchlisthideanons": "Bearbeitige vu anonyme Benutzer (IP-Adresse) usblände",
        "tog-watchlisthidepatrolled": "vum Fäldhieter aagluegti Änderige in dr Beobachtigslischt usblände",
        "tog-watchlisthidecategorization": "Kategorisierig vo de Syte nid zeige",
        "tagline": "Us {{SITENAME}}",
        "help": "Hilf",
        "search": "Suech",
+       "search-ignored-headings": " #<!-- die Zylede nit ändere --> <pre>\n# Iberschrifte, wu vu dr Suechi ignoriert wäre.\n# Die Änderige wäre wirksam, sobald d Syte mit dr Iberschrift indexiert woren isch.\n# Du chasch d Sytenindexierig zwinge, indäm e Nulledit machsch.\n# Syntax:\n#   * Alles, was bis zum Zyledenänd noch ere Rute („#“) chunnt, isch e Kommentar.\n#   * E jedi nit-lääri Zylede isch dr Titel, wu exakt mueß ignoriert wäre.\nFueßnote\nWeblink\nLueg au\n #</pre> <!-- die Zylede nit ändere -->",
        "searchbutton": "Suech",
        "go": "Site",
        "searcharticle": "Sueche",
        "history": "Versione",
        "history_short": "Versione/Autore",
+       "history_small": "Versionsgschicht",
        "updatedmarker": "(gändret syt mym letschte Bsuech)",
        "printableversion": "Druck-Aasicht",
        "permalink": "Bschtändigi URL",
        "databaseerror-query": "Abfrog: $1",
        "databaseerror-function": "Funktion: $1",
        "databaseerror-error": "Fähler: $1",
+       "transaction-duration-limit-exceeded": "Go ne großi Verzegerig in dr Datereplikation z vermyyde, isch die Transaktion abbroche wore. D Schrybduur ($1) het d Gränze vu $2 Sekunden iberschritte. Wänn du vyl Objäkt uf s Mol ändere duesch, versuech statt däm, d Änderige uf mehreri Operationen ufzdeile.",
        "laggedslavemode": "Warnig: di letschte Änderige wäre u. U. nonig aazeigt!",
        "readonly": "Datebank isch gsperrt",
        "enterlockreason": "Bitte gib e Grund y, worum d Datebank soll gsperrt wäre un e Yschätzig wie lang si soll gsperrt blybe",
-       "readonlytext": "D {{SITENAME}}-Datebank isch e Zyd lang gsperrt fir Nejytreg un Änderige. Bitte versuech s speter no mol.\n\nGrund vu dr Sperrig: $1",
+       "readonlytext": "D Datebank isch e Zyt lang gsperrt fir Nejyytreg un Änderige. Bitte versuech s speter no mol.\n\nGrund vu dr Sperrig: $1",
        "missing-article": "Dr Täkscht fir „$1“ $2 isch nit in dr Datebank gfunde wore.\n\nDie Syte isch villicht glescht oder verschobe wore.\n\nWänn s des nit isch, hesch villicht e Fähler in dr Software gfunde. Bitte mäld des eme [[Special:ListUsers/sysop|Ammann]] un gib d URL derzue aa.",
        "missingarticle-rev": "(Versionsnummere: $1)",
        "missingarticle-diff": "(Unterschid zwische Versione: $1, $2)",
        "readonly_lag": "D Datebank isch automatisch gperrt wore, wil di verteilte Datebankserver (Sklave) mien mit em Hauptdatebankserver (Meischter) abgliche wäre.",
+       "nonwrite-api-promise-error": "Dr HTTP-Header „Promise-Non-Write-API-Action“ isch gsändet wore, aber d Aafrog isch an e API-Schrybmodul gange.",
        "internalerror": "Interner Fähler",
        "internalerror_info": "Interne Fähler: $1",
        "internalerror-fatal-exception": "Fatale Uusnahmefähler vum Typ „$1“",
        "cannotloginnow-title": "Aamälde goot grad nit",
        "cannotloginnow-text": "Aamälde goot nit, derwyylscht du $1 bruuchsch",
        "cannotcreateaccount-title": "Benutzerkonto cha nid aagleit wäre.",
+       "cannotcreateaccount-text": "S diräkt Aalege vu Benutzerkonten isch uf däm Wiki nit aktiviert.",
        "yourdomainname": "Dyyni Domäne",
        "password-change-forbidden": "Du chasch uf däm Wiki kei Passwerter ändere.",
        "externaldberror": "Entwäder s lit e Fähler bi dr externe Authentifizierung vor, oder Du derfsch Dyy extern Benutzerkonto nid aktualisiere.",
        "userlogin-resetpassword-link": "Passwort vergässe?",
        "userlogin-helplink2": "Hilf bim Aamälde",
        "userlogin-loggedin": "Du bisch scho as {{GENDER:$1|$1}} aagmäldet.\nBruuch s Formular unte go Di unter eme andere Benutzername aamälde.",
+       "userlogin-reauth": "Du muesch di nomol aamälde go z verifiziere, ass du {{GENDER:$1|$1}} bisch.",
        "userlogin-createanother": "En ander Benutzerkonto aalege",
        "createacct-emailrequired": "E-Mail-Adräss",
        "createacct-emailoptional": "E-Mail-Adräss (optional)",
        "createacct-email-ph": "Gib Dyy E-Mail-Adräss yy",
        "createacct-another-email-ph": "Gib Dyy E-Mail-Adräss yy",
        "createaccountmail": "E temporär Zuefallspasswort bruuchen un an di aagee E-Mail-Adräss schicke",
+       "createaccountmail-help": "Cha brucht wäre zum e Benutzerkonto fir e anderi Person aazlege, ohni ass mer s Passwort mueß wisse.",
        "createacct-realname": "Richtige Name (optional)",
        "createacct-reason": "Grund",
        "createacct-reason-ph": "Wurum Du ne ander Benutzerkonto aaleisch",
+       "createacct-reason-help": "Im Neiaamäldigs-Logbuech aazeigti Nochricht",
        "createacct-submit": "Dyy Benutzerkonto aalege",
        "createacct-another-submit": "Benutzerkonto aalege",
+       "createacct-continue-submit": "Wytermache mit em Aalege vun eme Benutzerkonto",
+       "createacct-another-continue-submit": "Wytermache mit em Aalege vun eme Benutzerkonto",
        "createacct-benefit-heading": "{{SITENAME}} wird vu Mänsche wie Dir gschaffe.",
        "createacct-benefit-body1": "{{PLURAL:$1|Bearbeitig|Bearbeitige}}",
        "createacct-benefit-body2": "{{PLURAL:$1|Syte|Syte}}",
        "nocookiesnew": "Dr Benutzerzuegang isch aaglait wore, aber Du bisch nid yygloggt. {{SITENAME}} brucht fir die Funktion Cookies, bitte tue die aktiviere un logg Di derno mit Dyynem neje Benutzername un em Passwort, wu drzue ghert, yy.",
        "nocookieslogin": "{{SITENAME}} brucht Cookies fir e Aamäldig. Du hesch d Cookies deaktiviert. Aktivier si bitte un versuech s no mol.",
        "nocookiesfornew": "S Benutzerkonto isch nit aagleit wore, wel d Datehärchumft nit het chenne uusgmacht wäre.\nS mueß sichergstellt syy, ass Cookies aktiviert sin. Derno ddie Syte nomol lade un s wider versueche.",
+       "createacct-loginerror": "S Benutzerkonto isch erfolgrych aagleit wore, aber du hesch nit chenne automatisch aagmäldet wäre. Bitte mach wyter mit dr [[Special:UserLogin|manuälle Aamäldig]].",
        "noname": "Du muesch e Benutzername aagee.",
-       "loginsuccesstitle": "Aamäldig erfolgrych",
+       "loginsuccesstitle": "Aagmäldet",
        "loginsuccess": "'''Du bisch jetz als \"$1\" bi {{SITENAME}} aagmäldet.'''",
-       "nosuchuser": "Dr Benutzername \"$1\" git s nit.\n\nIberprief d Schrybwys, oder mäld Di as [[Special:CreateAccount|neje Benutzer aa]].",
+       "nosuchuser": "Dr Benutzername „$1“ git s nit.\n\nIberprief d Schrybwys, au d Groß- un Chlaischrybig, oder mäld Di as [[Special:CreateAccount|neje Benutzer aa]].",
        "nosuchusershort": "S git kei Benutzername „$1“. Bitte iberprief d Schrybwys.",
        "nouserspecified": "Bitte gib e Benutzername yy.",
        "login-userblocked": "Dää Benutzer isch gsperrt. Aamäldig nit erlaubt.",
        "minoredit": "Numen es birebitzeli gänderet",
        "watchthis": "Dä Artikel beobachte",
        "savearticle": "Syte spychere",
+       "publishpage": "Syte spychere",
+       "publishchanges": "Änderige spychere",
        "preview": "Vorschou",
        "showpreview": "Vorschau aaluege",
        "showdiff": "Änderige zeige",
        "prefs-tokenwatchlist": "Schlüssel für persönleche Webfeed",
        "prefs-diffs": "Versionsverglych",
        "prefs-help-prefershttps": "Die Ystellig würkt sech uus, we du di ds nächste Mal amäldisch.",
-       "prefswarning-warning": "Du hesch Ystellige gänderet wo no nid gspycheret sy.\nWe du die Syte verlasch, ohni uf «$1» z drücke, de gö die Änderige verlore.",
+       "prefswarning-warning": "Du hesch Ystellige gänderet wo no nid gspycheret sy.\nWe du die Syte verlasch, ohni uf «$1» z drücke, de gö die Änderige verlore.",
        "prefs-tabs-navigation-hint": "Tipp: Mit der linggen u der rächte Pfyltaste chasch zwüsche de Tabs wächsle.",
        "userrights": "Benutzerrächtsverwaltig",
        "userrights-lookup-user": "Verwalt d Gruppezuegherigkeit",
        "notvisiblerev": "Version isch glescht wore",
        "watchlist-details": "{{PLURAL:$1|1 Syte wird|$1 Syte wärde}} beobachtet (Diskussionssyte nid zelt, aber ou beobachtet).",
        "wlheader-enotif": "E-Mail-Benachrichtigung isch aktiviert.",
-       "wlheader-showupdated": "Syte, wo syt em letste Bsuech hei gänderet, sy <strong>fett</strong> dargstellt.",
+       "wlheader-showupdated": "Syte, wo syt em letste Bsuech hei gänderet, sy <strong>fett</strong> dargstellt.",
        "wlnote": "Unde {{PLURAL:$1|steit di letsti Änderig|stöh di letste <strong>$1</strong> Änderigen}} us {{PLURAL:$2|der letste Stund|de letste <strong>$2</strong> Stunde}}. Stand: $3, $4 Uhr.",
        "wlshowlast": "Zeig di letste $1 Stunden und $2 Täg",
        "watchlist-options": "Aazeigoptione",
        "changecontentmodel-title-label": "Sytetitel",
        "changecontentmodel-model-label": "Nöüs Inhaltsmodäll",
        "changecontentmodel-reason-label": "Grund:",
-       "changecontentmodel-success-title": "Ds Inhaltsmodäll het gänderet",
-       "changecontentmodel-success-text": "Der Inhaltstyp vo [[:$1]] het gänderet.",
+       "changecontentmodel-success-title": "Ds Inhaltsmodäll het gänderet",
+       "changecontentmodel-success-text": "Der Inhaltstyp vo [[:$1]] het gänderet.",
        "changecontentmodel-cannot-convert": "Der Inhalt vo [[:$1]] lat sech nid zum Typ $2 la konvertiere.",
        "changecontentmodel-nodirectediting": "Ds Inhaltsmodäll «$1» lat ds diräkte Bearbeite nid zue",
        "log-name-contentmodel": "Protokoll vo Inhaltsmodälländerige",
        "log-description-contentmodel": "Ereignis, wo mit em Inhaltsmodäll von ere Syte z tüe hei",
-       "logentry-contentmodel-change": "{{GENDER:$2|Der $1|D $1|$1}} het ds Inhaltsmodäll vor Syte $3 gänderet vo «$4» uf «$5»",
+       "logentry-contentmodel-change": "{{GENDER:$2|Der $1|D $1|$1}} het ds Inhaltsmodäll vor Syte $3 gänderet vo «$4» uf «$5»",
        "logentry-contentmodel-change-revertlink": "zrüggsetze",
        "logentry-contentmodel-change-revert": "zrüggsetze",
        "protectlogpage": "Syteschutz-Logbuech",
        "undeleteviewlink": "aaluege",
        "undeleteinvert": "Uswahl umchehre",
        "undeletecomment": "Grund:",
-       "undeletedrevisions": "{{PLURAL:$1|ei Revision|$1 Revisione}} wider zruckgholt.",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 Version|$1 Versione}} un {{PLURAL:$2|1 Datei|$2 Dateie}} sin widerhärgstellt wore",
-       "undeletedfiles": "{{PLURAL:$1|1 Datei isch|$1 Dateie sin}} widerhärgstellt wore",
        "cannotundelete": "D Widerhärstellig isch nit gange:\n\n$1",
        "undeletedpage": "'''„$1“''' isch widerhärgstellt wore.\n\nIm [[Special:Log/delete|Lesch-Logbuech]] findsch e Ibersicht vu dr gleschte un widerhärgstellte Syte.",
        "undelete-header": "Lueg im [[Special:Log/delete|Lesch-Logbuech]] no Syte, wu in dr letschte Zyt glescht wore sin.",
        "logentry-block-unblock": "{{GENDER:$2|Der $1|D $1|$1}} het {{GENDER:$4|der $3|d $3|$3}} entsperrt",
        "logentry-block-reblock": "{{GENDER:$2|Der $1|D $1|$1}} het {{GENDER:$4|der $3|d $3|$3}} bis $5 gsperrt $6",
        "logentry-suppress-block": "{{GENDER:$2|Der $1|D $1|$1}} het {{GENDER:$4|der $3|d $3|$3}} bis $5 gsperrt $6",
-       "logentry-suppress-reblock": "{{GENDER:$2|Der $1|D $1|$1}} het d Sperrystellige {{GENDER:$4|füre $3|für d $3|für $3}} bis $5 gänderet $6",
+       "logentry-suppress-reblock": "{{GENDER:$2|Der $1|D $1|$1}} het d Sperrystellige {{GENDER:$4|füre $3|für d $3|für $3}} bis $5 gänderet $6",
        "logentry-import-upload": "{{GENDER:$2|Der $1|D $1|$1}} het $3 importiert per Datei-Ufelade",
        "logentry-import-interwiki": "{{GENDER:$2|Der $1|D $1|$1}} het $3 vomenen andere Wiki importiert",
        "logentry-merge-merge": "{{GENDER:$2|Der $1|D $1|$1}} het $3 i $4 zämegfüert (Versione bis $5)",
        "logentry-protect-unprotect": "{{GENDER:$2|Der $1|D $1|$1}} het der Schutz vor Syte $3 furtgnoh.",
        "logentry-protect-protect": "{{GENDER:$2|Der $1|D $1|$1}} het d Syte $3 gschützt $4",
        "logentry-protect-protect-cascade": "{{GENDER:$2|Der $1|D $1|$1}} het d Syte $3 gschützt $4 [mit Kaskade]",
-       "logentry-protect-modify": "{{GENDER:$2|Der $1|D $1|$1}} het ds Schutzniveau vor Syte $3 gänderet $4",
-       "logentry-protect-modify-cascade": "{{GENDER:$2|Der $1|D $1|$1}} het ds Schutzniveau vor Syte $3 gänderet $4 [mit Kaskade]",
+       "logentry-protect-modify": "{{GENDER:$2|Der $1|D $1|$1}} het ds Schutzniveau vor Syte $3 gänderet $4",
+       "logentry-protect-modify-cascade": "{{GENDER:$2|Der $1|D $1|$1}} het ds Schutzniveau vor Syte $3 gänderet $4 [mit Kaskade]",
        "logentry-rights-rights": "{{GENDER:$2|Der $1|D $1|$1}} het d Gruppezuegherigkeit fir $3 vu $4 uf $5 gänderet",
        "logentry-rights-rights-legacy": "{{GENDER:$2|Der $1|D $1|$1}} het d Gruppezuegherigkeit fir $3 gänderet",
        "logentry-rights-autopromote": "{{GENDER:$2|Der $1|D $1|$1}} isch automatisch vo $4 uf $5 beförderet worde",
        "log-name-pagelang": "Sprachänderigs-Logbuech",
        "log-description-pagelang": "Das isch es Logbuech für Änderige vo Sytesprache.",
        "logentry-pagelang-pagelang": "{{GENDER:$2|Der $1|D $1|$1}} het d Sytesprach vo $3 vo $4 uf $5 g’änderet.",
-       "default-skin-not-found": "He nu so de! Di vorygstellti Benutzeroberflächi für dys Wiki – definiert under <code dir=\"ltr\">$wgDefaultSkin</code> als <code>$1</code> – steit nid zur Verfüegig.\n\nI dyren Installation het’s schynt’s di {{PLURAL:$4|folgendi Benutzeroberflächi|folgende Benutzeroberflächine}}:\n\n$2\n\nLueg under [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Skin configuration] für Information drüber, wie d’se chasch {{PLURAL:$4|aktiviere|aktivieren und eini dervo chasch vorystelle}}.\n\n; Falls du MediaWiki grad installiert hesch:\n: Müglecherwys hesch es ab git installiert oder mit eren andere Methode diräkt ab em Quellcode. De isch es z erwarte. Probier [https://www.mediawiki.org/wiki/Category:All_skins Benutzeroberflächine us em Verzeichnis vo mediawiki.org] z installiere. Es git mehreri Müglechkeite derzue:\n:* Der [https://www.mediawiki.org/wiki/Download Installierer als tar.gz-Datei] abelade. Är het mehreri Benutzeroberflächinen und Erwyterige derby. Du chasch ds Benutzeroberflächine-Verzeichnis <code>skins/</code> druus use kopiere.\n:* tar.gz-Dateie für einzelni Benutzeroberflächine vo [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org] abelade.\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins Git zum Abelade vo MediaWiki-Benutzeroberflächine bruuche].\n: We du e MediaWiki-Entwickler/in bisch, söt’s derby nid zu Konflikte mit dym git repository cho.\n\n; Falls du MediaWiki grad ufe nöüst Stand hesch ’bracht:\n: MediaWiki ab 1.24 aktiviert di installierte Benutzeroberflächine nümm automatisch (lueg [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: Skin autodiscovery]). Für di {{PLURAL:$5|installierti Benutzeroberflächi|installierte Benutzeroberflächine}} z aktiviere, chasch di {{PLURAL:$5|folgendi Zyle|folgende Zyle}} i d Datei <code>LocalSettings.php</code> kopiere:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Falls du grad d Datei <code>LocalSettings.php</code> hesch g’änderet:\n: Lueg genau nache, öb’s vilech Tippfähler het i de Näme vo de Benutzeroberflächine.",
-       "default-skin-not-found-no-skins": "He nu so de! Di vorygstellti Benutzeroberflächi für dys Wiki – definiert under <code dir=\"ltr\">$wgDefaultSkin</code> als <code>$1</code> – steit nid zur Verfüegig.\n\nDu hesch kener Benutzeroberflächinen installiert.\n\n; Falls du MediaWiki grad installiert oder ufe nöüst Stand ’bracht hesch:\n: Müglecherwys hesch es ab git installiert oder mit eren andere Methode diräkt ab em Quellcode. De isch es z erwarte. MediaWiki ab 1.24 het kener Benutzeroberflächinen im Houpt-Repository derby. Probier [https://www.mediawiki.org/wiki/Category:All_skins Benutzeroberflächine us em Verzeichnis vo mediawiki.org] z installiere. Es git mehreri Müglechkeite derzue:\n:* Der [https://www.mediawiki.org/wiki/Download Installierer als tar.gz-Datei] abelade. Är het mehreri Benutzeroberflächinen und Erwyterige derby. Du chasch ds Benutzeroberflächine-Verzeichnis <code>skins/</code> druus use kopiere.\n:* tar.gz-Dateie für einzelni Benutzeroberflächine vo [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org] abelade.\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins Git zum Abelade vo MediaWiki-Benutzeroberflächine bruuche].\n: We du e MediaWiki-Entwickler/in bisch, söt’s derby nid zu Konflikte mit dym Git-Repository cho. Lueg under [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Skin configuration] für Information drüber, wie du Benutzeroberflächi chasch aktivieren und vorystelle.",
+       "default-skin-not-found": "He nu so de! Di vorygstellti Benutzeroberflächi für dys Wiki – definiert under <code dir=\"ltr\">$wgDefaultSkin</code> als <code>$1</code> – steit nid zur Verfüegig.\n\nI dyren Installation het’s schynt’s di {{PLURAL:$4|folgendi Benutzeroberflächi|folgende Benutzeroberflächine}}:\n\n$2\n\nLueg under [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Skin configuration] für Information drüber, wie d se chasch {{PLURAL:$4|aktiviere|aktivieren und eini dervo chasch vorystelle}}.\n\n; Falls du MediaWiki grad installiert hesch:\n: Müglecherwys hesch es ab git installiert oder mit eren andere Methode diräkt ab em Quellcode. De isch es z erwarte. Probier [https://www.mediawiki.org/wiki/Category:All_skins Benutzeroberflächine us em Verzeichnis vo mediawiki.org] z installiere. Es git mehreri Müglechkeite derzue:\n:* Der [https://www.mediawiki.org/wiki/Download Installierer als tar.gz-Datei] abelade. Är het mehreri Benutzeroberflächinen und Erwyterige derby. Du chasch ds Benutzeroberflächine-Verzeichnis <code>skins/</code> druus use kopiere.\n:* tar.gz-Dateie für einzelni Benutzeroberflächine vo [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org] abelade.\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins Git zum Abelade vo MediaWiki-Benutzeroberflächine bruuche].\n: We du e MediaWiki-Entwickler/in bisch, söt s derby nid zu Konflikte mit dym git Repositorium cho.\n\n; Falls du MediaWiki grad ufe nöüst Stand hesch bbracht:\n: MediaWiki ab 1.24 aktiviert di installierte Benutzeroberflächine nümm automatisch (lueg [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: Skin autodiscovery]). Für di {{PLURAL:$5|installierti Benutzeroberflächi|installierte Benutzeroberflächine}} z aktiviere, chasch di {{PLURAL:$5|folgendi Zyle|folgende Zyle}} i d Datei <code>LocalSettings.php</code> kopiere:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Falls du grad d Datei <code>LocalSettings.php</code> hesch gänderet:\n: Lueg genau nache, öb s vilech Tippfähler het i de Näme vo de Benutzeroberflächine.",
+       "default-skin-not-found-no-skins": "He nu so de! Di vorygstellti Benutzeroberflächi für dys Wiki – definiert under <code dir=\"ltr\">$wgDefaultSkin</code> als <code>$1</code> – steit nid zur Verfüegig.\n\nDu hesch kener Benutzeroberflächinen installiert.\n\n; Falls du MediaWiki grad installiert oder ufe nöüst Stand bracht hesch:\n: Müglecherwys hesch es ab git installiert oder mit eren andere Methode diräkt ab em Quellcode. De isch es z erwarte. MediaWiki ab 1.24 het kener Benutzeroberflächinen im Houpt-Repository derby. Probier [https://www.mediawiki.org/wiki/Category:All_skins Benutzeroberflächine us em Verzeichnis vo mediawiki.org] z installiere. Es git mehreri Müglechkeite derzue:\n:* Der [https://www.mediawiki.org/wiki/Download Installierer als tar.gz-Datei] abelade. Är het mehreri Benutzeroberflächinen und Erwyterige derby. Du chasch ds Benutzeroberflächine-Verzeichnis <code>skins/</code> druus use kopiere.\n:* tar.gz-Dateie für einzelni Benutzeroberflächine vo [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org] abelade.\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins Git zum Abelade vo MediaWiki-Benutzeroberflächine bruuche].\n: We du e MediaWiki-Entwickler/in bisch, söt s derby nid zu Konflikte mit dym Git-Repositorium cho. Lueg under [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Skin configuration] für Information drüber, wie du Benutzeroberflächi chasch aktivieren und vorystelle.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (aktiviert)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 (<strong>deaktiviert</strong>)",
        "mediastatistics": "Statistike zu Dateitype",
index 59593c6..a69343a 100644 (file)
@@ -37,7 +37,8 @@
                        "IKhitron",
                        "Matma Rex",
                        "Or",
-                       "שמזן"
+                       "שמזן",
+                       "Uziel302"
                ]
        },
        "tog-underline": "סימון קישורים בקו תחתי:",
        "post-expand-template-argument-warning": "'''אזהרה:''' דף זה כולל לפחות תבנית אחת שבה פרמטרים גדולים מדי.\nפרמטרים אלה הושמטו.",
        "post-expand-template-argument-category": "דפים שבהם הושמטו פרמטרים של תבניות",
        "parser-template-loop-warning": "נמצאה תבנית הקוראת לעצמה: [[$1]]",
+       "template-loop-category": "דפים עם לולאות בתבנית",
+       "template-loop-category-desc": "הדף הזה מכיל לולאה בתבנית, כלומר תבנית שקוראת לעצמה באופן רקורסיבי.",
        "parser-template-recursion-depth-warning": "עומק התבניות המוכללות זו בזו עבר את המגבלה ($1)",
        "language-converter-depth-warning": "עומק ממיר השפה עבר את המגבלה ($1)",
        "node-count-exceeded-category": "דפים שבהם מספר הצמתים גדול מדי",
        "page_first": "ראשון",
        "page_last": "אחרון",
        "histlegend": "בחירת גרסאות להשוואה: {{GENDER:|בחר|בחרי|בחרו}} את הגרסאות ש{{GENDER:|ברצונך|ברצונך|ברצונכם}} להשוות ולאחר מכן {{GENDER:|הקש|הקישי|הקישו}} על Enter או {{GENDER:|לחץ|לחצי|לחצו}} על הכפתור שלמטה.<br />\nמקרא: <strong>({{int:cur}})</strong> = השוואה עם הגרסה הנוכחית, <strong>({{int:last}})</strong> = השוואה עם הגרסה הקודמת, <strong>{{int:minoreditletter}}</strong> = עריכה משנית.",
-       "history-fieldset-title": "×\97×\99פ×\95ש ×\91×\94×\99ס×\98×\95ר×\99×\99ת ×\94×\93×£",
+       "history-fieldset-title": "×\97×\99פ×\95ש ×\92רס×\90×\95ת",
        "history-show-deleted": "גרסאות מוסתרות בלבד",
        "histfirst": "הישנות ביותר",
        "histlast": "החדשות ביותר",
        "saveusergroups": "שמירת הקבוצות של ה{{GENDER:$1|משתמש|משתמשת}}",
        "userrights-groupsmember": "{{GENDER:$2|חבר|חברה}} ב{{PLURAL:$1|קבוצה|קבוצות}}:",
        "userrights-groupsmember-auto": "{{GENDER:$2|חבר|חברה}} אוטומטית ב{{PLURAL:$1|קבוצה|קבוצות}}:",
-       "userrights-groups-help": "באפשרותך לשנות את הקבוצות ש{{GENDER:$1|משתמש זה חבר|משתמשת זו חברה}} בהן:\n* תיבה מסומנת פירושה שה{{GENDER:$1|משתמש כבר חבר|משתמשת כבר חברה}} בקבוצה.\n* תיבה בלתי מסומנת פירושה שה{{GENDER:$1|משתמש אינו חבר|משתמשת אינה חברה}} בקבוצה.\n* סימון * פירושו שלא יהיה באפשרותך להסיר את ה{{GENDER:$1|משתמש|משתמשת}} מהקבוצה לאחר שהוספת {{GENDER:$1|אותו|אותה}} אליה, או להפך.\n* סימון # פירושו שבאפשרותך רק לאחר את זמן הפקיעה של קבוצה זו; אין באפשרותך להקדימו.",
+       "userrights-groups-help": "×\91×\90פשר×\95ת×\9a ×\9cשנ×\95ת ×\90ת ×\94ק×\91×\95צ×\95ת ×©{{GENDER:$1|×\9eשת×\9eש ×\96×\94 ×\97×\91ר|×\9eשת×\9eשת ×\96×\95 ×\97×\91ר×\94}} ×\91×\94×\9f:\n* ×ª×\99×\91×\94 ×\9eס×\95×\9eנת ×¤×\99ר×\95ש×\94 ×©×\94{{GENDER:$1|×\9eשת×\9eש ×\9b×\91ר ×\97×\91ר|×\9eשת×\9eשת ×\9b×\91ר ×\97×\91ר×\94}} ×\91ק×\91×\95צ×\94.\n* ×ª×\99×\91×\94 ×\91×\9cת×\99 ×\9eס×\95×\9eנת ×¤×\99ר×\95ש×\94 ×©×\94{{GENDER:$1|×\9eשת×\9eש ×\90×\99× ×\95 ×\97×\91ר|×\9eשת×\9eשת ×\90×\99× ×\94 ×\97×\91ר×\94}} ×\91ק×\91×\95צ×\94.\n* ×¡×\99×\9e×\95×\9f * ×¤×\99ר×\95ש×\95 ×©×\9c×\90 ×\99×\94×\99×\94 ×\91×\90פשר×\95ת×\9a ×\9c×\94ס×\99ר ×\90ת ×\94{{GENDER:$1|×\9eשת×\9eש|×\9eשת×\9eשת}} ×\9e×\94ק×\91×\95צ×\94 ×\9c×\90×\97ר ×©×\94×\95ספת {{GENDER:$1|×\90×\95ת×\95\90×\95ת×\94}} ×\90×\9c×\99×\94, ×\90×\95 ×\9c×\94פ×\9a.\n* ×¡×\99×\9e×\95×\9f # ×¤×\99ר×\95ש×\95 ×©×\91×\90פשר×\95ת×\9a ×¨×§ ×\9c×\90×\97ר ×\90ת ×\96×\9e×\9f ×\94פק×\99×¢×\94 ×©×\9c ×\94×\97×\91ר×\95ת ×\91ק×\91×\95צ×\94 ×\96×\95; ×\90×\99×\9f ×\91×\90פשר×\95ת×\9a ×\9c×\94ק×\93×\99×\9e×\95.",
        "userrights-reason": "סיבה:",
        "userrights-no-interwiki": "אין לך הרשאה לערוך הרשאות משתמש באתרים אחרים.",
        "userrights-nodatabase": "בסיס הנתונים $1 אינו קיים או אינו מקומי.",
        "userrights-expiry-options": "יום:1 day,שבוע:1 week,חודש:1 month,שלושה חודשים:3 months,שישה חודשים:6 months,שנה:1 year",
        "userrights-invalid-expiry": "זמן הפקיעה לקבוצה \"$1\" אינו תקין.",
        "userrights-expiry-in-past": "זמן הפקיעה לקבוצה \"$1\" הוא בעבר.",
-       "userrights-cannot-shorten-expiry": "אין באפשרותך להקדים את זמן הפקיעה של הקבוצה \"$1\". רק משתמשים בעלי הרשאה להוסיף ולהסיר את הקבוצה יכולים להקדים את זמן הפקיעה.",
+       "userrights-cannot-shorten-expiry": "×\90×\99×\9f ×\91×\90פשר×\95ת×\9a ×\9c×\94ק×\93×\99×\9d ×\90ת ×\96×\9e×\9f ×\94פק×\99×¢×\94 ×©×\9c ×\94×\97×\91ר×\95ת ×\91ק×\91×\95צ×\94 \"$1\". ×¨×§ ×\9eשת×\9eש×\99×\9d ×\91×¢×\9c×\99 ×\94רש×\90×\94 ×\9c×\94×\95ס×\99×£ ×\95×\9c×\94ס×\99ר ×\90ת ×\94ק×\91×\95צ×\94 ×\99×\9b×\95×\9c×\99×\9d ×\9c×\94ק×\93×\99×\9d ×\90ת ×\96×\9e×\9f ×\94פק×\99×¢×\94.",
        "userrights-conflict": "התנגשות בין שינויי הרשאות משתמש! אנא בִּדקו את השינויים שלכם ואשרו אותם.",
        "group": "קבוצה:",
        "group-user": "משתמשים",
        "rcfilters-invalid-filter": "מסנן בלתי־תקין",
        "rcfilters-empty-filter": "אין מסננים פעילים. כל התרומות מוצגות.",
        "rcfilters-filterlist-title": "מסננים",
+       "rcfilters-filterlist-whatsthis": "מה זה?",
        "rcfilters-filterlist-feedbacklink": "שליחת משוב על המסננים החדשים (בטא)",
        "rcfilters-highlightbutton-title": "הבלטת התוצאות",
        "rcfilters-highlightmenu-title": "בחירת צבע",
        "rcfilters-highlightmenu-help": "בחירת צבע להדגשת מאפיין זה",
        "rcfilters-filterlist-noresults": "לא נמצאו מסננים",
+       "rcfilters-noresults-conflict": "לא נמצאו תוצאות משום שקריטריוני החיפוש מתנגשים",
+       "rcfilters-state-message-subset": "המסנן הזה אינו משפיע כי התוצאות שלו כלולות {{PLURAL:$2|במסנן הרחב יותר הבא|במסננים הרחבים יותר הבאים}} (נסו להדגיש כדי להבדיל ביניהם): $1",
+       "rcfilters-state-message-fullcoverage": "בחירת כל המסננים בקבוצה זהה לביטול כל הבחירות, אז למסנן הזה אין השפעה. הקבוצה כוללת: $1",
        "rcfilters-filtergroup-registration": "רישום העורכים",
        "rcfilters-filter-registered-label": "רשומים",
        "rcfilters-filter-registered-description": "עורכים שנכנסו לחשבון.",
        "rcfilters-filter-unregistered-label": "לא רשומים",
        "rcfilters-filter-unregistered-description": "עורכים שלא נכנסו לחשבון.",
-       "rcfilters-filter-unregistered-conflicts-user-experience-level": "המסנן \"לא רשומים\" אינו פעיל כי השפעתו מתבטלת באמצעות {{PLURAL:$2|מסנן רמת הניסיון הבא, שמוצא|מסנני רמת הניסיון הבאים, שמוצאים}} רק משתמשים רשומים: $1",
+       "rcfilters-filter-unregistered-conflicts-user-experience-level": "המסנן הזה פעיל מתנגש עם {{PLURAL:$2|מסנן רמת הניסיון הבא, שמוצא|מסנני רמת הניסיון הבאים, שמוצאים}} רק משתמשים רשומים: $1",
        "rcfilters-filtergroup-authorship": "מבצעי העריכה",
        "rcfilters-filter-editsbyself-label": "עריכות שלך",
        "rcfilters-filter-editsbyself-description": "עריכות שביצעת בעצמך.",
        "rcfilters-filter-editsbyother-label": "עריכות של אחרים",
        "rcfilters-filter-editsbyother-description": "עריכות שבוצעו על־ידי משתמשים אחרים (מלבדך).",
        "rcfilters-filtergroup-userExpLevel": "רמת ניסיון (למשתמשים רשומים בלבד)",
-       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "×\94×\9eסנ×\9f ×\94×\96×\94 ×\90×\99× ×\95 ×¤×¢×\99×\9c ×\9b×\99 ×\94×\95×\90 ×\9e×\95צ×\90 ×¨×§ ×\9eשת×\9eש×\99×\9d ×¨×©×\95×\9e×\99×\9d, ×\95×\9c×\9b×\9f ×\94×\9eסנ×\9f \"×\9c×\90 ×¨×©×\95×\9e×\99×\9d\" ×\9e×\91×\98×\9c ×\90ת ×\94שפעת×\95.",
-       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "המסנן \"לא רשומים\" מתנגש עם אחד או יותר ממסנני רמת הניסיון. מסנני רמת ניסיון מוצאים משתמשים רשומים בלבד. המסננים המתנגשים מסומנים לעיל כבלתי־פעילים.",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "×\9eסננ×\99 ×\94× ×\99ס×\99×\95×\9f ×\9e×\95צ×\90×\99×\9d ×¨×§ ×\9eשת×\9eש×\99×\9d ×¨×©×\95×\9e×\99×\9d, ×\9b×\9a ×©×\9eסנ×\9f ×\96×\94 ×\9eתנ×\92ש ×¢×\9d ×\94×\9eסנ×\9f \"×\9c×\90 ×¨×©×\95×\9e×\99×\9d\".",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "המסנן \"לא רשומים\" מתנגש עם אחד או יותר ממסנני רמת הניסיון, שמוצאים משתמשים רשומים בלבד. המסננים המתנגשים מסומנים באזור המסננים הפעילים לעיל.",
        "rcfilters-filter-user-experience-level-newcomer-label": "חדשים",
        "rcfilters-filter-user-experience-level-newcomer-description": "פחות מ־10 עריכות ומ־4 ימים של פעילות.",
        "rcfilters-filter-user-experience-level-learner-label": "לומדים",
        "rcfilters-filter-categorization-description": "רישומים על דפים שנוספו לקטגוריות או הוסרו מהן.",
        "rcfilters-filter-logactions-label": "פעולות יומן",
        "rcfilters-filter-logactions-description": "פעולות מנהליות, יצירת חשבונות, מחיקת דפים, העלאות...",
+       "rcfilters-hideminor-conflicts-typeofchange-global": "מסנן \"עריכות משניות\" מתנגש עם מסנן סוג השינויים אחד או יותר, כי סוגים מסוימים של שינויים אינם יכולים להיות מסווגים בתור \"משניים\". המסננים המתנגשים מסומנים באזור המסננים הפעילים לעיל.",
+       "rcfilters-hideminor-conflicts-typeofchange": "סוגים מסוימים של שינויים אינם יכולים להיות מסווגים כ\"משניים\", כך שמסנן זה מתנגש עם מסנן סוג השינויים הבא: $1",
+       "rcfilters-typeofchange-conflicts-hideminor": "מסנן סוג השינויים הזה מתנגש עם מסנן \"עריכות משניות\". סוגים מסוימים של שינויים אינם יכולים מסווגים כ\"משניים\".",
        "rcnotefrom": "להלן {{PLURAL:$5|השינוי שבוצע|השינויים שבוצעו}} מאז <strong>$3, $4</strong> (מוצגים עד <strong>$1</strong>).",
+       "rclistfromreset": "איפוס בחירת התאריך",
        "rclistfrom": "הצגת שינויים חדשים החל מ־$2, $3",
        "rcshowhideminor": "$1 עריכות משניות",
        "rcshowhideminor-show": "הצגת",
        "php-uploaddisabledtext": "אפשרות העלאת הקבצים מבוטלת ברמת PHP. אנא בדקו את ההגדרה file_uploads.",
        "uploadscripted": "הקובץ כולל קוד סקריפט או HTML שעשוי להתפרש או להתבצע בטעות על־ידי הדפדפן.",
        "upload-scripted-pi-callback": "לא ניתן להעלות קובץ שמכיל את הוראת העיבוד XML-stylesheet.",
+       "upload-scripted-dtd": "לא ניתן להעלות קבצי SVG שכוללים הכרזת DTD לא־סטנדרטית.",
        "uploaded-script-svg": "נמצא אלמנט שאפשר לכתוב בו תסריט \"$1\" בקובץ ה־SVG שהועלה.",
        "uploaded-hostile-svg": "נמצא CSS בלתי־מאובטח באלמנט style בקובץ ה־SVG שהועלה.",
        "uploaded-event-handler-on-svg": "אסור להגדיר מאפייני טיפול באירועים <code dir=\"ltr\">$1=\"$2\"</code> בקובצי SVG.",
        "undeleteviewlink": "הצגה",
        "undeleteinvert": "הפיכת הבחירה",
        "undeletecomment": "סיבה:",
-       "undeletedrevisions": "{{PLURAL:$1|שוחזרה גרסה אחת|שוחזרו $1 גרסאות}}",
-       "undeletedrevisions-files": "{{PLURAL:$1|גרסה אחת|$1 גרסאות}} ו{{PLURAL:$2|קובץ אחד|־$2 קבצים}} שוחזרו",
-       "undeletedfiles": "{{PLURAL:$1|שוחזר קובץ אחד|שוחזרו $1 קבצים}}",
        "cannotundelete": "השחזור (או חלק ממנו) נכשל:\n$1",
        "undeletedpage": "<strong>הדף $1 שוחזר</strong>\n\nראו את [[Special:Log/delete|יומן המחיקות]] לרשימה של המחיקות והשחזורים שבוצעו לאחרונה.",
        "undelete-header": "{{GENDER:|ראה|ראי|ראו}} את [[Special:Log/delete|יומן המחיקות]] לרשימה של דפים שנמחקו לאחרונה.",
        "unblocked-id": "חסימה מספר $1 שוחררה.",
        "unblocked-ip": "[[Special:Contributions/$1|$1]] שוחררה מחסימתה.",
        "blocklist": "משתמשים חסומים",
+       "autoblocklist": "חסימות אוטומטיות",
+       "autoblocklist-submit": "חיפוש",
+       "autoblocklist-legend": "רשימת חסימות אוטומטיות",
+       "autoblocklist-localblocks": "{{PLURAL:$1|חסימה אוטומטית מקומית|חסימות אוטומטיות מקומיות}}",
+       "autoblocklist-empty": "רשימת החסימות האוטומטיות ריקה.",
+       "autoblocklist-otherblocks": "{{PLURAL:$1|חסימה אוטומטית אחרת|חסימות אוטומטיות אחרות}}",
        "ipblocklist": "משתמשים חסומים",
        "ipblocklist-legend": "מציאת משתמש חסום",
        "blocklist-userblocks": "הסתרת חסימות של משתמשים רשומים",
        "newimages-summary": "דף מיוחד זה מציג את הקבצים האחרונים שהועלו.",
        "newimages-legend": "מסנן",
        "newimages-label": "שם הקובץ (או חלק ממנו):",
+       "newimages-user": "כתובת IP או שם משתמש",
        "newimages-showbots": "הצגת העלאות שבוצעו על־ידי בוטים",
        "newimages-hidepatrolled": "הסתרת העלאות בדוקות",
        "noimages": "אין קבצים.",
        "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-restore": "$1 {{GENDER:$2|שחזר|שחזרה}} את הדף $3 ($4)",
+       "logentry-delete-restore-nocount": "$1 {{GENDER:$2|שחזר|שחזרה}} את הדף $3",
+       "restore-count-revisions": "{{PLURAL:$1|גרסה אחת|$1 גרסאות}}",
+       "restore-count-files": "{{PLURAL:$1|קובץ אחד|$1 קבצים}}",
        "logentry-delete-event": "$1 {{GENDER:$2|שינה|שינתה}} את מצב התצוגה של {{PLURAL:$5|פעולת יומן|$5 פעולות יומן}} של $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|שינה|שינתה}} את מצב התצוגה של {{PLURAL:$5|גרסה|$5 גרסאות}} בדף $3: $4",
        "logentry-delete-event-legacy": "$1 {{GENDER:$2|שינה|שינתה}} את מצב התצוגה של פעולות יומן של $3",
        "special-characters-group-thai": "תאית",
        "special-characters-group-lao": "לאו",
        "special-characters-group-khmer": "קמרית",
+       "special-characters-group-canadianaboriginal": "לשונות ילידיות קנדיות",
        "special-characters-title-endash": "קו מפריד",
        "special-characters-title-emdash": "קו מפריד ארוך",
        "special-characters-title-minus": "מינוס",
        "restrictionsfield-label": "טווחי כתובות IP מותרים:",
        "restrictionsfield-help": "כתובת IP אחת או טווח CIDR אחד בשורה. כדי לאפשר את הכול, ניתן להשתמש ב:<pre>0.0.0.0/0\n::/0</pre>",
        "revid": "גרסה $1",
-       "pageid": "מזהה דף $1"
+       "pageid": "מזהה דף $1",
+       "rawhtml-notallowed": "לא ניתן להשתמש בתגיות &lt;html&gt; מחוץ לדפים רגילים.",
+       "gotointerwiki": "עזיבת {{SITENAME}}",
+       "gotointerwiki-invalid": "הכותרת שצוינה אינה תקינה.",
+       "gotointerwiki-external": "{{GENDER:|אתה עומד|את עומדת|אתם עומדים}} לעזוב את {{SITENAME}} כדי לבקר באתר הנפרד \"[[$2]]\".\n\n[$1 {{GENDER:|לחץ|לחצי|לחצו}} כאן כדי להמשיך לכתובת $1].",
+       "undelete-cantedit": "אין באפשרותך לשחזר דף זה, כי אין באפשרותך לערוך אותו.",
+       "undelete-cantcreate": "אין באפשרותך לשחזר דף זה, כי אין דף קיים בשם זה ואין באפשרותך ליצור אותו."
 }
index 6bbe11e..b734764 100644 (file)
@@ -79,7 +79,8 @@
                        "Susant purohit",
                        "Jayprakash12345",
                        "Dr. Shikha Jaggi",
-                       "Shyamal"
+                       "Shyamal",
+                       "SatyamMishra"
                ]
        },
        "tog-underline": "कड़ियाँ अधोरेखन:",
        "tagline": "{{SITENAME}} से",
        "help": "सहायता",
        "search": "खोज",
+       "search-ignored-headings": " #<!-- इस पंक्ति को जैसा है वैसा ही रहने दें। --> <pre>\n# शीर्षक, जिसे खोजते समय अनदेखा कर दिया जाता है।\n# इसमें कोई भी बदलाव तुरंत दिखाई देता है, जब वह शीर्षक इंडेक्स हो जाता है।\n# आप किसी पृष्ठ को फिर से इंडेक्स करने के लिए रिक्त सम्पादन कर सकते हैं।\n# इन चिन्हों का पालन करें:\n#   * हर चीज जो \"#\" से शुरू होता है, वह केवल टिप्पणी है।\n#   * हर बिना रिक्त पंक्ति एक सटीक शीर्षक है, जो रूप आदि हर चीज को अनदेखा कर देता है।\nसन्दर्भ\nबाहरी कड़ियाँ\nइन्हें भी देखें\n #</pre> <!-- इस पंक्ति को जैसा है वैसा ही रहने दें।  -->",
        "searchbutton": "खोजें",
        "go": "जाएँ",
        "searcharticle": "जाएँ",
        "post-expand-template-argument-warning": "'''चेतावनी:''' इस पृष्ठ पर किसी साँचे में कम-से-कम एक ऐसा प्राचल है जो बढ़ाने पर बहुत बड़ा हो जायेगा।\nऐसे प्राचलों को छोड़ दिया गया है।",
        "post-expand-template-argument-category": "ऐसे पृष्ठ जिनमें प्राचल छोड़े गये हैं",
        "parser-template-loop-warning": "साँचा चक्र मिला: [[$1]]",
+       "template-loop-category": "टेम्पलेट लूप वाले पेज",
+       "template-loop-category-desc": "पृष्ठ में एक टेम्पलेट लूप है, अर्थात। एक टेम्पलेट जो स्वयं को पुनरावर्ती रूप से कॉल करता है",
        "parser-template-recursion-depth-warning": "साँचा पुनरावर्ती गहराई सीमा पार ($1)",
        "language-converter-depth-warning": "भाषा कन्वर्टर गहराई सीमा से बाहर गया ( $1 )",
        "node-count-exceeded-category": "पृष्ठ जिनमें नोड-संख्या सीमा पार की गई है",
        "page_first": "पहला",
        "page_last": "आखिरी",
        "histlegend": "अन्तर चयन: अन्तर देखने के लिए पुराने अवतरणों के आगे दिए गए रेडियो बॉक्स पर क्लिक करें तथा एण्टर करें अथवा नीचे दिए हुए बटन पर क्लिक करें<br />\nलिजण्ड: (चालू) = सद्य अवतरण के बीच में अन्तर,\n(आखिरी) = पिछले अवतरण के बीच में अन्तर, छो = छोटा बदलाव।",
-       "history-fieldset-title": "à¤\87तिहास à¤\95ा à¤µà¤¿à¤\9aरण à¤\95रें",
-       "history-show-deleted": "सà¥\82à¤\9aà¥\80 à¤®à¥\87à¤\82 à¤\95à¥\87वल à¤\9bà¥\81पाà¤\8f à¤¹à¥\81à¤\8f à¤\85वतरण à¤¦à¤¿à¤\96ाà¤\8fà¤\81",
+       "history-fieldset-title": "à¤\85वतरण à¤¹à¥\87तà¥\81 à¤\96à¥\8bà¤\9cें",
+       "history-show-deleted": "हà¤\9fायà¥\87 à¤\97à¤\8f à¤\85वतरण à¤¹à¥\80",
        "histfirst": "सबसे पुराना",
        "histlast": "सबसे नया",
        "historysize": "($1 {{PLURAL:$1|बाइट}})",
        "prefs-help-recentchangescount": "इसमें हाल के बदलाव, पृष्ठ इतिहास व लॉग शामिल हैं।",
        "prefs-help-watchlist-token2": "यह आपकी ध्यानसूची की वेब फ़ीड की गोपनीय चाबी है।\nयह जिसके भी पास होगी वह आपकी ध्यानसूची पढ़ सकेगा, इसिलए इसे किसी के साथ बांटियेगा नहीं।\n[[Special:ResetTokens|इसे रीसेट करने के लिए यहाँ क्लिक करें]]।",
        "savedprefs": "आपकी वरीयताएँ संजोई गई हैं।",
-       "savedrights": "पà¥\8dरयà¥\8bà¤\95à¥\8dता {{GENDER:$1|$1}} का सदस्य अधिकार सहेजा गया।",
+       "savedrights": "सदसà¥\8dय {{GENDER:$1|$1}} का सदस्य अधिकार सहेजा गया।",
        "timezonelegend": "समयमंडल:",
        "localtime": "स्थानीय समय:",
        "timezoneuseserverdefault": "विकि मूल का उपयोग करें ($1)",
        "prefs-help-prefershttps": "यह वरीयता आपके अगले लॉगिन पर प्रभावी होगी।",
        "prefswarning-warning": "आपने अपनी वरीयताओं में एैसे परिवर्तन किए हैं जिन्हे अभी तक संचित नहीं किया गया है। अगर अाप \"$1\" पर बिना क्लिक किये इस पृष्ठ को छोड़ देते हैं तो अापकी वरीयताओं का अद्यतन नहीं किया जाएगा।",
        "prefs-tabs-navigation-hint": "सुझाव: आप टैब्स सूची में टैब्स के बीच आवागमन करने के लिए बाएँ और दाएँ तीर कुंजियों का उपयोग कर सकते हैं।",
-       "userrights": "सदस्य अधिकार व्यवस्थापन",
+       "userrights": "सदस्य अधिकार",
        "userrights-lookup-user": "सदस्य चुनें",
        "userrights-user-editname": "सदस्यनाम दें:",
-       "editusergroup": "{{GENDER:$1|सदस्य}} समूहों का संपादन करें",
+       "editusergroup": "सदस्य समूह दिखायें",
        "editinguser": "सदस्य '''[[User:$1|$1]]''' $2 के अधिकार बदलें\n{{GENDER:$1|सदस्य}} के सदस्य अधिकार बदले जा रहे हैं <strong>[[User:$1|$1]]</strong> $2",
+       "viewinguserrights": "{{GENDER:$1|user}} के उपयोगकर्ता अधिकारों को देखना <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "सदस्य समूहों का संपादन करें",
-       "userrights-viewusergroup": "सदस्य समूह देखें",
+       "userrights-viewusergroup": "{{GENDER:$1|सदस्य}} समूह देखें",
        "saveusergroups": "{{GENDER:$1|सदस्य}} समूह सहेजें",
        "userrights-groupsmember": "निम्न {{PLURAL:$1|समूह|समूहों}} का सदस्य:",
        "userrights-groupsmember-auto": "निम्न {{PLURAL:$1|समूह|समूहों}} का अंतर्निहित सदस्य:",
-       "userrights-groups-help": "आप इस सदस्य की समूह-सदस्यता बदल सकते हैं:\n* बक्से पर सही का निशान लगे होने का अर्थ है कि सदस्य उस समूह में है।\n* बक्से पर सही का निशान न लगे होने का अर्थ है कि सदस्य उस समूह में नहीं है।\n* एक * का अर्थ है कि एक बार जोड़ने के बाद वह समूह हटा नहीं सकते हैं, और हटाने के बाद जोड़ नहीं सकते हैं।",
+       "userrights-groups-help": "आप इस सदस्य की समूह-सदस्यता बदल सकते हैं:\n* बक्से पर सही का निशान लगे होने का अर्थ है कि सदस्य उस समूह में है।\n* बक्से पर सही का निशान न लगे होने का अर्थ है कि सदस्य उस समूह में नहीं है।\n* एक * का अर्थ है कि एक बार जोड़ने के बाद वह समूह हटा नहीं सकते हैं, और हटाने के बाद जोड़ नहीं सकते हैं।\n* एक # सूचित करता है कि आप केवल इस समूह के समाप्ति समय को वापस रख सकते हैं; आप इसे आगे नहीं बढ़ा सकते हैं",
        "userrights-reason": "कारण:",
        "userrights-no-interwiki": "आपको अन्य विकियों पर सदस्य अधिकार बदलने की अनुमति नहीं हैं।",
        "userrights-nodatabase": "डाटाबेस $1 या तो मौजूद नहीं है या फिर स्थानीय नहीं है।",
        "userrights-expiry-current": "समाप्ती $1",
        "userrights-expiry-none": "समाप्त नहीं होता",
        "userrights-expiry": "समाप्ति:",
+       "userrights-expiry-existing": "वर्तमान समाप्ति समय: $3, $2",
        "userrights-expiry-othertime": "अन्य समय:",
        "userrights-expiry-options": "एक दिन:1 day,एक सप्ताह:1 week,एक महीना:1 month,तीन महीने:3 months,छः महीने:6 months,एक वर्ष:1 year",
        "userrights-invalid-expiry": "\"$1\" समूह के लिए समाप्ती तिथि अमान्य है।",
        "userrights-expiry-in-past": "\"$1\" समूह हेतु समाप्ती का समय पहले ही बीत चुका है।",
+       "userrights-cannot-shorten-expiry": "आप \"$1\" समूह की समाप्ति को आगे नहीं बढ़ा सकते हैं। केवल इस समूह को जोड़ने और निकालने की अनुमति वाले उपयोगकर्ता आगे समाप्ति समय ला सकते हैं।",
        "userrights-conflict": "सदस्य अधिकार बदलावों में अंतर्विरोध! कृपया अपने बदलाव जाँचें और पुनः सुनिश्चित करें।",
        "group": "समूह:",
        "group-user": "सदस्य",
        "action-upload_by_url": "यू॰आर॰एल से इस फ़ाइल को चढ़ाने",
        "action-writeapi": "लेखन ए॰पी॰आई का प्रयोग करने",
        "action-delete": "इस पृष्ठ को हटाने",
-       "action-deleterevision": "à¤\87स à¤\85वतरण à¤\95à¥\8b à¤¹à¤\9fानà¥\87",
+       "action-deleterevision": "à¤\85वतरण à¤¹à¤\9fायà¥\87à¤\82",
        "action-deletelogentry": "लॉग प्रविष्टियाँ को हटाए",
-       "action-deletedhistory": "इस पृष्ठ के मिटे इतिहास को देखने",
+       "action-deletedhistory": "पृष्ठ के मिटे इतिहास को देखना",
+       "action-deletedtext": "हटाये गए अवतरण का पाठ देखें",
        "action-browsearchive": "हटाएँ गए पृष्ठों में खोजने",
-       "action-undelete": "à¤\87स à¤ªà¥\83षà¥\8dठ à¤\95à¥\8b à¤ªà¥\81नरà¥\8dसà¥\8dथापित à¤\95रनà¥\87",
-       "action-suppressrevision": "à¤\87स à¤\9bिपà¥\87 à¤\85वतरण को देखने और पुनर्स्थापित करने",
+       "action-undelete": "पृष्ठ को पुनर्स्थापित करने",
+       "action-suppressrevision": "à¤\9bिपà¥\87 à¤\85वतरणà¥\8bà¤\82 को देखने और पुनर्स्थापित करने",
        "action-suppressionlog": "इस निजी लॉग को देखने",
        "action-block": "इस सदस्य को संपादन करने से ब्लॉक करने",
        "action-protect": "इस पृष्ठ के सुरक्षा स्तर बदलने",
        "rcfilters-invalid-filter": "अमान्य फ़िल्टर",
        "rcfilters-empty-filter": "कोई सक्रिय फिल्टर नहीं। सभी योगदान दिखाए गए है।",
        "rcfilters-filterlist-title": "फिल्टर",
-       "rcfilters-highlightbutton-title": "परिणाम रेखांकन करें",
+       "rcfilters-filterlist-whatsthis": "यह क्या है?",
+       "rcfilters-filterlist-feedbacklink": "नए (बीटा) फिल्टर पर प्रतिक्रिया दें",
+       "rcfilters-highlightbutton-title": "Highlight results",
        "rcfilters-highlightmenu-title": "रंग चुनें",
+       "rcfilters-highlightmenu-help": "इस गुण को हाइलाइट करने के लिए एक रंग चुनें",
        "rcfilters-filterlist-noresults": "कोई फिल्टर नहीं पाया",
+       "rcfilters-noresults-conflict": "कोई भी परिणाम नहीं मिला क्योंकि खोज मापदंड संघर्ष में है",
+       "rcfilters-state-message-subset": "इस फिल्टर का कोई प्रभाव नहीं है क्योंकि इसका परिणाम निम्न, व्यापक {{PLURAL: $2 |फ़िल्टर|फिल्टर}} के साथ शामिल है (इसे भेद करने के लिए हाइलाइट करने की कोशिश करें): $1",
+       "rcfilters-state-message-fullcoverage": "किसी समूह में सभी फ़िल्टर चुनना कोई भी नहीं चुनने के समान है इसलिए इस फ़िल्टर का कोई प्रभाव नहीं है समूह में शामिल हैं: $1",
        "rcfilters-filtergroup-registration": "उपयोगकर्ता पंजीकरण",
        "rcfilters-filter-registered-label": "पंजीकृत:",
        "rcfilters-filter-registered-description": "लॉग-इन संपादक।",
        "rcfilters-filter-unregistered-label": "अपंजीकृत",
        "rcfilters-filter-unregistered-description": "संपादक जो लॉग इन नहीं हैं।",
+       "rcfilters-filtergroup-authorship": "लेखकों को संपादित करें",
        "rcfilters-filter-editsbyself-label": "आपके अपने संपादन",
        "rcfilters-filter-editsbyself-description": "आपके द्वारा संपादित",
        "rcfilters-filter-editsbyother-label": "दूसरों के द्वारा संपादित",
+       "rcfilters-filter-editsbyother-description": "अन्य उपयोगकर्ताओं द्वारा बनाई गए संपादन (आपके द्वारा नहीं)",
+       "rcfilters-filtergroup-userExpLevel": "अनुभव स्तर (केवल पंजीकृत सदस्यों के लिए)",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "अनुभव फ़िल्टर केवल पंजीकृत उपयोगकर्ता पाते हैं इसलिए यह फ़िल्टर \"अपंजीकृत\" फ़िल्टर के साथ संघर्ष करता है।",
        "rcfilters-filter-user-experience-level-newcomer-label": "अपरिचित",
+       "rcfilters-filter-user-experience-level-newcomer-description": "4 दिनों की गतिविधि और 10 सम्पादन से कम।",
        "rcfilters-filter-user-experience-level-learner-label": "शिक्षार्थियों",
+       "rcfilters-filter-user-experience-level-experienced-label": "अनुभवी सदस्य",
+       "rcfilters-filter-user-experience-level-experienced-description": "30 दिन से अधिक गतिविधि और 500 सम्पादन।",
+       "rcfilters-filtergroup-automated": "स्वचालित योगदान",
        "rcfilters-filter-bots-label": "बॉट",
+       "rcfilters-filter-bots-description": "स्वचालित औजारों से किए सम्पादन।",
        "rcfilters-filter-humans-label": "मानव (बॉट नहीं)",
        "rcfilters-filter-humans-description": "मानव संपादक द्वारा किए गए संपादन।",
+       "rcfilters-filtergroup-reviewstatus": "पुनरीक्षण स्थिति",
+       "rcfilters-filter-patrolled-label": "परीक्षित",
+       "rcfilters-filter-patrolled-description": "परीक्षित चिन्हित किए सम्पादन।",
+       "rcfilters-filter-unpatrolled-label": "अपरीक्षित",
+       "rcfilters-filter-unpatrolled-description": "परीक्षित चिन्हित न किए सम्पादन।",
        "rcfilters-filtergroup-significance": "महत्व",
        "rcfilters-filter-minor-label": "छोटा संपादन",
+       "rcfilters-filter-minor-description": "लेखक का संपादन छोटा संपादन के रूप में लेबल किया गया है।",
        "rcfilters-filter-major-label": "गैर-मामूली संपादन",
+       "rcfilters-filter-major-description": "छोटा चिन्हित न किए सम्पादन।",
        "rcfilters-filtergroup-changetype": "बदलाव के प्रकार:",
        "rcfilters-filter-pageedits-label": "पृष्ठ संपादन",
+       "rcfilters-filter-pageedits-description": "विकि सामग्री, चर्चा, श्रेणी विवरणों के संपादन ....",
        "rcfilters-filter-newpages-label": "पृष्ठ कृतियों",
        "rcfilters-filter-newpages-description": "संपादन जिससे नया पृष्ट बना",
        "rcfilters-filter-categorization-label": "श्रेणी परिवर्तन",
+       "rcfilters-filter-categorization-description": "श्रेणियों से पृष्ठों के रिकॉर्ड्स को जोड़ा या निकाला जा सकता है",
+       "rcfilters-filter-logactions-label": "लॉग की गई कार्रवाई",
+       "rcfilters-filter-logactions-description": "प्रशासनिक कार्रवाई, खाता निर्माण, पृष्ठ विलोपन, अपलोड ....",
        "rcnotefrom": "नीचे <strong>$2</strong> के बाद से (<strong>$1</strong> तक) {{PLURAL:$5|हुआ बदलाव दर्शाया गया है|हुए बदलाव दर्शाए गये हैं}}।",
        "rclistfrom": "$3 $2 से नये बदलाव दिखाएँ",
        "rcshowhideminor": "छोटे बदलाव $1",
        "apisandbox-loading-results": "एपीआई परिणाम ले रहा...",
        "apisandbox-results-error": "एपीआई के समय कोई त्रुटि हुई: $1",
        "apisandbox-request-url-label": "अनुरोध URL:",
+       "apisandbox-request-json-label": "JSON अनुरोध:",
        "apisandbox-request-time": "अनुरोध समय: {{PLURAL:$1|$1 मि}}",
        "apisandbox-results-fixtoken": "टोकन सही करें और दोबारा भेजें।",
        "apisandbox-results-fixtoken-fail": "टोकन \"$1\" डालने में विफल",
        "watchnologin": "लॉग इन नहीं किया है",
        "addwatch": "ध्यानसूची में जोड़ें",
        "addedwatchtext": "आपकी [[Special:Watchlist|ध्यानसूची]] में \"[[:$1]]\" और इसके चर्चा पृष्ठ जोड़ दिए गए हैं।",
+       "addedwatchtext-talk": "\"[[:$1]]\" और उससे जुड़े पन्ने आपके [[Special:Watchlist|ध्यानसूची]] में जोड़ दिये गए हैं।",
        "addedwatchtext-short": "पृष्ठ \"$1\" को आपकी ध्यानसूची से जोड़ा गया है।",
        "removewatch": "ध्यानसूची से हटाएँ",
-       "removedwatchtext": "\"[[:$1]]\" नामक पृष्ठ को आपकी [[Special:Watchlist|ध्यानसूची]] से हटा दिया गया है।",
+       "removedwatchtext": "\"[[:$1]]\" और इसके वार्ता पृष्ठ को आपके [[Special:Watchlist|ध्यानसूची]] से हटा दिया गया है।",
+       "removedwatchtext-talk": "\"[[:$1]]\" और उससे जुड़े पन्ने आपके [[Special:Watchlist|ध्यानसूची]] से हटा दिये गए हैं।",
        "removedwatchtext-short": "पृष्ठ \"$1\" को आपकी ध्यानसूची से हटाया गया है।",
        "watch": "ध्यान रखें",
        "watchthispage": "इस पृष्ठ का ध्यान रखें",
        "deletepage": "पृष्ठ हटाएँ",
        "confirm": "सुनिश्चित करें",
        "excontent": "पाठ था: '$1'",
-       "excontentauthor": "पाठ था: '$1' (और सिर्फ '[[Special:Contributions/$2|$2]]' का योगदान था। ([[User talk:$2|वार्ता]])",
+       "excontentauthor": "पाठ था: '$1'और सिर्फ '[[Special:Contributions/$2|$2]]' का योगदान था। ([[User talk:$2|वार्ता]])",
        "exbeforeblank": "खाली करने से पहले पाठ था: '$1'",
        "delete-confirm": "\"$1\" को हटाएँ",
        "delete-legend": "हटाएँ",
        "modifiedarticleprotection": "\"[[$1]]\" के सुरक्षा-स्तर को बदला",
        "unprotectedarticle": "\"[[$1]]\" से सुरक्षा हटा दी गई",
        "movedarticleprotection": "सुरक्षा स्तर \"[[$2]]\" से बदल कर  \"[[$1]]\" कर दिया गया है",
+       "protectedarticle-comment": "\"[[$1]]\" को सुरक्षित किया।",
+       "modifiedarticleprotection-comment": "\"[[$1]]\" हेतु {{GENDER:$2|सुरक्षा स्तर बदला गया}}",
+       "unprotectedarticle-comment": "\"[[$1]]\" से {{GENDER:$2|सुरक्षा हटाया गया}}",
        "protect-title": "\"$1\" का सुरक्षा स्तर बदलें",
        "protect-title-notallowed": "\"$1\" का सुरक्षा स्तर देखें",
        "prot_1movedto2": "[[$1]] का नाम बदलकर [[$2]] कर दिया गया है",
        "protect-summary-cascade": "सीढ़ी",
        "protect-expiring": "समाप्ती $1 (UTC)",
        "protect-expiring-local": "समाप्ती $1",
-       "protect-expiry-indefinite": "à¤\85निशà¥\8dà¤\9aितà¤\95ालà¥\80न",
+       "protect-expiry-indefinite": "हमà¥\87शा",
        "protect-cascade": "इस पृष्ठ से जुड़े हुए पृष्ठ सुरक्षित करें (सुरक्षा-सीढ़ी)",
        "protect-cantedit": "आप इस पृष्ठ का सुरक्षा-स्तर बदल नहीं सकते क्योंकि आपको ऐसा करने का अधिकार नहीं है।",
        "protect-othertime": "अन्य समय:",
        "undeleteviewlink": "देखें",
        "undeleteinvert": "चुनाव उलटें",
        "undeletecomment": "कारण:",
-       "undeletedrevisions": "{{PLURAL:$1|एक अवतरण पुनर्स्थापित किया|$1 अवतरण पुनर्स्थापित किये}}",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 अवतरण|$1 अवतरण}} और {{PLURAL:$2|1 फ़ाइल|$2 फ़ाइलें}} पुनर्स्थापित कर दीं",
-       "undeletedfiles": "{{PLURAL:$1|1 फ़ाइल|$1 फ़ाइलें}} पुनर्स्थापित",
        "cannotundelete": "पुनर्स्थापित नहीं कर सके:\n$1",
        "undeletedpage": "'''$1 को पुनर्स्थापित कर दिया गया है'''\n\nहाल में हटाये गये तथा पुनर्स्थापित किये गए पन्नों की जानकारी के लिये [[Special:Log/delete|हटाने की लॉग]] देखें।",
        "undelete-header": "हाल में हटाये गये पृष्ठ देखने के लिये [[Special:Log/delete|हटाने का लॉग]] देखें।",
        "sp-contributions-newbies": "सिर्फ़ नये सदस्यों के योगदान दर्शायें",
        "sp-contributions-newbies-sub": "नये सदस्योंके लिये",
        "sp-contributions-newbies-title": "नए सदस्यों द्वारा योगदान",
-       "sp-contributions-blocklog": "बà¥\8dलà¥\89à¤\95 सूची",
+       "sp-contributions-blocklog": "à¤\85वरà¥\8bध सूची",
        "sp-contributions-suppresslog": "छुपाए गए उपयोगकर्ता के योगदान",
-       "sp-contributions-deleted": "हटाए गए सदस्य योगदान",
+       "sp-contributions-deleted": "हटाए गए {{GENDER:$1|सदस्य}} योगदान",
        "sp-contributions-uploads": "अपलोड",
        "sp-contributions-logs": "लॉग",
        "sp-contributions-talk": "वार्ता",
        "createaccountblock": "खाते निर्माण को रोक दिया हैं",
        "emailblock": "ईमेल अवरोधित",
        "blocklist-nousertalk": "अपना वार्ता पृष्ठ भी संपादित नहीं कर सकेंगे",
-       "ipblocklist-empty": "बà¥\8dलà¥\89à¤\95 सूची खाली हैं।",
+       "ipblocklist-empty": "à¤\85वरà¥\8bध सूची खाली हैं।",
        "ipblocklist-no-results": "पूछे गये आईपी एड्रेस / सदस्यनाम पर ब्लॉक नहीं हैं।",
        "blocklink": "अवरोधित करें",
        "unblocklink": "अवरोध हटाएँ",
        "contribslink": "योगदान",
        "emaillink": "ई-मेल भेजें",
        "autoblocker": "आपका आइ॰पी पता स्वतः अवरुद्ध है, चूँकि इसे हाल ही में \"[[User:$1|$1]]\" द्वारा प्रयोग किया गया है।\n$1 को अवरोधित करने का कारण है: \"$2\"",
-       "blocklogpage": "बà¥\8dलà¥\89à¤\95 सूची",
+       "blocklogpage": "à¤\85वरà¥\8bध सूची",
        "blocklog-showlog": "इस प्रयोक्ता को पहले भी अवरोधित किया जा चुका है। \nसन्दर्भ के लिए अवरोधन अभिलेख नीचे दिया गया है:",
        "blocklog-showsuppresslog": "यह प्रयोक्ता पहले भी अवरोधित किया जा चुका है।\nयह दबाया गया लॉग सन्दर्भ के लिए उपलब्ध कया गया है:",
        "blocklogentry": "\"[[$1]]\" को $2 $3 तक बदलाव करने से रोक दिया गया है।",
        "proxyblockreason": "आपका IP पता बाधित किया जा चुका है क्योंकि यह एक मुक्त प्रतिनिधि है।\nकृपया आप अपने इंटरनेट सेवा प्रदान करने वाले से या तकनीकी सहायक से सम्पर्क करें अथवा उन्हें इस भयावह सुरक्षा समस्या के बारे में सूचित करें।",
        "sorbsreason": "{{SITENAME}} द्वारा इस्तेमालमें लाये जाने वाले DNSBL में आपके आईपी एड्रेसको ओपन प्रॉक्सीमें दर्शाया गया हैं।",
        "sorbs_create_account_reason": "{{SITENAME}} के DNSBL ने आपका आईपी एड्रेस ओपन प्रोक्सी करके सूचित किया हैं। आप खाता खोल नहीं सकतें।",
+       "softblockrangesreason": "आपके आईपी ($1) के द्वारा बिना खाता के सम्पादन नहीं हो सकता है। कृपया खाते में प्रवेश (लॉगिन) करें।",
        "xffblockreason": "एक आई०पी० पता जो X-Forwarded-For हेडर में मौजूद है, या तो आपका है या उस प्रौक्सी सरवर का है जिसका आप प्रयोग कर रहे हैं और उस पर प्रतिबंध लगा दिया गया है। वास्तविक कारण था: $1",
        "cant-see-hidden-user": "जिस सदस्य को आप अवरोधित करने की कोशिश कर रहे हैं उसे पहले ही अवरोधित कर के छुपाया जा चुका है।\nचूँकि आपके पास hideuser अधिकार नहीं है, आप इस सदस्य का अवरोधन ना देख सकते हैं और ना ही सम्पादित कर सकते हैं।",
        "ipbblocked": "आप अन्य प्रयोक्ताओं को अवरोधित या अनवरोधित नहीं कर सकते, क्योंकि आप स्वयं अवरोधित हैं",
        "cant-move-to-user-page": "आपको किसी पन्नो को सदस्य पृष्ठ पर ले जाने की अनुमति नहीं है (सिवाय सदस्य उप पृष्ठ के)",
        "cant-move-category-page": "आपको श्रेणी प्रष्ठों को स्थानांतरित करने की अनुमति नहीं है।",
        "cant-move-to-category-page": "आपको किसी पृष्ठ को श्रेणी पृष्ठ पर स्थानांतरित करने की अनुमति नहीं है।",
+       "cant-move-subpages": "आपको उपपृष्ठों को स्थानांतरित करने की अनुमति नहीं है।",
        "namespace-nosubpages": "\"$1\" नामस्थान उपपृष्ठ की अनुमति नहीं देता है।",
        "newtitle": "नया शीर्षक:",
        "move-watch": "ध्यान रखें",
        "tooltip-t-recentchangeslinked": "यहाँ जुड़े हुए सभी पन्नों में हुए हाल के बदलाव",
        "tooltip-feed-rss": "इस पृष्ठ की आरएसएस फ़ीड",
        "tooltip-feed-atom": "इस पृष्ठ की अणु फ़ीड",
-       "tooltip-t-contributions": "{{GENDER:$1|à¤\87स à¤¸à¤¦à¤¸à¥\8dय}} à¤\95à¥\87 à¤¯à¥\8bà¤\97दाà¤\93ं की सूची",
+       "tooltip-t-contributions": "{{GENDER:$1|à¤\87स à¤¸à¤¦à¤¸à¥\8dय}} à¤\95à¥\87 à¤¯à¥\8bà¤\97दानà¥\8bं की सूची",
        "tooltip-t-emailuser": "{{GENDER:$1|इस सदस्य}} को इमेल भेजें",
        "tooltip-t-info": "इस पृष्ठ के बारे में अधिक जानकारी",
        "tooltip-t-upload": "फ़ाइल अपलोड करें",
        "newimages-summary": "यह विशेष पृष्ठ हाल ही में अपलोड की गयी फ़ाइलें दिखाता है।",
        "newimages-legend": "छननी",
        "newimages-label": "संचिका नाम (या उसका अंश):",
+       "newimages-user": "आईपी पता या सदस्यनाम",
        "newimages-showbots": "बॉट के अपलोड दिखाइये",
        "newimages-hidepatrolled": "जाँचा हुआ अपलोड छुपाएँ",
        "noimages": "देखने के लिए कुछ नहीं है।",
        "invalidateemail": "इ-मेल प्रमाणिकरण रद्द करें",
        "notificationemail_subject_changed": "{{SITENAME}} पंजीकृत ईमेल खाता बदला गया।",
        "notificationemail_subject_removed": "{{SITENAME}} पंजीकृत ईमेल खाता हटाया गया।",
+       "notificationemail_body_changed": "आप या किसी और व्यक्ति ने $1 आईपी पते से,\n{{SITENAME}} में आपके खाते का ईमेल पता \"$2\" से बदल कर \"$3\" कर दिया है। \n\nयदि यह आपने नहीं किया है, तो कृपया तुरंत प्रबन्धकों को इसकी सूचना दें।",
+       "notificationemail_body_removed": "आप या किसी और व्यक्ति ने $1 आईपी पते से,\n{{SITENAME}} में आपके खाते से ईमेल पता \"$2\" को हटा दिया है।\n\nयदि यह आपने नहीं किया है, तो कृपया तुरंत प्रबन्धकों को इसकी सूचना दें।",
        "scarytranscludedisabled": "[आंतरविकि ट्रान्स्क्लुडिंग बंद हैं]",
        "scarytranscludefailed": "[$1 के लिये साँचा मँगा नहीं पाए]",
        "scarytranscludefailed-httpstatus": "[$1 के लिये साँचा मँगा नहीं पाए, त्रुटि: HTTP $2]",
        "tags-actions-header": "क्रियाएं",
        "tags-active-yes": "हाँ",
        "tags-active-no": "नहीं",
-       "tags-source-extension": "à¤\8fà¤\95à¥\8dसà¤\9fà¥\87à¤\82शन द्वारा परिभाषित",
+       "tags-source-extension": "सà¥\89फà¥\8dà¤\9fवà¥\87यर द्वारा परिभाषित",
        "tags-source-manual": "उपयोगकर्ताओं और बॉट द्वारा नियमानुसार लागू",
        "tags-source-none": "अब प्रयोग में नहीं",
        "tags-edit": "सम्पादन",
        "htmlform-user-not-exists": "<strong>$1</strong> मौजूद नहीं है।",
        "htmlform-user-not-valid": "<strong>$1</strong> मान्य प्रयोक्ता नाम नहीं है।",
        "logentry-delete-delete": "$1 ने पृष्ठ $3 {{GENDER:$2|हटा}} दिया",
+       "logentry-delete-delete_redir": "$1 ने $3 से पुनर्निर्देशन {{GENDER:$2|हटाकर}} अन्य जानकारी डाल दी।",
        "logentry-delete-restore": "$1 ने पृष्ठ $3 को {{GENDER:$2|पुनर्स्थापित}} कर दिया",
        "logentry-delete-event": "$1 ने $3 पृष्ठ की लॉग {{PLURAL:$5|प्रविष्टि|प्रविष्टियों}} की दृश्यता {{GENDER:$2|बदली}}: $4",
        "logentry-delete-revision": "$1 ने $3 पृष्ठ के {{PLURAL:$5|एक अवतरण|$5 अवतरणों}} की दृश्यता {{GENDER:$2|बदली}}: $4",
        "revdelete-uname-unhid": "सदस्यनाम फिर सार्वजनिक किया गया",
        "revdelete-restricted": "प्रबंधकोंको प्रतिबंधित किया",
        "revdelete-unrestricted": "प्रबंधकोंके प्रबंधन हटायें",
-       "logentry-block-block": "$1 {{GENDER:$2|प्रतिबंधित}}{{GENDER:$4|$3}} जिसमें समय समाप्ति की अवधि है $5 $6",
+       "logentry-block-block": "$1 ने {{GENDER:$4|$3}} को $5 के लिए {{GENDER:$2|अवरोधित}} कर दिया। $6",
        "logentry-block-unblock": "$1 {{GENDER:$2|प्रतिबंधित}} {{GENDER:$4|$3}}",
-       "logentry-block-reblock": "$1 {{GENDER:$2|changed}} प्रतिबंध सेटिंग {{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-block-reblock": "$1 ने {{GENDER:$4|$3}} के अवरोध में {{GENDER:$2|बदलाव}} कर दिया और यह अवरोध $5 रहेगा। $6",
+       "logentry-suppress-block": "$1 ने {{GENDER:$4|$3}} को $5 के लिए {{GENDER:$2|अवरोधित}} कर दिया। $6",
+       "logentry-suppress-reblock": "$1 ने {{GENDER:$4|$3}} के अवरोध में {{GENDER:$2|बदलाव}} कर दिया और यह अवरोध $5 रहेगा। $6",
        "logentry-import-upload": "$1 {{GENDER:$2|आयात किया गया}} $3 फ़ाइल अपलोड के माध्यम से",
-       "logentry-import-upload-details": "$1 à¤¨à¥\87 à¤«à¤¼à¤¾à¤\87ल à¤\85पलà¥\8bड à¤¦à¥\8dवारा $3 à¤\95à¥\8b {{GENDER:$2|à¤\86यात}} à¤\95िया ($4 {{PLURAL:$4|à¤\85वतरण|à¤\85वतरण}})",
+       "logentry-import-upload-details": "$1 à¤¨à¥\87 à¤«à¤¼à¤¾à¤\87ल à¤\85पलà¥\8bड à¤¸à¥\87 $3 à¤\95à¥\87 ($4 {{PLURAL:$4|à¤\85वतरण|à¤\85वतरणà¥\8bà¤\82}}) à¤\95à¥\8b {{GENDER:$2|à¤\86यात}} à¤\95िया।",
        "logentry-import-interwiki": "$1 {{GENDER:$2|आयात किया गया}} $3 किसी और विकि से",
-       "logentry-import-interwiki-details": "$1 ने $5 से $3 को {{GENDER:$2|आयात}} किया ($4 {{PLURAL:$4|अवतरण|अवतरण}})",
+       "logentry-import-interwiki-details": "$1 ने $3 के ($4 {{PLURAL:$4|अवतरण|अवतरणों}}) को $5 से {{GENDER:$2|आयात}} किया।",
        "logentry-merge-merge": "$1 {{GENDER:$2|विलय किया गया}} $3 को $4 में (संशोधन $5 तक)",
        "logentry-move-move": "$1 ने $3 पृष्ठ $4 पर {{GENDER:$2|स्थानांतरित}} किया",
        "logentry-move-move-noredirect": "$1 ने $3 पर पुनर्निर्देश छोड़े बिना उसे $4 पर {{GENDER:$2|स्थानांतरित}} किया",
        "logentry-tag-update-revision": "$1 {{GENDER:$2|उद्यतन किए गए}} टैग संशोधन $4 पर पृष्ठ $3 के ({{PLURAL:$7|जोड़ दिए गए}} $6; {{PLURAL:$9|हटाए गए}} $8)",
        "logentry-tag-update-logentry": "$1 {{GENDER:$2|उद्यतन किए गए}} टैग संशोधन $5 पर पृष्ठ $3 के ({{PLURAL:$7|जोड़ दिए गए}} $6; {{PLURAL:$9|हटाए गए}} $8)",
        "rightsnone": "(कोई नहीं)",
+       "rightslogentry-temporary-group": "$1 (अस्थाई, $2 तक)",
        "feedback-adding": "पृष्ठ पर प्रतिक्रिया जोड़ना ...",
        "feedback-back": "पीछे जाएँ",
        "feedback-bugcheck": "शानदार! जांच ले कहीं ये [ $1 known bugs] पहले से ही न हो ।",
        "feedback-thanks": "धन्यवाद! आपकी प्रतिक्रिया पृष्ठ में नियुक्त किया गया है \"[ $2  $1 ]\"।",
        "feedback-thanks-title": "धन्यवाद!",
        "feedback-useragent": "सदस्य कर्ता:",
-       "searchsuggest-search": "खोजें {{SITENAME}}",
+       "searchsuggest-search": "{{SITENAME}} में खोजें",
        "searchsuggest-containing": "...से युक्त",
        "api-error-badtoken": "आंतरिक त्रुटि: बुरी टोकन।",
        "api-error-emptypage": "नए खाली पृष्ठ बनाने की अनुमति नहीं है।",
        "api-error-publishfailed": "आंतरिक त्रुटि: सर्वर अस्थाई फ़ाइल को प्रकासन करने में विफल।",
        "api-error-stashfailed": "आंतरिक त्रुटि: सर्वर अस्थाई फ़ाइल को संग्रहीत करने में विफल।",
-       "api-error-unknown-warning": "अज्ञात चेतावनी: $1",
+       "api-error-unknown-warning": "अज्ञात चेतावनी: \"$1\"।",
        "api-error-unknownerror": "अज्ञात त्रुटि: \" $1 \"",
        "duration-seconds": "$1 {{PLURAL:$1|सॅकेंड}}",
        "duration-minutes": "$1 {{PLURAL:$1|मिनट}}",
        "pagelang-language": "भाषा",
        "pagelang-use-default": "डिफ़ॉल्ट भाषा का प्रयोग करें",
        "pagelang-select-lang": "भाषा चुनें",
+       "pagelang-reason": "कारण",
        "pagelang-submit": "भेजें",
+       "pagelang-nonexistent-page": "$1 पन्ना अभी बना नहीं है।",
+       "pagelang-unchanged-language": "$1 की भाषा पहले ही $2 तय की गई है।",
+       "pagelang-unchanged-language-default": "$1 पृष्ठ में विकि की मूल भाषा पहले से तय कर दी गई है।",
        "right-pagelang": "पृष्ठ भाषा बदलें",
        "action-pagelang": "पृष्ठ भाषा बदलने",
        "log-name-pagelang": "भाषा बदलाव लॉग",
        "special-characters-title-minus": "ऋण चिह्न",
        "mw-widgets-dateinput-no-date": "कुछ चयनित नहीं",
        "mw-widgets-dateinput-placeholder-day": "DD-MM-YYYY",
+       "mw-widgets-mediasearch-input-placeholder": "मीडिया हेतु खोजें",
        "mw-widgets-mediasearch-noresults": "कोई परिणाम नहीं मिला",
        "mw-widgets-titleinput-description-new-page": "पृष्ठ अभी मौजूद नहीं है",
        "mw-widgets-titleinput-description-redirect": "$1 को अनुप्रेषित",
        "mw-widgets-categoryselector-add-category-placeholder": "श्रेणी जोड़ें...",
+       "mw-widgets-usersmultiselect-placeholder": "और जोड़ें...",
        "sessionmanager-tie": "एक साथ कई अनुरोध को नहीं मिला सकता: $1",
        "sessionprovider-generic": "$1 सत्र",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "कुकी-आधारित सत्र",
        "sessionprovider-nocookies": "हो सकता है कि कुकी निष्क्रिय है। कृपया देखें कि और सक्रिय करें।",
        "randomrootpage": "अविशिष्ट मूल पृष्ठ",
-       "log-action-filter-block": "पà¥\8dरतिबà¤\82ध के प्रकार:",
+       "log-action-filter-block": "à¤\85वरà¥\8bध के प्रकार:",
        "log-action-filter-delete": "हटाने के प्रकार:",
        "log-action-filter-import": "आयात के प्रकार:",
        "log-action-filter-move": "स्थानांतरण के प्रकार:",
        "log-action-filter-all": "सभी",
        "log-action-filter-block-block": "अवरोध",
        "log-action-filter-block-reblock": "अवरोध परिवर्तन",
-       "log-action-filter-block-unblock": "अवरोधरहित",
+       "log-action-filter-block-unblock": "अवरोध हटाना",
        "log-action-filter-delete-delete": "पृष्ठ हटाना",
        "log-action-filter-delete-restore": "पृष्ठ न हटाना",
        "log-action-filter-delete-event": "पृष्ठ हटाने का लॉग",
        "log-action-filter-protect-modify": "सुरक्षा परिवर्तन",
        "log-action-filter-protect-unprotect": "असुरक्षा",
        "log-action-filter-protect-move_prot": "सुरक्षा स्थानांतरण",
+       "log-action-filter-rights-rights": "मैनुअल परिवर्तन",
        "log-action-filter-rights-autopromote": "स्वतः परिवर्तन",
+       "log-action-filter-suppress-event": "लॉग अवरोध",
+       "log-action-filter-suppress-revision": "संशोधन अवरोध",
+       "log-action-filter-suppress-delete": "पृष्ठ अवरोध",
+       "log-action-filter-suppress-block": "ब्लॉक द्वारा युजर अवरोध",
+       "log-action-filter-suppress-reblock": "पुन: ब्लॉक द्वारा युजर अवरोध",
        "log-action-filter-upload-upload": "नया अपलोड",
        "log-action-filter-upload-overwrite": "फिर से अपलोड",
        "authmanager-create-disabled": "खाता निर्माण निष्क्रिय है।",
index 9773e67..20d15d5 100644 (file)
        "talk": "Razgovor",
        "views": "Pogledi",
        "toolbox": "Pomagala",
-       "tool-link-userrights": "Promijeni {{GENDER:$1|suradnikove|suradničine}} grupe",
+       "tool-link-userrights": "Promijeni {{GENDER:$1|suradnikovu|suradničinu}} pripadnost skupinama",
        "tool-link-userrights-readonly": "Vidi {{GENDER:$1|suradnikovu|suradničinu|suradničku}} pripadnost skupinama",
        "tool-link-emailuser": "Pošalji {{GENDER:$1|suradniku|suradnici}} e-poruku",
        "userpage": "Vidi suradnikovu stranicu",
        "savearticle": "Sačuvaj stranicu",
        "savechanges": "Sačuvaj stranicu",
        "publishpage": "Objavi stranicu",
-       "publishchanges": "Objavi izmjene",
+       "publishchanges": "Sačuvaj uređivanje",
        "preview": "Pregled kako će stranica izgledati",
        "showpreview": "Prikaži kako će izgledati",
        "showdiff": "Prikaži promjene",
        "currentrev": "Trenutačna inačica",
        "currentrev-asof": "Trenutačna izmjena od $1",
        "revisionasof": "Inačica od $1",
-       "revision-info": "Inačica od $1 koju je unio/unijela $2",
+       "revision-info": "Inačica $3 od $4 u $5 koju je {{GENDER:$6|unio|unijela}} {{GENDER:$6|$2}}$7",
        "previousrevision": "←Starija inačica",
        "nextrevision": "Novija inačica→",
        "currentrevisionlink": "vidi trenutačnu inačicu",
        "prefs-watchlist-days-max": "Najviše $1 {{PLURAL:$1|dan|dana}}",
        "prefs-watchlist-edits": "Broj uređivanja koji će se prikazati na proširenom popisu praćenja:",
        "prefs-watchlist-edits-max": "Maksimalni broj: 1000",
-       "prefs-watchlist-token": "Token popisa praćenja:",
+       "prefs-watchlist-token": "Tajni ključ popisa praćenja:",
        "prefs-misc": "Razno",
        "prefs-resetpass": "promijeni zaporku",
        "prefs-changeemail": "promijeni ili ukloni adresu e-pošte",
        "prefs-emailconfirm-label": "Potvrda e-mail adrese:",
        "youremail": "Vaša elektronska pošta *",
        "username": "Ime {{GENDER:$1|suradnika|suradnice}}:",
-       "prefs-memberingroups": "{{GENDER:$2|Suradnik|Suradnica}} je član {{PLURAL:$1|sljedeće skupine|sljedećih skupina}}:",
+       "prefs-memberingroups": "{{GENDER:$2|Suradnik je član|Suradnica je članica}} {{PLURAL:$1|sljedeće skupine|sljedećih skupina}}:",
        "group-membership-link-with-expiry": "$1 (do $2)",
        "prefs-registration": "Vrijeme prijave:",
        "yourrealname": "Pravo ime (nije obvezno)*",
        "yournick": "Vaš nadimak (za potpisivanje)",
        "prefs-help-signature": "Komentari na stranicama za razgovor trebali bi biti potpisani s \"<nowiki>~~~~</nowiki>\" što će biti pretvoreno u Vaš potpis i datum.",
        "badsig": "Kôd Vašeg potpisa nije valjan; provjerite HTML tagove.",
-       "badsiglength": "Vaš potpis je predugačak.\nNe smije biti duži od $1 {{PLURAL:$1|znaka|znaka|znakova}}.",
+       "badsiglength": "Vaš je potpis predugačak.\nNe smije biti duži od $1 {{PLURAL:$1|znaka|znakova}}.",
        "yourgender": "Na koji način želite da Vam se ostali suradnici obraćaju?",
        "gender-unknown": "Kad Vas se spominje, programska će oprema pokušati upotrijebiti srednji rod kad god je to moguće.",
        "gender-male": "Uređivač sam wikistranica.",
        "prefs-advancedwatchlist": "Napredne mogućnosti",
        "prefs-displayrc": "Mogućnosti prikaza",
        "prefs-displaywatchlist": "Mogućnosti prikaza",
+       "prefs-tokenwatchlist": "Tajni ključ",
        "prefs-diffs": "Razlike između inačica uređivanja",
        "prefs-help-prefershttps": "Ova mogućnost će stupiti na snagu kod sljedeće prijave.",
        "prefswarning-warning": "Napravili ste promjene u Vašim postavkama koje još nisu snimljene.\nAko napustite ovu stranicu bez pritiska na \"$1\", postavke neće biti ažurirane.",
        "editusergroup": "Učitaj suradničke skupine",
        "editinguser": "Promjena suradničkih prava {{GENDER:$1|suradnika|suradnice}} <strong>[[User:$1|$1]]</strong> $2",
        "viewinguserrights": "Pregled suradničkih prava {{GENDER:$1|suradnika|suradnice}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Uredi {{GENDER:$1|suradničke}} skupine",
+       "userrights-editusergroup": "Uređivanje {{GENDER:$1|suradnikove|suradničine}} pripadnosti skupinama",
        "userrights-viewusergroup": "Vidi {{GENDER:$1|suradničke}} skupine",
        "saveusergroups": "Spremi {{GENDER:$1|suradničke}} grupe",
-       "userrights-groupsmember": "{{GENDER:$2|Pripadnik|Pripadnica}} skupina:",
-       "userrights-groupsmember-auto": "{{GENDER:$2|Pripadnik|Pripadnica}} obuhvaćenih skupina:",
-       "userrights-groups-help": "Možete promijeniti skupine za ovog suradnika:\n* označena kućica pokazuje skupinu kojoj suradnik pripada;\n* neoznačena kućica pokazuje skupinu kojoj suradnik ne pripada;\n* zvjezdica (*) označava skupinu koju ne možete ukloniti kad ju jednom dodate, ili obratno.\n* povisilica (#) označava da rok valjanosti pripadanja skupini možete samo skratiti, a ne i produljiti",
+       "userrights-groupsmember": "{{GENDER:$2|Pripadnik|Pripadnica}} {{PLURAL:$1|skupine|skupinama|skupina}}:",
+       "userrights-groupsmember-auto": "{{GENDER:$2|Pripadnik|Pripadnica}} {{PLURAL:$1|obuhvaćene skupine|obuhvaćenih skupina}}:",
+       "userrights-groups-help": "Možete promijeniti skupine za {{GENDER:$1|ovoga suradnika|ovu suradnicu}}:\n* označena kućica pokazuje skupinu kojoj {{GENDER:$1|suradnik|suradnica}} pripada;\n* neoznačena kućica pokazuje skupinu kojoj {{GENDER:$1|suradnik|suradnica}} ne pripada;\n* zvjezdica (*) označava skupinu koju ne možete ukloniti kad ju jednom dodate, ili obratno.\n* povisilica (#) označava da rok valjanosti pripadanja skupini možete samo skratiti, a ne i produljiti",
        "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.",
        "excontent": "sadržaj je bio: '$1'",
        "excontentauthor": "sadržaj je bio: »$1«; {{GENDER:$2|jedini pridonositelj bio je|jedina pridonositeljica bila je}} [[Special:Contributions/$2|$2]] ([[User talk:$2|razgovor]])",
        "exbeforeblank": "sadržaj prije brisanja je bio: '$1'",
-       "delete-confirm": "Obriši \"$1\"",
+       "delete-confirm": "Pobriši »$1«",
        "delete-legend": "Izbriši",
        "historywarning": "<strong>Upozorenje:</strong> stranica koju želite izbrisati ima starije izmjene s $1 {{PLURAL:$1|inačicom|inačice|inačica}}:",
        "historyaction-submit": "Prikaži",
        "undeleteviewlink": "pregled",
        "undeleteinvert": "Obrni odabir",
        "undeletecomment": "Razlog:",
-       "undeletedrevisions": "{{PLURAL:$1|$1 inačica vraćena|$1 inačice vraćene|$1 inačica vraćeno}}",
-       "undeletedrevisions-files": "{{PLURAL:$1|$1 promjena|$1 promjene|$1 promjena}} i {{PLURAL:$2|$2 datoteka vraćena|$2 datototeke vraćene|$2 datoteka vraćeno}}",
-       "undeletedfiles": "{{PLURAL:$1|1 datoteka vraćena|$1 datoteke vraćene|$1 datoteka vraćeno}}",
        "cannotundelete": "Vraćanje obrisane inačice nije uspjelo:\n$1",
        "undeletedpage": "'''$1 je vraćena'''\n\nPogledajte [[Special:Log/delete|evidenciju brisanja]] za zapise nedavnih brisanja i vraćanja.",
        "undelete-header": "Pogledaj [[Special:Log/delete|evidenciju brisanja]] za nedavno obrisane stranice.",
        "htmlform-time-invalid": "Unesena vrijednost nije prepoznati format vremena. Pokušajte koristiti format HH:MM:SS.",
        "htmlform-datetime-toohigh": "Uneseni datum i vrijeme su veći od $1",
        "logentry-delete-delete": "$1 je {{GENDER:$2|obrisao|obrisala}} stranicu $3",
-       "logentry-delete-delete_redir": "$1 je premještanjem {{GENDER:$2|pobrisao|pobrisala}} preusmjeravanje $3",
+       "logentry-delete-delete_redir": "$1 premještanjem je {{GENDER:$2|pobrisao|pobrisala}} preusmjeravanje $3",
        "logentry-delete-restore": "$1 je {{GENDER:$2|vratio|vratila}} stranicu $3",
        "logentry-delete-event": "$1 je {{GENDER:$2|promijenio|promijenila}} vidljivost {{PLURAL:$5|zapisa u evidenciji|$5 zapisa u evidenciji}} na $3: $4",
        "logentry-delete-revision": "$1 je {{GENDER:$2|promijenio|promijenila}} vidljivost {{PLURAL:$5|uređivanja|$5 uređivanja}} na stranici $3: $4",
        "feedback-bugnew": "Provjereno. Prijavi novi \"bug\"",
        "feedback-bugornote": "Ako ste spremni detaljno opisati tehnički problem molimo [$1 prijavite \"bug\"].\nInače, možete ispuniti jednostavan obrazac u nastavku. Vaš komentar biti će dodan na stranicu \"[$3 $2]\", zajedno s vašim suradničkim imenom i imenom internetskog preglednika koji rabite.",
        "feedback-cancel": "Odustani",
-       "feedback-close": "Gotovo",
+       "feedback-close": "Riješeno",
        "feedback-external-bug-report-button": "Arhiviraj tehnički zadatak",
        "feedback-dialog-title": "Slanje povratnih informacija",
        "feedback-dialog-intro": "Da biste poslali povratnu informaciju, rabite jednostavan obrazac. Vaš će komentar biti dodan na stranici \"$1\" s Vašim suradničkim imenom.",
        "feedback-terms": "Jasno mi je da moje ''user agent'' informacije sadrže točne informacije o mom pregledniku i operativnom sustavu te da će biti javno dostupne zajedno s mojom povratnom informacijom.",
        "feedback-termsofuse": "Slažem se da povratne informacije objavljujem u skladu s Uvjetima uporabe.",
        "feedback-thanks": "Hvala! Vaš odgovor je snimljen na stranicu \"[$2 $1]\".",
-       "feedback-thanks-title": "Hvala!",
+       "feedback-thanks-title": "Hvala Vam lijepa!",
        "searchsuggest-search": "Pretraži projekt {{SITENAME}}",
        "searchsuggest-containing": "sadrži....",
        "api-error-badtoken": "Interna pogrješka: Token nije ispravan.",
index 2af3f91..6ccf0dd 100644 (file)
@@ -45,7 +45,8 @@
                        "Bencoke",
                        "Máté",
                        "Wolf Rex",
-                       "BanKris"
+                       "BanKris",
+                       "Notramo"
                ]
        },
        "tog-underline": "Hivatkozások aláhúzása:",
        "post-expand-template-argument-warning": "Figyelem: Ez a lap legalább egy olyan sablonparamétert tartalmaz, amely kibontva túl nagy, így el lett(ek) hagyva.",
        "post-expand-template-argument-category": "Elhagyott sablonparaméterekkel rendelkező lapok",
        "parser-template-loop-warning": "Végtelen ciklus a következő sablonban: [[$1]]",
+       "template-loop-category": "Lapok végtelen sablonciklusokkal",
+       "template-loop-category-desc": "A lap végtelen sablonciklust tartalmaz, vagyis egy sablon önmagát hívja meg rekurzívan.",
        "parser-template-recursion-depth-warning": "A sablon rekurzív beillesztésének mélysége átlépte a határértéket ($1)",
        "language-converter-depth-warning": "A nyelvátalakító rekurzióinak száma túllépve ($1)",
        "node-count-exceeded-category": "Túl sok csomópontot tartalmazó lapok",
        "search-external": "Külső kereső",
        "searchdisabled": "Elnézésed kérjük, de a teljes szöveges keresés terhelési okok miatt átmenetileg nem használható. Ezidő alatt használhatod a lenti Google keresést, mely viszont lehetséges, hogy nem teljesen friss adatokkal dolgozik.",
        "search-error": "A keresés közben hiba történt: $1",
+       "search-warning": "$1 keresése közben hiba történt",
        "preferences": "Beállítások",
        "mypreferences": "Beállítások",
        "prefs-edits": "Szerkesztéseid száma:",
        "saveusergroups": "{{GENDER:$1|Szerkesztőcsoportok}} mentése",
        "userrights-groupsmember": "Csoporttag:",
        "userrights-groupsmember-auto": "Alapértelmezetten tagja:",
-       "userrights-groups-help": "Beállíthatod, hogy a szerkesztő mely csoportokba tartozik.\n* A bepipált doboz azt jelenti, hogy a szerkesztő benne van a csoportban, az üres azt, hogy nem.\n* A * az olyan csoportokat jelöli, amelyeket ha egyszer hozzáadtál, nem távolíthatod el, vagy nem adhatod hozzá.",
+       "userrights-groups-help": "Beállíthatod, hogy a szerkesztő mely csoportokba tartozik.\n* A bepipált doboz azt jelenti, hogy a szerkesztő benne van a csoportban\n* Az üres azt, hogy nincs.\n* A * az olyan csoportokat jelöli, amelyeket ha egyszer hozzáadtál, nem távolíthatod el, vagy nem adhatod hozzá.\n* A # azt jelöli, hogy a csoport lejárati idejét csak csökkenteni tudod, növelni nem.",
        "userrights-reason": "Ok:",
        "userrights-no-interwiki": "Nincs jogod a szerkesztők jogainak módosításához más wikiken.",
        "userrights-nodatabase": "$1 adatbázis nem létezik vagy nem helyi.",
        "rcfilters-invalid-filter": "Érvénytelen szűrő",
        "rcfilters-empty-filter": "Nincs aktív szűrő. Minden közreműködés látható.",
        "rcfilters-filterlist-title": "Szűrők",
+       "rcfilters-filterlist-whatsthis": "Mi ez?",
+       "rcfilters-filterlist-feedbacklink": "Visszajelzés küldése az új (beta) szűrőkről",
+       "rcfilters-highlightbutton-title": "Kiemelt találatok",
        "rcfilters-highlightmenu-title": "Válassz egy színt",
+       "rcfilters-highlightmenu-help": "Válassz színt ennek a tulajdonságnak kijelöléséhez",
        "rcfilters-filterlist-noresults": "Nem található szűrő",
+       "rcfilters-noresults-conflict": "Nincs találat, mert a keresési kritériumok konfliktusban vannak",
+       "rcfilters-filtergroup-registration": "Regisztráció",
        "rcfilters-filter-registered-label": "Regisztrált",
        "rcfilters-filter-registered-description": "Bejelentkezett szerkesztők.",
        "rcfilters-filter-unregistered-label": "Nem regisztrált",
        "rcfilters-filter-editsbyself-description": "Saját szerkesztések",
        "rcfilters-filter-editsbyother-label": "Mások szerkesztései",
        "rcfilters-filter-editsbyother-description": "Más felhasználók által végzett szerkesztések (nem sajátok)",
+       "rcfilters-filtergroup-userExpLevel": "Tapasztalati szint (csak regisztrált felhasználók)",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "A tapasztalat szűrő csak regisztrált felhasználókat keres, tehát ez a szűrő ellentétben van a \"Regisztrálatlan\" szűrővel.",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "A \"Regisztrálatlan\" szűrő ellentétben van egy vagy több Tapasztalat szűrővel, ami csak regisztrált felhasználókat keres. A konfliktusban lévő szűrők meg vannak jelölve fent az Aktív Szűrők résznél.",
        "rcfilters-filter-user-experience-level-newcomer-label": "Újoncok",
        "rcfilters-filter-user-experience-level-newcomer-description": "Kevesebb mint 10 szerkesztés és 4 nap aktivitás.",
        "rcfilters-filter-user-experience-level-learner-label": "Tanulók",
        "rcfilters-filter-bots-description": "Automatizált eszközök szerkesztései.",
        "rcfilters-filter-humans-label": "Ember (nem bot)",
        "rcfilters-filter-humans-description": "Emberi szerkesztők szerkesztései",
+       "rcfilters-filtergroup-reviewstatus": "Felülvizsgálati státusz",
        "rcfilters-filter-patrolled-label": "Ellenőrzött",
        "rcfilters-filter-patrolled-description": "Ellenőrzöttnek jelölt szerkesztések",
        "rcfilters-filter-unpatrolled-label": "Ellenőrizetlen",
        "rcfilters-filter-major-description": "Nem aprónak jelölt szerkesztések.",
        "rcfilters-filtergroup-changetype": "Változtatás típusa",
        "rcfilters-filter-pageedits-label": "Lapszerkesztések",
+       "rcfilters-filter-pageedits-description": "A wiki tartalom szerkesztése, beszélgetés, kategória leírások...",
        "rcfilters-filter-newpages-label": "Laplétrehozások",
        "rcfilters-filter-newpages-description": "Új oldalt létrehozó szerkesztések.",
        "rcfilters-filter-categorization-label": "Kategóriaváltoztatások",
        "undeleteviewlink": "megtekintés",
        "undeleteinvert": "Kijelölés megfordítása",
        "undeletecomment": "Ok:",
-       "undeletedrevisions": "$1 változat helyreállítva",
-       "undeletedrevisions-files": "{{PLURAL:$1|egy|$1}} változat és {{PLURAL:$2|egy|$2}} fájl visszaállítva",
-       "undeletedfiles": "{{PLURAL:$1|egy|$1}} fájl visszaállítva",
        "cannotundelete": "Egy vagy több visszaállítás sikertelen:\n$1",
        "undeletedpage": "'''$1 helyreállítva'''\n\nLásd a [[Special:Log/delete|törlési naplót]] a legutóbbi törlések és helyreállítások listájához.",
        "undelete-header": "A legutoljára törölt lapokat lásd a [[Special:Log/delete|törlési naplóban]].",
        "newimages-summary": "Ezen a speciális lapon láthatóak a legutóbb feltöltött fájlok.",
        "newimages-legend": "Fájlnév",
        "newimages-label": "Fájlnév (vagy annak részlete):",
+       "newimages-user": "IP-cím vagy felhasználónév",
        "newimages-showbots": "Botos feltöltések mutatása",
        "newimages-hidepatrolled": "Ellenőrzött szerkesztések elrejtése",
        "noimages": "Nem tekinthető meg semmi.",
        "restrictionsfield-label": "Engedélyezett IP-tartományok:",
        "restrictionsfield-help": "Egy IP-cím vagy CIDR-tartomány soronként. Minden engedélyezéséhez használd a következő tartományokat:\n<pre>\n0.0.0.0/0\n::/0\n</pre>",
        "revid": "$1 változat",
-       "pageid": "$1 lapazonosító"
+       "pageid": "$1 lapazonosító",
+       "rawhtml-notallowed": "&lt;html&gt; címkék nem használhatók normál lapokon kívül."
 }
index f8dfc24..2fbb756 100644 (file)
        "login": "Aperir session",
        "login-security": "Verifica tu identitate",
        "nav-login-createaccount": "Aperir session / crear conto",
-       "userlogin": "Aperir session / crear conto",
-       "userloginnocreate": "Aperir session",
        "logout": "Clauder session",
        "userlogout": "Clauder session",
        "notloggedin": "Tu non ha aperite un session",
        "userlogin-noaccount": "Non ha un conto?",
        "userlogin-joinproject": "Crear un conto in {{SITENAME}}",
-       "nologin": "Tu non ha un conto? $1.",
-       "nologinlink": "Crear un conto",
        "createaccount": "Crear conto",
-       "gotaccount": "Tu jam ha un conto? '''$1'''.",
-       "gotaccountlink": "Aperir session",
-       "userlogin-resetlink": "Datos de authentication oblidate?",
        "userlogin-resetpassword-link": "Contrasigno oblidate?",
        "userlogin-helplink2": "Adjuta al accesso",
        "userlogin-loggedin": "Tu ha jam aperite session como {{GENDER:$1|$1}}.\nUsa le formulario sequente pro aperir session como altere usator.",
        "createaccountmail": "Usar un contrasigno aleatori temporari e inviar lo al adresse de e-mail specificate",
        "createaccountmail-help": "Pro crear un conto pro un altere persona sin cognoscer le contrasigno.",
        "createacct-realname": "Nomine real (optional)",
-       "createaccountreason": "Motivo:",
        "createacct-reason": "Motivo",
        "createacct-reason-ph": "Proque crea tu un altere conto?",
        "createacct-reason-help": "Message pro le registro de creation de contos",
        "post-expand-template-argument-warning": "'''Attention:''' Iste pagina contine al minus un parametro de patrono que ha un grandor de expansion excessive.\nIste parametros ha essite omittite.",
        "post-expand-template-argument-category": "Paginas que omitte alcun parametros de patrono",
        "parser-template-loop-warning": "Recursion infinite detegite in patrono: [[$1]]",
+       "template-loop-category": "Paginas con buclas de patrono",
+       "template-loop-category-desc": "Le pagina contine un bucla in un patrono, i.e. un patrono que se appella recursivemente.",
        "parser-template-recursion-depth-warning": "Limite de recursion del patrono excedite ($1)",
        "language-converter-depth-warning": "Limite de profunditate del conversor de lingua excedite ($1)",
        "node-count-exceeded-category": "Paginas in que le numero de nodos excede le limite",
        "page_first": "prime",
        "page_last": "ultime",
        "histlegend": "Pro comparar duo versiones: marca lor circulos correspondente, e preme <code>Enter</code> o clicca le button in basso.<br />\nLegenda: '''({{int:cur}})''' = comparar con le version actual,\n'''({{int:last}})''' = comparar con le version precedente, '''{{int:minoreditletter}}''' = modification minor.",
-       "history-fieldset-title": "Examinar historia",
-       "history-show-deleted": "Delite solmente",
+       "history-fieldset-title": "Cercar versiones",
+       "history-show-deleted": "Solmente versiones delite",
        "histfirst": "le plus ancian",
        "histlast": "le plus nove",
        "historysize": "({{PLURAL:$1|1 byte|$1 bytes}})",
        "prefs-help-prefershttps": "Iste preferentia habera effecto a partir de tu proxime session.",
        "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": "Derectos de usator",
        "userrights-lookup-user": "Selige un usator",
        "userrights-user-editname": "Entra un nomine de usator:",
        "editusergroup": "Cargar gruppos de usator",
        "saveusergroups": "Salveguardar gruppos de {{GENDER:$1|usator}}",
        "userrights-groupsmember": "Membro de:",
        "userrights-groupsmember-auto": "Membro implicite de:",
-       "userrights-groups-help": "Tu pote alterar le gruppos al quales iste usator pertine:\n* Un quadrato marcate significa que le usator es in le gruppo.\n* Un non marcate significa que ille non lo es.\n* Un * indica que tu non pote remover le gruppo post adder lo, o vice versa.\n* Un # indica que tu pote solmente reducer le tempore de expiration del gruppo e non extender lo.",
+       "userrights-groups-help": "Tu pote alterar le gruppos al quales iste usator pertine:\n* Un quadrato marcate significa que le usator es in le gruppo.\n* Un non marcate significa que ille non lo es.\n* Un * indica que tu non pote remover le gruppo post adder lo, o vice versa.\n* Un # indica que tu pote solmente prolongar le pertinentia a iste gruppo e non accurtar lo.",
        "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-expiry-options": "1 die:1 day,1 septimana:1 week,1 mense:1 month,3 menses:3 months,6 menses:6 months,1 anno:1 year",
        "userrights-invalid-expiry": "Le hora de expiration pro le gruppo \"$1\" es invalide.",
        "userrights-expiry-in-past": "Le hora de expiration pro le gruppo \"$1\" es in le passato.",
+       "userrights-cannot-shorten-expiry": "Tu non pote accurtar le tempore de expiration del gruppo \"$1\". Solmente usatores con le permission de adder e remover iste gruppo pote accurtar tempores de expiration.",
        "userrights-conflict": "Conflicto inter cambiamentos de derectos de usator! Per favor revide e confirma tu cambiamentos.",
        "group": "Gruppo:",
        "group-user": "Usatores",
        "rcfilters-invalid-filter": "Filtro non valide",
        "rcfilters-empty-filter": "Nulle filtro active. Tote le contributiones es monstrate.",
        "rcfilters-filterlist-title": "Filtros",
+       "rcfilters-filterlist-whatsthis": "Que es isto?",
+       "rcfilters-filterlist-feedbacklink": "Da nos tu opinion sur le nove filtros (in beta)",
+       "rcfilters-highlightbutton-title": "Accentuar resultatos",
+       "rcfilters-highlightmenu-title": "Selige un color",
+       "rcfilters-highlightmenu-help": "Selige un color pro accentuar iste proprietate",
        "rcfilters-filterlist-noresults": "Nulle filtro trovate",
+       "rcfilters-noresults-conflict": "Nulle resultato trovate perque le criterios de recerca es in conflicto",
+       "rcfilters-state-message-subset": "Iste filtro non ha effecto perque su resultatos es includite in illos del sequente {{PLURAL:$2|filtro|filtros}} plus comprehensive (essaya accentuar pro poter distinguer lo): $1",
+       "rcfilters-state-message-fullcoverage": "Seliger tote le filtros in un gruppo equivale seliger nulle, dunque iste filtro non ha effecto. Le gruppo include: $1",
        "rcfilters-filtergroup-registration": "Registration del usator",
        "rcfilters-filter-registered-label": "Registrate",
        "rcfilters-filter-registered-description": "Redactores que ha aperite session.",
        "rcfilters-filter-unregistered-label": "Non registrate",
        "rcfilters-filter-unregistered-description": "Redactores que non ha aperite session.",
+       "rcfilters-filter-unregistered-conflicts-user-experience-level": "Iste filtro es in conflicto con le sequente {{PLURAL:$2|filtro|filtros}} de Experientia, le {{PLURAL:$2|qual|quales}} trova solmente usatores registrate: $1",
        "rcfilters-filtergroup-authorship": "Autor del modificationes",
        "rcfilters-filter-editsbyself-label": "Tu proprie modificationes",
        "rcfilters-filter-editsbyself-description": "Modificationes per te.",
        "rcfilters-filter-editsbyother-label": "Modificationes per alteres",
        "rcfilters-filter-editsbyother-description": "Modificationes create per altere usatores (non te).",
        "rcfilters-filtergroup-userExpLevel": "Nivello de experientia (solmente pro usatores registrate)",
-       "rcfilters-filter-userExpLevel-newcomer-label": "Novicios",
-       "rcfilters-filter-userExpLevel-newcomer-description": "Minus de 10 modificationes e 4 dies de activitate.",
-       "rcfilters-filter-userExpLevel-learner-label": "Apprentisses",
-       "rcfilters-filter-userExpLevel-learner-description": "Plus dies de activitate e modificationes que \"Novicios\" ma minus que \"Usatores con experientia\".",
-       "rcfilters-filter-userExpLevel-experienced-label": "Usatores con experientia",
-       "rcfilters-filter-userExpLevel-experienced-description": "Plus de 30 dies de activitate e 500 modificationes.",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "Filtros de Experientia trova solmente usatores registrate. Iste filtro es dunque in conflicto con le filtro \"Non registrate\".",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "Le filtro \"Non registrate\" es in conflicto con un o plure filtros \"Experientia\", le quales trova solmente usatores registrate. Le filtros in conflicto es marcate in le area \"Filtros active\" supra.",
+       "rcfilters-filter-user-experience-level-newcomer-label": "Novicios",
+       "rcfilters-filter-user-experience-level-newcomer-description": "Minus de 10 modificationes e 4 dies de activitate.",
+       "rcfilters-filter-user-experience-level-learner-label": "Apprentisses",
+       "rcfilters-filter-user-experience-level-learner-description": "Plus dies de activitate e modificationes que \"Novicios\" ma minus que \"Usatores con experientia\".",
+       "rcfilters-filter-user-experience-level-experienced-label": "Usatores con experientia",
+       "rcfilters-filter-user-experience-level-experienced-description": "Plus de 30 dies de activitate e 500 modificationes.",
        "rcfilters-filtergroup-automated": "Contributiones automatisate",
        "rcfilters-filter-bots-label": "Robot",
        "rcfilters-filter-bots-description": "Modificationes facite per instrumentos automatisate.",
        "rcfilters-filter-humans-label": "Persona (non robot)",
        "rcfilters-filter-humans-description": "Modificationes facite per esseres human.",
+       "rcfilters-filtergroup-reviewstatus": "Stato de revision",
+       "rcfilters-filter-patrolled-label": "Patruliate",
+       "rcfilters-filter-patrolled-description": "Modificationes marcate como patruliate.",
+       "rcfilters-filter-unpatrolled-label": "Non patruliate",
+       "rcfilters-filter-unpatrolled-description": "Modificationes non marcate como patruliate.",
        "rcfilters-filtergroup-significance": "Importantia",
        "rcfilters-filter-minor-label": "Modificationes minor",
        "rcfilters-filter-minor-description": "Modificationes que le autor ha marcate como minor.",
        "rcfilters-filter-categorization-description": "Registros del addition o remotion de paginas a/de categorias.",
        "rcfilters-filter-logactions-label": "Actiones traciate",
        "rcfilters-filter-logactions-description": "Actiones administrative, creation de contos, deletion de paginas, incargamentos…",
+       "rcfilters-hideminor-conflicts-typeofchange-global": "Le filtro \"Modificationes minor\" es in conflicto con un o plure filtros \"Typo de cambiamento\", perque certe typos de cambiamento non pote esser assignate como \"minor\". Le filtros in conflicto es marcate in le area \"Filtros active\" supra.",
+       "rcfilters-hideminor-conflicts-typeofchange": "Certe typos de cambiamento non pote esser assignate como \"minor\", dunque iste filtro es in conflicto con le sequente filtros \"Typo de cambiamento\": $1",
+       "rcfilters-typeofchange-conflicts-hideminor": "Iste filtro \"Typo de cambiamento\" es in conflicto con le filtro \"Modificationes minor\". Certe typos de cambiamento non pote esser assignate como \"minor\".",
        "rcnotefrom": "Ecce le {{PLURAL:$5|modification|modificationes}} a partir del <strong>$3 a $4</strong> (usque a <strong>$1</strong> entratas monstrate).",
        "rclistfrom": "Monstrar nove modificationes a partir del $3 a $2",
        "rcshowhideminor": "$1 modificationes minor",
        "editcomment": "Le summario del modification esseva: <em>$1</em>.",
        "revertpage": "Reverteva modificationes per [[Special:Contributions/$2|$2]] ([[User talk:$2|Discussion]]) al ultime version per [[User:$1|$1]]",
        "revertpage-nouser": "Reverteva modificationes per un usator celate al ultime version per {{GENDER:$1|[[User:$1|$1]]}}",
-       "rollback-success": "Revocava modificationes per $1;\nretornava al version per $2.",
+       "rollback-success": "Revocava modificationes per {{GENDER:$3|$1}};\nretornava al version per {{GENDER:$4|$2}}.",
        "rollback-success-notify": "Modificationes de $1 revertite;\nultime version de $2 restaurate. [$3 Monstrar cambiamentos]",
        "sessionfailure-title": "Error de session",
        "sessionfailure": "Il pare haber un problema con tu session de conto;\niste action ha essite cancellate como precaution contra le sequestramento de sessiones.\nPer favor preme \"retro\" e recarga le pagina de ubi tu ha venite, postea reprova.",
        "undeleteviewlink": "vider",
        "undeleteinvert": "Inverter selection",
        "undeletecomment": "Motivo:",
-       "undeletedrevisions": "{{PLURAL:$1|1 version|$1 versiones}} restaurate",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 version|$1 versiones}} e {{PLURAL:$2|1 file|$2 files}} restaurate",
-       "undeletedfiles": "$1 {{PLURAL:$1|file|files}} restaurate",
        "cannotundelete": "Le restauration ha partial- o totalmente fallite:\n$1",
        "undeletedpage": "'''$1 ha essite restaurate'''\n\nConsulta le [[Special:Log/delete|registro de deletiones]] pro un lista de deletiones e restaurationes recente.",
        "undelete-header": "Vide [[Special:Log/delete|le registro de deletiones]] pro un lista de paginas recentemente delite.",
        "newimages-summary": "Iste pagina special detalia le recente files incargate.",
        "newimages-legend": "Filtro",
        "newimages-label": "Nomine del file (o un parte de illo):",
+       "newimages-user": "Adresse de IP o nomine de usator",
        "newimages-showbots": "Monstrar files incargate per robots",
        "newimages-hidepatrolled": "Celar le files incargate patruliate",
        "noimages": "Nihil a vider.",
        "logentry-tag-update-revision": "$1 {{GENDER:$2|actualisava}} etiquettas sur le version $4 del pagina $3 ({{PLURAL:$7|addeva}} $6; {{PLURAL:$9|removeva}} $8)",
        "logentry-tag-update-logentry": "$1 {{GENDER:$2|actualisava}} etiquettas sur le entrata de registro $5 del pagina $3 ({{PLURAL:$7|addeva}} $6; {{PLURAL:$9|removeva}} $8)",
        "rightsnone": "(nulle)",
-       "revdelete-summary": "summario del modification",
        "rightslogentry-temporary-group": "$1 (temporari, usque a $2)",
        "feedback-adding": "Le responsa es addite al pagina...",
        "feedback-back": "Retornar",
        "restrictionsfield-label": "Intervallos IP permittite:",
        "restrictionsfield-help": "Un adresse IP o intervallo CIDR per linea. Pro activar toto, usa:<pre>0.0.0.0/0\n::/0</pre>",
        "revid": "version $1",
-       "pageid": "ID de pagina $1"
+       "pageid": "ID de pagina $1",
+       "rawhtml-notallowed": "Etiquettas &lt;html&gt; non pote esser usate foras de paginas normal."
 }
index 9ba13eb..9de536f 100644 (file)
@@ -51,7 +51,8 @@
                        "Bonaditya",
                        "Irus",
                        "Presidenvolksraad",
-                       "Hidayatsrf"
+                       "Hidayatsrf",
+                       "MF-Warburg"
                ]
        },
        "tog-underline": "Garis bawahi pranala:",
        "undeleteviewlink": "lihat",
        "undeleteinvert": "Balikkan pilihan",
        "undeletecomment": "Alasan:",
-       "undeletedrevisions": "$1 {{PLURAL:$1|revisi|revisi}} telah dikembalikan",
-       "undeletedrevisions-files": "$1 {{PLURAL:$1|revisi|revisi}} and $2 berkas dikembalikan",
-       "undeletedfiles": "$1 {{PLURAL:$1|berkas|berkas}} dikembalikan",
        "cannotundelete": "Beberapa pembatalan penghapusan gagal:\n$1",
        "undeletedpage": "'''$1 berhasil dikembalikan'''\n\nLihat [[Special:Log/delete|log penghapusan]] untuk data penghapusan dan pengembalian.",
        "undelete-header": "Lihat [[Special:Log/delete|log penghapusan]] untuk daftar halaman yang baru dihapus.",
        "metadata-help": "Berkas ini mengandung informasi tambahan yang mungkin ditambahkan oleh kamera digital atau pemindai yang digunakan untuk membuat atau mendigitalisasi berkas. Jika berkas ini telah mengalami modifikasi, rincian yang ada mungkin tidak secara penuh merefleksikan informasi dari gambar yang sudah dimodifikasi ini.",
        "metadata-expand": "Tampilkan rincian tambahan",
        "metadata-collapse": "Sembunyikan rincian tambahan",
-       "metadata-fields": "Bidang metadata gambar yang tercantum dalam pesan ini akan dimasukkan pada tampilan halaman gambar ketika tabel metadata diciutkan.\nData lain akan disembunyikan secara bawaan.\n* pembuat\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* hak cipta\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
+       "metadata-fields": "Bidang metadata gambar yang tercantum dalam pesan ini akan dimasukkan pada tampilan halaman gambar ketika tabel metadata diciutkan.\nData lain akan disembunyikan secara bawaan.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
        "metadata-langitem": "'''$2:''' $1",
        "metadata-langitem-default": "$1",
        "exif-imagewidth": "Lebar",
index fbadb16..9104972 100644 (file)
@@ -35,7 +35,7 @@
        "tog-enotifwatchlistpages": "Esuratannak no mabaliwan ti panid wenno ti papeles iti listaan dagiti bambantayak",
        "tog-enotifusertalkpages": "Esuratannak no mabaliwan ti panid ti tungtungak",
        "tog-enotifminoredits": "Esuratannak pay para kadagiti bassit a panagurnos kadagiti panid ken papeles",
-       "tog-enotifrevealaddr": "Iparang ti pagtaengan ti esuratko iti panagipakaaammo kadagiti esurat",
+       "tog-enotifrevealaddr": "Iparang ti adres ti esuratko iti panagipakaaammo kadagiti esurat",
        "tog-shownumberswatching": "Ipakita ti bilang dagiti agbuybuya nga agar-aramat",
        "tog-oldsig": "Ti adda a pirmam:",
        "tog-fancysig": "Tratuen ti pirma a kas wikitext (awanan iti automatiko a silpo)",
        "returnto": "Agsubli iti $1.",
        "tagline": "Manipud iti {{SITENAME}}",
        "help": "Tulong",
-       "search": "Biruken",
+       "search": "Agbiruk",
        "search-ignored-headings": " #<!-- saan a kutkutien daytoy a linia --> <pre>\n# Dagiti paulo a saanto nga ikaskaso babaen ti panagbiruk.\n# Dagiti panagbalbaliw mabalinton intono ti panid nga addaan ti paulo ket maipasurotan.\n# Mabalinmo a piliten ti panangisurot manen iti panid babaen ti awan linaon a panagurnos.\n# Ti eskritu ket kasla dagiti sumaganad:\n#   * Amin manipud ti karater ti \"#\" aginggana ti gibus ti linia ket komentario.\n#   * Amin a saan a blanko a linia ket eksakto a titulo a saan nga maikaskaso, kadakkel ti letra ken amin.\nDagiti reperensia\nDagiti silpo ti ruar\nKitaen pay\n #</pre> <!-- saan a kutkutien daytoy a linia -->",
-       "searchbutton": "Biruken",
+       "searchbutton": "Agbiruk",
        "go": "Inkan",
        "searcharticle": "Inkan",
        "history": "Pakasaritaan ti panid",
        "protectedpage": "Nasalakniban a panid",
        "jumpto": "Lumaktaw idiay:",
        "jumptonavigation": "pagdaliasatan",
-       "jumptosearch": "biruken",
+       "jumptosearch": "agbiruk",
        "view-pool-error": "Pasensian, dagiti server ket nadagsenan unay iti agdama.\nAdu unay dagiti agar-aramat nga agpadpadas nga agbuya iti daytoy a panid.\nPangngaasi nga agurayka bassit sakbay a padasem manen a serrekan daytoy a panid.\n\n$1",
        "generic-pool-error": "Pasensian, dagiti server ket agdama a nadagsenan iti agdama.\nAdu unay dagiti agar-aramat nga agpadpadas nga agbuya iti daytoy a rekurso.\nPangngaasi nga agurayka bassit sakbay a padasem manen a serrekan daytoy a rekurso.",
        "pool-timeout": "Madamdama agur-uray para iti kandado",
        "readonly": "Narikepan ti database",
        "enterlockreason": "Agikabil ti rason para iti pannakarikep, mangiraman ti maysa a karkulo no kaanonto a malukatan",
        "readonlytext": "Ti database ket agdama a narikpan kadagiti baro a panagikabil ken panagbaliw, mabalin a gapu dagiti kadawyan a pagsimpa, kalpasanna a normalto nga agsubli.\n\nTi administrador ti sistema a nangrikep ket nangited iti daytoy a palawag: $1",
-       "missing-article": "Ti database ket saan a nakabiruk ti testo ti panid a mabirukanna koma, a nanaganan ti \"$1\" $2.\n\nDaytoy ket kadawyan a gapuanan babaen ti sumaganad a baak a paggiddiatan wenno silpo ti pakasaritaan ti maysa panid a dati a naikkat.\n\nNo saan a kasta, mabalin a nakasarakka ti parikut ti sopwer.\n\nPangngaasi nga ipadamagmo kadagiti [[Special:ListUsers/sysop|administrador]], isuratmo ti pakaammo dayta nga URL.",
+       "missing-article": "Ti database ket saan a nakabiruk ti teksto ti panid a mabirukanna koma, a nanaganan ti \"$1\" $2.\n\nDaytoy ket kadawyan a gapuanan babaen ti sumaganad a baak a paggiddiatan wenno silpo ti pakasaritaan ti maysa panid a dati a naikkat.\n\nNo saan a kasta, mabalin a nakasarakka ti parikut ti sopwer.\n\nPangngaasi nga ipadamagmo kadagiti [[Special:ListUsers/sysop|administrador]], isuratmo ti pakaammo dayta nga URL.",
        "missingarticle-rev": "(rebision#: $1)",
        "missingarticle-diff": "(Dip: $1, $2)",
        "readonly_lag": "Automatiko a narikpan ti database kabayatan a dagiti tagabu a server ti database ket kumamakam iti agturay",
        "userlogin-loggedin": "Nakastrekkan a kas ni {{GENDER:$1|$1}}.\nUsaren ti porma dita baba tapno sumrek a kas sabali nga agar-aramat.",
        "userlogin-reauth": "Nasken a sumrekka manen tapno mapasingkedan a sika ni {{GENDER:$1|$1}}.",
        "userlogin-createanother": "Agpartuat iti sabali a pakabilangan",
-       "createacct-emailrequired": "Esurat a pagtaengan",
-       "createacct-emailoptional": "Esurat a pagtaengan (pagpilian)",
+       "createacct-emailrequired": "Adres ti esurat",
+       "createacct-emailoptional": "Adres ti esurat (pagpilian)",
        "createacct-email-ph": "Ikabil ti esurat a pagtaengam",
-       "createacct-another-email-ph": "Ikabil ti esurat a pagtaengan",
-       "createaccountmail": "Agusar iti pugto a temporario a kontrasenias ken ipatulod iti naisangayan nga esurat a pagtaengan",
+       "createacct-another-email-ph": "Ikabil ti adres ti esurat",
+       "createaccountmail": "Agusar iti pugto a temporario a kontrasenias ken ipatulod iti nainaganan nga adres ti esurat",
        "createaccountmail-help": "Mabalin a mausar a panagpartuat ti pakabilangan para iti sabali a tao a saan a makaammo iti kontrasenias.",
        "createacct-realname": "Pudno a nagan (pagpilian)",
        "createacct-reason": "Rason",
        "passwordtooshort": "Dagiti kontrasenias ket nasken a saan a basbasit ngem {{PLURAL:$1|1 a karakter|$1 a karkarakter}}.",
        "passwordtoolong": "Dagiti kontrasenias ket nasken a saan nga at-atiddog ngem {{PLURAL:$1|1 a karakter|$1 a karkarakter}}.",
        "passwordtoopopular": "Saan a mabalin a mausar dagiti kadawyan a mapilpili a kontrasenias. Pangngaasi nga agpili iti naisangsangayan a kontrasenias.",
-       "password-name-match": "Nasken a ti kontrasenias ket maigiddiat manipud ti naganmo.",
+       "password-name-match": "Nasken a ti kontrasenias ket maigiddiat manipud iti naganmo.",
        "password-login-forbidden": "Naipariten ti panagusar iti daytoy a nagan ti agar-aramat ken kontrasenias.",
        "mailmypassword": "Isaad manen ti kontrasenias",
        "passwordremindertitle": "Baro a temporario a kontrasenias para iti {{SITENAME}}",
-       "passwordremindertext": "Adda maysa a tao (mabalin a sika met laeng, manipud iti IP a pagtaengan a $1) ket nagkiddaw iti baro a kontrasenias para iti {{SITENAME}} ($4). Ti temporario a kontrasenias para kenni agar-aramat \"$2\" ket napartuaten ken naisaad iti \"$3\". No kastan ti kinayatmo, nasken itan a sumrekka ken agpili iti baro a kontrasenias.\nTi temporario a kontraseniasmo ket agpaso {{PLURAL:$5|iti maysa nga aldaw|kadagiti $5 nga aldaw}}.\n\nNo sabali ti nagkiddaw, wenno nalagipmon ti kontraseniasmo,\nken dimo kayaten a sukatan daytoy, mabalinmo a di ikaskaso daytoy a mensahe ken agtuloy nga usaren ti daan a kontraseniasmo.",
-       "noemail": "Awan ti esurat a pagtaengan a nairehistro para kenni agar-aramat \"$1\".",
-       "noemailcreate": "Nasken a mangitedka ti pudno nga esurat a pagtaengan.",
-       "passwordsent": "Naipatuloden ti baro a kontrasenias iti esurat a pagtaengan a nairehistro kenni \"$1\".\nPangngaasi a sumrekka manen kalpasan ti pannakaawatmo.",
+       "passwordremindertext": "Adda maysa a tao (mabalin a sika met laeng, manipud iti adres ti IP ti $1) ket nagkiddaw iti baro a kontrasenias para iti {{SITENAME}} ($4). Ti temporario a kontrasenias para kenni agar-aramat \"$2\" ket napartuaten ken naisaad iti \"$3\". No kastan ti kinayatmo, nasken itan a sumrekka ken agpili iti baro a kontrasenias.\nTi temporario a kontraseniasmo ket agpaso {{PLURAL:$5|iti maysa nga aldaw|kadagiti $5 nga aldaw}}.\n\nNo sabali ti nagkiddaw, wenno nalagipmon ti kontraseniasmo,\nken dimo kayaten a sukatan daytoy, mabalinmo a di ikaskaso daytoy a mensahe ken agtuloy nga usaren ti daan a kontraseniasmo.",
+       "noemail": "Awan ti adres ti esurat a nairehistro para kenni agar-aramat \"$1\".",
+       "noemailcreate": "Nasken a mangitedka iti umiso nga adres ti esurat.",
+       "passwordsent": "Naipatuloden ti baro a kontrasenias iti adres ti esurat a nairehistro kenni \"$1\".\nPangngaasi a sumrekka manen kalpasan iti pannakaawatmo.",
        "blocked-mailpassword": "Ti adresmo ti IP ket naserraan manipud iti panagurnos. Tapno mapawilan ti panagabuso, saan a maipalubos ti agusar ti panagipulang ti kontrasenias manipud iti daytoy nga adres ti IP.",
-       "eauthentsent": "Naipatuloden ti pammatalged nga esurat iti naikeddeng nga esurat a pagtaengan.\nSakbay a maipatulod ti ania man nga esurat iti pakabilangan, masapul a surotem dagiti maibagbaga iti esurat, tapno mapatalgedan ti pakabilangan ket agpayso a kukuam.",
+       "eauthentsent": "Naipatuloden ti pammatalged nga esurat iti naikeddeng nga adres ti esurat.\nSakbay a maipatulod ti ania man nga esurat iti pakabilangan, masapul a surotem dagiti maibagbaga iti esurat, tapno mapatalgedan ti pakabilangan ket agpayso a kukuam.",
        "throttled-mailpassword": "Ti panangisaad manen ti kontrasenias ket naipatuloden, iti kaunegan ti napalabas  {{PLURAL:$1|nga oras|a $1 nga or-oras}}.\nTapno maipawilan ti panagabuso, maysa laeng a panangisaad manen ti kontrasenias ti maipatulod iti tunggal {{PLURAL:$1|maysa nga oras|$1 nga or-oras}}.",
        "mailerror": "Biddut iti panangipatulod ti surat: $1",
-       "acct_creation_throttle_hit": "Dagiti sumarungkar iti daytoy a wiki nga agus-usar ti IP a pagtaengan ket nakapartuat {{PLURAL:$1|iti 1 a pakabilangan|kadagiti $1 a pakabilangan}} iti nasakbayan nga aldaw, nga isu laeng ti kaadu a maipalubos iti daytoy a paset ti panawen.\nA kas ti nagbanagan, dagiti agsarsarungkar nga agus-usar ti IP a pagtaengan ket agdama a saanda a mabalin a makapartuat kadagiti pakabilangan.",
+       "acct_creation_throttle_hit": "Dagiti sumarungkar iti daytoy a wiki nga agus-usar iti adres ti IP ket nakapartuat {{PLURAL:$1|iti 1 a pakabilangan|kadagiti $1 a pakabilangan}} iti nasakbayan nga $2 nga isu laeng ti kaadu a maipalubos iti daytoy a paset ti panawen.\nA kas ti nagbanagan, dagiti agsarsarungkar nga agus-usar iti adres ti IP ket agdama a saanda a mabalin a makapartuat kadagiti pakabilangan.",
        "emailauthenticated": "Ti esurat a pagtaengam ket napatalgedan idi $2, $3.",
-       "emailnotauthenticated": "Saan pay a napatalgedan ti esuratmo a pagtaengan.\nAwanto ti esurat a maipatulod para kadagiti sumaganad a langa.",
-       "noemailprefs": "Ipanaganan ti esurat a pagtaengan tapno agbalin dagitoy a langa.",
+       "emailnotauthenticated": "Saan pay a napatalgedan ti adres ti esuratmo.\nAwanto ti esurat a maipatulod para kadagiti sumaganad a langa.",
+       "noemailprefs": "Manginagan iti maysa nga adres ti esurat tapno agbalin dagitoy a langa.",
        "emailconfirmlink": "Pasingkedam ti esurat a pagtaengam",
-       "invalidemailaddress": "Ti esurat a pagtaengan ket saan a maawat ngamin ket kasla adda ti saan a napudno a porma.\nPangngaasi nga agikabil ti nasayaat a porma ti pagtaengan wenno ikkaten amin a naikabil.",
-       "cannotchangeemail": "Dagiti pakabilangan nga esurat a pagtaengan ket saan a mabaliwan iti daytoy a wiki.",
+       "invalidemailaddress": "Ti adres ti esurat ket saan a maawat ngamin ket kasla adda ti saan a napudno a pormat.\nPangngaasi nga agikabil ti nasayaat a pormat ti adres wenno ikkaten amin a naikabil.",
+       "cannotchangeemail": "Dagiti pakabilangan nga adres ti esurat ket saan a mabaliwan iti daytoy a wiki.",
        "emaildisabled": "Daytoy a sitio ket saan a makaipatulod kadagiti esurat.",
        "accountcreated": "Napartuaten ti pakabilangan",
        "accountcreatedtext": "Ti pakabilangan ti agar-aramat para kenni [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|tungtungan]]) ket napartuaten.",
        "pt-createaccount": "Agpartuat iti pakabilangan",
        "pt-userlogout": "Rummuar",
        "php-mail-error-unknown": "Di ammo a biddut iti surat ti annong ti PHP().",
-       "user-mail-no-addy": "Pinadas nga inpatulod ti esurat nga awan ti maysa nga esurat a pagtaengan.",
+       "user-mail-no-addy": "Pinadas nga inpatulod ti esurat nga awan ti maysa nga adres ti esurat.",
        "user-mail-no-body": "Pinadas nga inpatulod ti esurat nga awan ti maysa a linaonna wenno ababa unay a bagi.",
        "changepassword": "Baliwan ti kontrasenias",
        "resetpass_announce": "Tapno malpas ti panagserrek, nasken a mangisaadka iti baro a kontrasenias.",
        "passwordreset-emaildisabled": "Dagiti langa ti esurat ket nabaldado iti daytoy a wiki.",
        "passwordreset-username": "Nagan ti agar-aramat:",
        "passwordreset-domain": "Dominio:",
-       "passwordreset-email": "Esurat a pagtaengan:",
+       "passwordreset-email": "Adres ti esurat:",
        "passwordreset-emailtitle": "Dagiti salaysay ti pakabilangan iti {{SITENAME}}",
-       "passwordreset-emailtext-ip": "Adda (baka sika, ti naggapuan ti IP a pagtaengan $1) a nagkiddaw ti maysa a panangisaad manen ti kontrasenias para iti {{SITNAME}} ($4) . {{PLURAL:$3|Ti |Dagiti}} sumaganad a pakabilangan ti agar-aramat ket\nmainaig iti daytoy nga esurat a pagtaengan:\n\n$2\n\n{{PLURAL:$3|Daytoy temporario a kontrasenias|Dagitoy temporario a kontrasenias}} ket agpaso {{PLURAL:$5|iti maysa nga aldaw|kadagiti $5 nga aldaw}}.\nSumrekka koman tapno agpilika ti baro a kontraseniasmo tattan. No adda met sabali a nagaramid daytoy a \npanagkiddaw, wenno malagipmo ti dati a kontraseniasmo, ket saanmo a kayaten a sukatan, saanmo nga ikaskaso daytoy a mensahe ken \nagtuloyka nga agusar ti daan a kontrasenias.",
-       "passwordreset-emailtext-user": "Daytoy nga agar-aramat $1 iti {{SITENAME}} ket nagkiddaw ti maysa a panangisaad manen ti bukod a kontrasenias para iti {{SITENAME}}\n($4) . {{PLURAL:$3|Ti|Dagiti}} sumaganad a pakabilangan ti agar-aramat ket\nmainaig iti daytoy nga esurat a pagtaengan:\n\n$2\n\n{{PLURAL:$3|Daytoy temporario a kontrasenias|Dagitoy temporario a kontrasenias}} ket agpaso {{PLURAL:$5|iti maysa nga aldaw|kadagiti $5 nga aldaw}}.\nSumrekka koman tapno agpilika ti baro a kontraseniasmo tattan. No adda met sabali a nagaramid daytoy a \npanagkiddaw, wenno malagipmo ti dati a kontraseniasmo, ken saanmo a kayaten a sukatan, saanmo nga ikaskaso daytoy a mensahe ken \nagtuloykan nga agusar ti daan a kontraseniasmo.",
+       "passwordreset-emailtext-ip": "Adda (baka sika, ti naggapuan ti adres ti IP ti $1) a nagkiddaw iti maysa a panangisaad manen ti kontrasenias para iti {{SITENAME}} ($4) . {{PLURAL:$3|Ti|Dagiti}} sumaganad a pakabilangan ti agar-aramat ket\nmainaig iti daytoy nga adres ti esurat:\n\n$2\n\n{{PLURAL:$3|Daytoy temporario a kontrasenias|Dagitoy temporario a kontrasenias}} ket agpaso {{PLURAL:$5|iti maysa nga aldaw|kadagiti $5 nga aldaw}}.\nSumrekka koman tapno agpilika iti baro a kontraseniasmo tattan. No adda met sabali a nagaramid daytoy a \npanagkiddaw, wenno malagipmo ti dati a kontraseniasmo, ket saanmo a kayaten a sukatan, saanmo nga ikaskaso daytoy a mensahe ken \nagtuloyka nga agusar iti daan a kontrasenias.",
+       "passwordreset-emailtext-user": "Daytoy nga agar-aramat $1 iti {{SITENAME}} ket nagkiddaw ti maysa a panangisaad manen ti bukod a kontrasenias para iti {{SITENAME}}\n($4) . {{PLURAL:$3|Ti|Dagiti}} sumaganad a pakabilangan ti agar-aramat ket\nmainaig iti daytoy nga adres ti esurat:\n\n$2\n\n{{PLURAL:$3|Daytoy temporario a kontrasenias|Dagitoy temporario a kontrasenias}} ket agpaso {{PLURAL:$5|iti maysa nga aldaw|kadagiti $5 nga aldaw}}.\nSumrekka koman tapno agpilika ti baro a kontraseniasmo tattan. No adda met sabali a nagaramid daytoy a \npanagkiddaw, wenno malagipmo ti dati a kontraseniasmo, ken saanmo a kayaten a sukatan, saanmo nga ikaskaso daytoy a mensahe ken \nagtuloykan nga agusar ti daan a kontraseniasmo.",
        "passwordreset-emailelement": "Nagan ti agar-aramat: \n$1\n\nTemporario a kontrasenias: \n$2",
        "passwordreset-emailsentemail": "No daytoy nga adres ti esurat ket mainaig iti pakabilangam, maipatulodto ti maysa nga esurat iti panangisaad manen ti kontrasenias.",
        "passwordreset-emailsentusername": "No adda adres ti esurat a mainaig iti daytoy a nagan ti agar-aramat, addanto maipatulod nga esurat iti panangisaad manen ti kontrasenia.",
        "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.",
        "changeemail-no-info": "Masapul a nakastrekka tapno dagus a makapan iti ditoy a panid.",
-       "changeemail-oldemail": "Agdama nga esurat a pagtaengan:",
-       "changeemail-newemail": "Baro nga esurat a pagtaengan:",
+       "changeemail-oldemail": "Agdama nga adres ti esurat:",
+       "changeemail-newemail": "Baro nga adres ti esurat:",
        "changeemail-newemail-help": "Daytoy a pagikabilan ket nasken a blanko no kayatmo a maikkat ti adres ti esuratmo. Saanmonto a mabalin ti mangisaad manen ti nalipatan a kontrasenias ken saankanto a makaawat kadagiti esurat manipud iti daytoy a wiki no maikkat ti adres ti esurat.",
        "changeemail-none": "(awan)",
        "changeemail-password": "Ti bukodmo a kontrasenias ti {{SITENAME}}:",
        "showpreview": "Ipakita ti ipadas",
        "showdiff": "Ipakita dagiti binaliwan",
        "blankarticle": "<strong>Ballaag:</strong> Ti panid a parpatuatem ket blanko.\nNo pindutem manen ti \"{{int:savearticle}}\", ti panid ket mapartuatto nga awan ti ania man a linaon.",
-       "anoneditwarning": "<strong>Ballaag:</strong> Saanka a nakastrek. Ti IP a pagtaengan ket publikonto a makita nga agaramidka iti ania man a panagurnos. No <strong>[$1 sumrekka]</strong> wenno <strong>[$2 agpartuatka iti pakabilangan]</strong>, dagiti inurnosmo ket maitunosto iti naganmo nga agar-aramat, ken dagiti dadduma pay a pagimbagan.",
+       "anoneditwarning": "<strong>Ballaag:</strong> Saanka a nakastrek. Ti adres ti IP ket publikonto a makita nga agaramidka kadagiti ania man a panagurnos. No <strong>[$1 sumrekka]</strong> wenno <strong>[$2 agpartuatka iti pakabilangan]</strong>, dagiti inurnosmo ket maitunosto iti naganmo nga agar-aramat, ken dagiti dadduma pay a pagimbagan.",
        "anonpreviewwarning": "<em>Saanka a nakastrek. Ti panagidulin ket agirehistro ti IP a pagtaengam kadagitoy a pakasaritaan ti panagurnos iti daytoy a panid.</em>",
        "missingsummary": "<strong>Palagip:</strong> Saanka a nakaited iti pakabuklan ti panagurnos.\nNo pindutem manen ti \"{{int:savearticle}}\", maidulin ti inurnosmo nga awan ti pakabuklanna.",
        "selfredirect": "<strong>Ballaag:</strong> Ibawbaw-ingmo daytoy a panid iti isu met laeng a panid.\nMabalinmo nga innaganan ti kamali a puntaan para iti baw-ing, wenno mabalin nga ur-urnosem ti kamali a panid.\nNo pindutem manen ti \"{{int:savearticle}}\" , mapartuatto lattan ti baw-ing.",
        "subject-preview": "Panangipadas ti suheto:",
        "previewerrortext": "Adda napasamak a maysa a biddut bayat a nagpadpadas kadagiti binawbaliwam.",
        "blockedtitle": "Naseraan ti agar-aramat",
-       "blockedtext": "<strong>Naseraan ti naganmo nga agar-aramat wenno ti IP a pagtaengam.</strong>\n\nTi serra ket inaramid babaen ni $1. \nTi rason a naited ket <em>$2</em>.\n\n* Rugi ti serra: $8\n* Panagpaso ti serra: $6\n* Naikeddeng a serraanna: $7\n\nMabalinmo a kontaken ni $1 wenno sabali pay nga [[{{MediaWiki:Grouppage-sysop}}|administrador]] no kayatmo a maipalawag daytoy a panagserra.\nDimo mabalin nga aramaten ti ramit nga esuratan daytoy nga agar-aramat malaksid no adda napudno nga esurat a pagtaengan a nainaganan iti [[Special:Preferences|pakabilangan ti kakaykayatm]] ken no saanka a naparitan nga agaramat iti daytoy.\nTi agdama nga IP a pagtaengam ket $3, ti naserraan nga ID ket #$5. \nPangngaasi nga iramanmo amin dagiti salaysay dita ngato kadagiti ania man nga aramidem nga usisa.",
-       "autoblockedtext": "Ti IP a pagtaengam ket automatiko a naserraan ngamin ket inusar ti sabali nga agar-aramat, a sinerraan ni $1.\nTi rason nga inted ket:\n\n:<em>$2</em>\n\n* Rugi ti serra: $8\n* Panagpaso ti serra: $6\n* Naikeddenga a serraanna: $7\n\nMabalinmo a kontaken ni $1 wenno maysa kadagiti [[{{MediaWiki:Grouppage-sysop}}|administrador]] tapno maipalawag daytoy a panagserra.\n\nLaglagipem a saanmo a mabalin nga usaren ti \"esuratan daytoy nga agar-aramat\" a langa malaksid no addaanka ti napudno nga esurat a pagtaengan a nakarehistro iti [[Special:Preferences|kakaykayatam]] ken saanka a naserraan manipud ti panagusar daytoy.\n\nTi tatta nga IP a pagtaengam ket $3, ken ti ID ti naserraan ket #$5.\nPangngaasi nga iramanmo amin dagiti salaysay dita ngato kadagiti ania man nga aramidem nga usisa.",
+       "blockedtext": "<strong>Naseraan ti naganmo nga agar-aramat wenno ti adres ti IP.</strong>\n\nTi serra ket inaramid babaen ni $1. \nTi rason a naited ket <em>$2</em>.\n\n* Rugi ti serra: $8\n* Panagpaso ti serra: $6\n* Naikeddeng a serraanna: $7\n\nMabalinmo a kontaken ni $1 wenno sabali pay nga [[{{MediaWiki:Grouppage-sysop}}|administrador]] no kayatmo a maipalawag daytoy a panagserra.\nDimo mabalin nga aramaten ti ramit nga esuratan daytoy nga agar-aramat malaksid no adda napudno nga adres ti esurat a nainaganan iti [[Special:Preferences|pakabilangan ti kakaykayatm]] ken no saanka a naparitan nga agaramat iti daytoy.\nTi agdama nga adres ti IP ket $3, ti naserraan nga ID ket #$5. \nPangngaasi nga iramanmo amin dagiti salaysay dita ngato kadagiti ania man nga aramidem nga usisa.",
+       "autoblockedtext": "Ti bukodmo nga adres ti IP ket automatiko a naserraan ngamin ket inusar ti sabali nga agar-aramat, a sinerraan ni $1.\nTi rason nga inted ket:\n\n:<em>$2</em>\n\n* Rugi ti serra: $8\n* Panagpaso ti serra: $6\n* Naikeddenga a serraanna: $7\n\nMabalinmo a kontaken ni $1 wenno maysa kadagiti [[{{MediaWiki:Grouppage-sysop}}|administrador]] tapno maipalawag daytoy a panagserra.\n\nLaglagipem a saanmo a mabalin nga usaren ti \"esuratan daytoy nga agar-aramat\" a langa malaksid no addaanka ti napudno nga adres ti esurat a nakarehistro iti [[Special:Preferences|kakaykayatam]] ken saanka a naserraan manipud ti panagusar daytoy.\n\nTi agdama a bukodmo nga adres ti IP ket $3, ken ti ID ti naserraan ket #$5.\nPangngaasi nga iramanmo amin dagiti salaysay dita ngato kadagiti ania man nga aramidem nga usisa.",
        "blockednoreason": "awan ti naited a rason",
        "whitelistedittext": "Pangngaasi a $1 tapno makaurnos kadagiti panid.",
        "confirmedittext": "Masapul a pasingkedam ti esurat sakbay a makaurnos kadagitoy a panid.\nPangngaasi nga isaad ken ipapudnom ti esuratmo babaen ti [[Special:Preferences|kakaykayatan ti agar-aramat]].",
        "accmailtext": "Ti pugto a napartuat a kontrasenias para kenni [[User talk:$1|$1]] ket naipatuloden iti $2. Mabalin a masukatan iti\n<em>[[Special:ChangePassword|pagsukatan ti kontrasenias]]</em> a panid no sumrekka.",
        "newarticle": "(Baro)",
        "newarticletext": "Nasurotmo ti silpo ti awan pay a panid. \nTi mangpartuat ti panid, rugiamon ti agmakinilia iti kahon dita baba (kitaen ti [$1 panid ti tulong] para iti adu pay a pakaammo). \nNo addaka ditoy babaen ti biddut, pindutem ti buton ti <strong>back</strong> ti pagbasabasam.",
-       "anontalkpagetext": "----\n<em>Daytoy ti pakitungtungan a panid para iti di ammo nga agar-aramat a saan pay a nakapartuat iti pakabilangan, wenno saanna nga us-usaren.</em>\nIsu nga agusarkami ti numero nga IP a pagtaengan tapno mailasin isuda a lalaki/babai.\nTi kastoy nga IP a pagtaengan ket us-usaren a bingayan babaen ti nadumaduma nga agar-aramat.\nNo sika ket maysa a di ammo nga agar-aramat ken dagiti awan ti pategna a komentario ket napaitudo kenka, pangngaasi nga [[Special:CreateAccount|agpartuatka iti pakabilangam]] wenno [[Special:UserLogin|sumrekka]] \ntapno maliklikan ti pannakaiyallilaw kadagiti sabali a di ammo nga agar-aramat.",
+       "anontalkpagetext": "----\n<em>Daytoy ti pakitungtungan a panid para iti di ammo nga agar-aramat a saan pay a nakapartuat iti pakabilangan, wenno saanna nga us-usaren.</em>\nIsu nga agusarkami ti numero ti adres ti IP tapno mailasin isuda a lalaki/babai.\nTi kastoy nga adres ti IP ket us-usaren a pagbibingayan babaen ti nadumaduma nga agar-aramat.\nNo sika ket maysa a di ammo nga agar-aramat ken dagiti awan ti pategna a komentario ket napaitudo kenka, pangngaasi nga [[Special:CreateAccount|agpartuatka iti pakabilangam]] wenno [[Special:UserLogin|sumrekka]] \ntapno maliklikan ti pannakaiyallilaw kadagiti sabali a di ammo nga agar-aramat.",
        "noarticletext": "Awan ti agdama a teksto iti daytoy a panid.\nMabalinmo ti [[Special:Search/{{PAGENAME}}|agbiruk iti kastoy a titulo ti panid]] kadagiti sabali a panid,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} agbiruk kadagiti mainaig a listaan],\nwenno [{{fullurl:{{NAMESPACE}}:{{PAGENAME}}|action=edit}} partuaten daytoy a panid]</span>.",
        "noarticletext-nopermission": "Awan ti agdama  a linaon daytoy a panid.\nMabalinmo ti [[Special:Search/{{PAGENAME}}|agbiruk para iti titulo ti daytoy a panid]] kadagiti sabali a panid, wenno <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} agbiruk kadagiti mainaig a listaan]</span>, ngem awan ti pammalubosmo a mangpartuat iti daytoy a panid.",
        "missing-revision": "Ti panagbalbaliw ti #$1 iti daytoy a panid a nanaganan ti \"{{FULLPAGENAME}}\" ket awan.\n\nDaytoy ket kadawyan a gapuanan babaen ti sumaganad a silpo ti baak a pakasaritaan iti maysa a naikkaten a panid.\nDagiti salaysay ket mabalin a mabirukan idiay [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} listaan ti panagikkat].",
        "copyrightwarning2": "Pangngaasi a laglagipen nga amin a kontribusion iti {{SITENAME}} ket mabalin a maurnos, mabaliwan, wenno ikkaten dagiti sabali a kontributor.\nNo dimo kayat a ti sinuratmo ket maurnos nga awanan-asi ken maiwaras nga awan sungsungbatan kenka, saanmon nga ited ditoy.<br />\nIkarkarim pay kadakami a bukodmo a sinurat daytoy, wenno kinopia manipud iti publiko a dominio wenno ti kapadpadana a nawaya a nagtaudan. (kitaen ti $1 para kadagiti salaysay).\n<strong>Saan a mangited ti nakarbengan ti kopia nga obra no awan iti pammalubos!</strong>",
        "editpage-cannot-use-custom-model": "Saan a mabaliwan ti modelo ti linaon iti daytoy a panid.",
        "longpageerror": "<strong>Biddut: Ti teksto nga intedmo ket {{PLURAL:$1|maysa a kilobyte|$1 kilkilobyte}} ti katiddogna, nga at-atiddog ngem ti kangatuan iti  {{PLURAL:$2|maysa a kilobyte|$2 kilkilobyte}}.</strong>\nSaan a mabalin a maidulin.",
-       "readonlywarning": "<strong>Ballaag: Narikepan ti database tapno mataripato, isu a saanmo a mabalin nga idulin dagita inurnosmo tattan.</strong>\nMabalinmo ti agkopia ken agipegket ti testom iti papeles ti testo ken idulinmo daytoy intono madamdama.\n\nTi administrador ti sistema a nangrikep ket nangited iti daytoy a palawag: $1",
+       "readonlywarning": "<strong>Ballaag: Narikepan ti database tapno mataripato, isu a saanmo a mabalin nga idulin dagita inurnosmo tattan.</strong>\nMabalinmo ti agkopia ken agipegket ti tekstom iti papeles ti teksto ken idulinmo daytoy intono madamdama.\n\nTi administrador ti sistema a nangrikep ket nangited iti daytoy a palawag: $1",
        "protectedpagewarning": "<strong>Ballaag: Daytoy a panid ket nasalakniban tapno dagiti laeng agar-aramat nga addaan iti gundaway nga administrador ti makaurnos ditoy.</strong>\nTi naudi a naikabil iti listaan ket naited dita baba para iti reperensia:",
        "semiprotectedpagewarning": "<strong>Nota:</strong> Nasalakniban daytoy a panid tapno dagiti laeng nakarehistro nga agar-aramat ti makaurnos ditoy.\nTi naudi a naikabil iti listaan ket naited dita baba para iti reperensia:",
        "cascadeprotectedwarning": "<strong>Ballaag:</strong> Daytoy a panid ket nasalakniban tapno dagiti laeng agar-aramat nga addaan iti gundaway nga administrador ti makaurnos gapu ta nailak-am {{PLURAL:$1|iti sumaganad a panid|kadagiti sumaganad a panid}} a nasalakniban iti sariap:",
        "post-expand-template-argument-warning": "<strong>Ballaag:</strong> Daytoy a panid ket aglaon ti saan a basbasit ngem maysa a panangipalawag ti plantilia a dakkel unay ti panagpadakkelna.\nDagitoy nga argumento ket saanen a nairaman.",
        "post-expand-template-argument-category": "Pampanid a naglaon kadagiti saan a nairaman nga argumento ti plantilia",
        "parser-template-loop-warning": "Nakaduktal iti silo ti plantilia: [[$1]]",
+       "template-loop-category": "Pampanid nga agraman kadagiti silo ti plantilia",
        "parser-template-recursion-depth-warning": "Nalabsan ti patingga ti panagdullit ti kinauneg ti plantilia ($1)",
        "language-converter-depth-warning": "Nalabsan ti patingga ti pagbaliwen a kinauneg ti pagsasao ($1)",
        "node-count-exceeded-category": "Dagiti panid a nakasurokan ti bilang ti nodo",
        "parser-unstrip-loop-warning": "Nakaduktal ti di-naukisan a silo",
        "parser-unstrip-recursion-limit": "Nalabsan ti patingga ti panagdullit ti di-naukisan ($1)",
        "converter-manual-rule-error": "Adda biddut a naduktalan iti manual nga alagaden ti panagbalbaliw ti pagsasao",
-       "undo-success": "Ti panag-urnos ket saan a maisubli.\nPangngaasi a kitaen ti panangipada dita baba tapno maammuan no daytoy ti kayatmo nga aramiden, ken kalpasanna idulin dagiti sinukatan dita baba tapno malpas ti panagsubli ti inurnos.",
+       "undo-success": "Mabalin a maisubli ti panagurnos.\nPangngaasi a kitaen ti panangiyasping dita baba tapno maammuan no daytoy ti kayatmo nga aramiden, ken kalpasanna idulin dagiti sinukatan dita baba tapno malpas ti panangisubli ti inurnos.",
        "undo-failure": "Ti inurnos ket saan a maipasubli gapu ta adda dagiti nakisinnungat a patingnga a naurnos.",
        "undo-norev": "Saan a maibabawi ti naurnos ngamin ket awan daytoy wenno mabalin a naikkaten.",
        "undo-nochange": "Ti inurnos ket kasla naibabawin.",
        "undo-summary": "Ibabawi ti $1 a binaliwan babaen ni [[Special:Contributions/$2|$2]] ([[User talk:$2|tungtungan]])",
        "undo-summary-username-hidden": "Isubli ti $1 a binaliwan babaen ti nailemmeng nga agar-aramat",
-       "cantcreateaccount-text": "Ti panagpartuat iti pakabilangan manipud ti daytoy nga IP a pagtaengan (<strong>$1</strong>) ket sinerraan babaen ni [[User:$3|$3]].\n\nTi inted a rason babaen ni $3 ket <em>$2</em>",
-       "cantcreateaccount-range-text": "Ti panagpartuat iti pakabilangan manipud kadagiti pagtaengan ti IP iti sakop ti <strong>$1</strong>, a mairaman ti IP a pagtaengam (<strong>$4</strong>), ket sinerraan babaen ni [[User:$3|$3]].\n\nTi inted a rason babaen ni $3 ket <em>$2</em>",
+       "cantcreateaccount-text": "Ti panagpartuat iti pakabilangan manipud iti daytoy nga adres ti IP (<strong>$1</strong>) ket sinerraan babaen ni [[User:$3|$3]].\n\nTi inted a rason babaen ni $3 ket <em>$2</em>",
+       "cantcreateaccount-range-text": "Ti panagpartuat iti pakabilangan manipud kadagiti adres ti IP iti sakop ti <strong>$1</strong>, a mairaman ti adres ti IP (<strong>$4</strong>), ket sinerraan babaen ni [[User:$3|$3]].\n\nTi inted a rason babaen ni $3 ket <em>$2</em>",
        "viewpagelogs": "Kitaen dagiti listaan para iti daytoy a panid",
        "nohistory": "Awan ti pakasaritaan ti panagurnos iti daytoy a panid.",
        "currentrev": "Kinaudi a rebision",
        "page_first": "umuna",
        "page_last": "naudi",
        "histlegend": "Panagpili ti diperensia: Markaan dagiti kahon ti radio kadagiti rebision tapno maipada ken pinduten ti enter wenno ti buton dita baba.<br />\nLeyenda: <strong>({{int:cur}})</strong> = naggidiatan ti kinaudi a rebision, <strong>({{int:last}})</strong> = naggidiatan ti sarsarunuen a rebision, <strong>{{int:minoreditletter}}</strong> = bassit nga urnos.",
-       "history-fieldset-title": "Agbasabasa iti pakasaritaan",
-       "history-show-deleted": "Naikkat laeng",
+       "history-fieldset-title": "Agbiruk para kadagiti rebision",
+       "history-show-deleted": "Naikkat laeng ti rebision",
        "histfirst": "kadaanan",
        "histlast": "kabaruan",
        "historysize": "({{PLURAL:$1|1 byte|dagiti $1 a byte}})",
        "rev-deleted-comment": "(naikkat ti pakabuklan ti inurnos)",
        "rev-deleted-user": "(naikkat ti nagan ti agar-aramat)",
        "rev-deleted-event": "(naikkat ti listaan dagiti salaysay)",
-       "rev-deleted-user-contribs": "[naikkat ti nagan ti agar-aramat wenno IP a pagtaengan - ti inurnos ket nailemmeng manipud kadagiti kontribusion]",
+       "rev-deleted-user-contribs": "[naikkat ti nagan ti agar-aramat wenno adres ti IP - nailemmeng ti inurnos manipud kadagiti kontribusion]",
        "rev-deleted-text-permission": "Ti rebision daytoy a panid ket <strong>naikkaten</strong>.\nDagiti salaysay ket mabirukan iti [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} listaan ti panagikkat].",
        "rev-suppressed-text-permission": "Ti rebision daytoy a panid ket <strong>napasardeng</strong>.\nDagiti salaysay ket mabalin a mabirukan iti [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} listaan ti panagpasardeng].",
        "rev-deleted-text-unhide": "Ti rebision daytoy a panid ket <strong>naikkaten</strong>.\nDagiti salaysay ket mabirukan iti [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} listaan ti panagikkat].\nMabalinmo pay a [$1 makita daytoy a rebision] no kayatmo ti agtuloy.",
        "revdelete-hide-image": "Ilemmeng ti linaon ti papeles",
        "revdelete-hide-name": "Ilemmeng ti puntaan ken dagiti parametro",
        "revdelete-hide-comment": "Pakabuklan ti inurnos",
-       "revdelete-hide-user": "Nagan ti agar-amat/IP a pagtaengan ti editor",
+       "revdelete-hide-user": "Nagan ti agar-amat/adres ti IP ti editor",
        "revdelete-hide-restricted": "Depdepen ti datos manipud kadagiti administrador ken dagiti pay sabali",
        "revdelete-radio-same": "(saan a sukatan)",
        "revdelete-radio-set": "Nailemmeng",
        "prefs-misc": "Sabsabali",
        "prefs-resetpass": "Sukatan ti kontrasenias",
        "prefs-changeemail": "Sukatan wenno ikkaten ti adres ti esurat",
-       "prefs-setemail": "Isaad ti esurat a pagtaengan",
+       "prefs-setemail": "Isaad ti maysa nga adres ti esurat",
        "prefs-email": "Dagiti pagpilian ti esurat",
        "prefs-rendering": "Tabas",
        "saveprefs": "Idulin",
        "restoreprefs": "Isubli amin dagiti kasisigud a pannakaisaad (kadagiti amin a seksion)",
        "prefs-editing": "Ur-urnosen",
-       "searchresultshead": "Biruken",
+       "searchresultshead": "Agbiruk",
        "stub-threshold": "Pagpatinggaan para iti panagpormat iti silpo ti pungol ($1):",
        "stub-threshold-sample-link": "wadan",
        "stub-threshold-disabled": "Nabaldado",
        "timezoneuseserverdefault": "Usaren ti kasisigud ti wiki ($1)",
        "timezoneuseoffset": "Sabali (inaganan ti timbengan)",
        "servertime": "Oras ti server:",
-       "guesstimezone": "Punuen manipud ti pagbasabasa",
+       "guesstimezone": "Punuen manipud iti pagbasabasa",
        "timezoneregion-africa": "Aprika",
        "timezoneregion-america": "Amerika",
        "timezoneregion-antarctica": "Antartika",
        "timezoneregion-indian": "Taaw Indiano",
        "timezoneregion-pacific": "Taaw Pasipiko",
        "allowemail": "Pakabaelam ti esurat a naggapo kadagiti sabali nga agar-aramat",
-       "prefs-searchoptions": "Biruken",
+       "prefs-searchoptions": "Agbiruk",
        "prefs-namespaces": "Dagiti nagan ti espasio",
        "default": "kasisigud",
        "prefs-files": "Dagiti papeles",
        "prefs-help-gender": "Ti panangisaad daytoy a kakaykayatan ket saan a nasken.\nTi sopwer ket agus-usar iti pategna tapno tawagannaka ken ibaganaka kadagiti sabali nga agus-usar iti maitunos gramatika ti henero.\nDaytoy a pakaammo ket makitanto iti publiko.",
        "email": "Esurat",
        "prefs-help-realname": "Saan a nasken ti pudno a nagan.\nNo maited, mabalin a maaramatto a panangited iti pammadayaw kenka iti obram.",
-       "prefs-help-email": "Ti esurat a pagtaengan ket saan a masapul, ngem masapul kadagiti panangisaad manen ti kontrasenias, no malipatam ti kontraseniasmo.",
+       "prefs-help-email": "Ti adres ti esurat ket saan a masapul, ngem masapul kadagiti panangisaad manen ti kontrasenias, no malipatam ti kontraseniasmo.",
        "prefs-help-email-others": "Mabalinmo pay ti agpili tapno dagiti sabali nga agar-aramat ket mabalin nga esuratandaka babaen ti silpo ti panidmo wenno ti panid ti tungtungam.\nTi esurat a pagtaengam ket saan a maipakita no agkontak kenka dagiti agar-aramat.",
-       "prefs-help-email-required": "Masapul ti esurat a pagtaengan.",
+       "prefs-help-email-required": "Masapul ti adres ti esurat.",
        "prefs-info": "Kangrunaan a pakaammo",
        "prefs-i18n": "Internasionalisasion",
        "prefs-signature": "Pirma",
        "prefs-help-prefershttps": "Daytoy a kakaykayatan ket mapakabaelanto iti sumaruno nga iseserrekmo.",
        "prefswarning-warning": "Nagaramikka kadagiti panagbalbaliw kadagiti kakaykayatam a saan pay a naidulin.\nNo panawan daytoy a panid a saan nga agpindut iti \"$1\" dagiti kakaykayatam ket saanto a mapabaro.",
        "prefs-tabs-navigation-hint": "Pakaammo: Mabalinmo nga usaren dagiti kanigid ken kanawan a tekla ti pana tapno madaliasat ti baetan dagiti etiketa iti listaan dagiti etiketa.",
-       "userrights": "Panagtaripato kadagiti karbengan ti agar-aramat",
+       "userrights": "Dagiti karbengan ti agar-aramat",
        "userrights-lookup-user": "Agpili iti agar-aramat",
        "userrights-user-editname": "Mangiserrek iti nagan ti agar-aramat:",
        "editusergroup": "Ikarga dagiti grupo ti agar-aramat",
        "right-move-rootuserpages": "Agiyalis kadagiti ramut a panid ti agar-aramat",
        "right-move-categorypages": "Agiyalis iti pampanid ti kategoria",
        "right-movefile": "Agiyalis kadagiti papeles",
-       "right-suppressredirect": "Saan nga agpartuat kadagiti baw-ing manipud ti taudan ti pampanid no agiyalis kadagiti panid",
+       "right-suppressredirect": "Saan nga agpartuat kadagiti baw-ing manipud iti taudan ti pampanid no agiyalis kadagiti panid",
        "right-upload": "Agikarga kadagiti papeles",
        "right-reupload": "Agisurat manen kadagiti addan a papeles",
        "right-reupload-own": "Agisurat manen kadagiti addan a papeles a bukod nga inkarga",
        "right-editmyuserjs": "Agurnos kadagiti bukodmo a papeles ti JavaScript ti agar-aramat",
        "right-viewmywatchlist": "Agkita iti bukodmo a listaan ti bambantayan",
        "right-editmywatchlist": "Agurnos iti bukodmo a listaan ti bambantayan. Laglagipen nga adda dagiti tignay a mangnayonto pay laeng ti pampanid urayno awan daytoy a karbengan.",
-       "right-viewmyprivateinfo": "Agkita iti bukodmo a pribado a datos (kasla ti esurat a pagtaengan, pudno a nagan)",
-       "right-editmyprivateinfo": "Agurnos iti bukodmo a pribado a datos (kasla ti esurat a pagtaengan, pudno a nagan)",
+       "right-viewmyprivateinfo": "Agkita iti bukodmo a pribado a datos (kasla ti adres ti esurat, pudno a nagan)",
+       "right-editmyprivateinfo": "Agurnos iti bukodmo a pribado a datos (kasla ti adres ti esurat, pudno a nagan)",
        "right-editmyoptions": "Agurnos kadagiti bukodmo a kakaykayatan",
        "right-rollback": "Napardas a mangisubli kadagiti inurnos ti naudi nga agar-aramat a nagurnos iti naisangayan a panid",
        "right-markbotedits": "Agmarka kadagiti naipasubli nga urnos a kas inurnos dagiti bot",
        "right-noratelimit": "Saan a maaringan babaen dagiti patingga ti gatad",
        "right-import": "Agala ti pampanid manipud kadagiti sabali a wiki",
-       "right-importupload": "Agala kadagiti panid manipud ti naikarga a papeles",
+       "right-importupload": "Agala kadagiti panid manipud iti naikarga a papeles",
        "right-patrol": "Markaanna dagiti inurnos ti dadduma a kas napatruliaan",
        "right-autopatrol": "Automatiko a mamarkaanna ti bukod nga inurnos a kas napatruliaan",
        "right-patrolmarks": "Agkita kadagiti kaudian a binaliwan dagiti marka ti napatruliaan",
        "grant-blockusers": "Serraan ken ikkaten ti serra dagiti agar-aramat",
        "grant-createaccount": "Agpartuat kadagiti pakabilangan",
        "grant-createeditmovepage": "Agpartuat, agurnos, ken agiyalis kadagiti panid",
-       "grant-delete": "Agikkat kadagiti panid, dagit irebision, ken dagiti naikabil iti listaan",
+       "grant-delete": "Agikkat kadagiti panid, dagitrebision, ken dagiti naikabil iti listaan",
        "grant-editinterface": "Urnosen ti nagan ti espasio ti MediaWiki ken ti CSS/JavaScript ti agar-aramat",
        "grant-editmycssjs": "Urnosen ti bukodmo a CSS/JavaScript ti agar-aramat",
        "grant-editmyoptions": "Urnosem ti bukodmo a kakaykayatan ti agar-aramat",
        "upload-form-label-infoform-categories": "Katkategoria",
        "upload-form-label-infoform-date": "Petsa",
        "upload-form-label-own-work-message-generic-local": "Pasingkedak nga ikarkargak daytoy a papeles a sumursurot kadagiti termino ti serbisio ken dagiti annuroten ti lisensia iti {{SITENAME}}.",
-       "upload-form-label-not-own-work-message-generic-local": "No saanka a makaikarga iti daytoy a papeles babaen dagiti annuroten iti {{SITENAME}}, pangngaasi nga irekep daytoy a dialogo ken padasen ti sabali a pamay-an.",
+       "upload-form-label-not-own-work-message-generic-local": "No saanka a makaikarga iti daytoy a papeles babaen dagiti annuroten iti {{SITENAME}}, pangngaasi nga irikep daytoy a dialogo ken padasen ti sabali a pamay-an.",
        "upload-form-label-not-own-work-local-generic-local": "Mabalinmo pay a padasen [[Special:Upload|ti kasisigud a pagikargaan a panid]].",
        "upload-form-label-own-work-message-generic-foreign": "Maawatak nga agikarkargaak iti daytoy a papeles iti pagbibingayan a repositorio. Pasingkedak nga ar-aramidek a sumursurot kadagiti termino ti serbisio ken dagiti annuroten ti lisensia idiay.",
-       "upload-form-label-not-own-work-message-generic-foreign": "No saanka a makaikarga iti daytoy a papeles babaen dagiti annuroten iti pagbibingayan a repositorio, pangngaasi nga irekep daytoy a dialogo ken padasen ti sabali a pamay-an.",
+       "upload-form-label-not-own-work-message-generic-foreign": "No saanka a makaikarga iti daytoy a papeles babaen dagiti annuroten iti pagbibingayan a repositorio, pangngaasi nga irikep daytoy a dialogo ken padasen ti sabali a pamay-an.",
        "upload-form-label-not-own-work-local-generic-foreign": "Malinmo pay a padasen ti panagusar [[Special:Upload|ti panid a pagikargaan iti {{SITENAME}}]], no daytoy a panid ket mabalin a maikarga idiay babaen dagiti bukodda nga annuroten.",
        "backend-fail-stream": "Saan a maipan ti papeles $1.",
        "backend-fail-backup": "Saan a makaidulin ti kapada ti papeles ti $1.",
        "img-auth-accessdenied": "Nalibak ti iseserrek",
        "img-auth-nopathinfo": "Ti servermo ket saan a naisaad nga agipasa iti daytoy a pakaammo.\nMabalin a naibatay iti CGI ken saan a makasuporta ti img_auth.\nKitaen ti https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization .",
        "img-auth-notindir": "Ti kiniddaw a dalan ket saan nga adda iti naaramid a direktorio ti pagikargaan",
-       "img-auth-badtitle": "Saan a makaaramid ti umisu a titulo manipud ti \"$1\".",
+       "img-auth-badtitle": "Saan a makaaramid ti umisu a titulo manipud iti \"$1\".",
        "img-auth-nologinnWL": "Saanka a nakastrek ken ti \"$1\" ket awan idiay mabalin a listaan.",
        "img-auth-nofile": "Awan ti papeles ti \"$1\".",
        "img-auth-isdir": "Padpadasem ti mangserrek ti direktorio ti \"$1\".\nTi laeng panagserrek ti papeles ti maipalubos.",
        "nolicense": "Awan ti napili",
        "licenses-edit": "Urnosen dagiti pagpilian ti lisensia",
        "license-nopreview": "(Saan a magun-od ti panagipadas)",
-       "upload_source_url": "(ti pinilim a papeles manipud ti umisu, ken publiko a maserrekan nga URL)",
-       "upload_source_file": "(ti pinilim a papeles manipud ti kompiutermo)",
+       "upload_source_url": "(ti pinilim a papeles manipud iti umisu, ken publiko a maserrekan nga URL)",
+       "upload_source_file": "(ti pinilim a papeles manipud iti kompiutermo)",
        "listfiles-delete": "ikkaten",
        "listfiles-summary": "Daytoy nga espesial a panid ket agiparang kadagiti amin a naikarga a papeles.",
        "listfiles_search_for": "Agbiruk para iti nagan ti midia:",
        "doubleredirects": "Dagiti namindua a naibaw-ing",
        "doubleredirectstext": "Daytoy a panid ket ilistana dagiti panid nga agbaw-ing kadagiti sabali a baw-ing a pampanid.\nIti tunggal maysa nga aray ket aglaon kadagiti silpo iti umuna ken maikadua a baw-ing, ken ti pay puntaan ti maikadua a baw-ing, nga isu ti \"pudno\" a puntaan ti panid, nga ti umuna a baw-ing ket isu koma ti pakaituduanna.\nNasolbaren dagiti <del>nakurosan</del> a naikabil.",
        "double-redirect-fixed-move": "Naiyalisen ti [[$1]].\nAutomatiko idi a napabaro ken naibaw-ing tattan iti [[$2]].",
-       "double-redirect-fixed-maintenance": "Automatiko nga agsimsimpa ti doble a baw-ing manipud ti [[$1]] iti [[$2]] iti panagtaripato nga obra.",
+       "double-redirect-fixed-maintenance": "Automatiko nga agsimsimpa ti doble a baw-ing manipud iti [[$1]] iti [[$2]] iti panagtaripato nga obra.",
        "double-redirect-fixer": "Panagsimpa ti baw-ing",
        "brokenredirects": "Dagiti naputed a baw-ing",
        "brokenredirectstext": "Dagiti sumaganad a baw-ing ket nakasilpo kadagiti awan a panid:",
        "ancientpages": "Dagiti kadaanan a panid",
        "move": "Iyalis",
        "movethispage": "Iyalis daytoy a panid",
-       "unusedimagestext": "Adda dagiti sumaganad a papeles ngem saanda a naikabil iti aniaman a panid.\nPangngaasi a laglagipen a dagiti sabali a sitio ti web ket mabalin a nakasilpoda iti papeles iti dagus a URL, ken mabalin pay a nailista ditoy urayno saanda nga aktibo a maus-usar.",
+       "unusedimagestext": "Adda dagiti sumaganad a papeles ngem saanda a naikabil iti ania man a panid.\nPangngaasi a laglagipen a dagiti sabali a sitio ti web ket mabalin a nakasilpoda iti papeles iti dagus a URL, ken mabalin pay a nailista ditoy urayno saanda nga aktibo a maus-usar.",
        "unusedcategoriestext": "Ti sumaganad a kategoria ti pampanid ket adda,urayno awan ti sabali a panid wenno kategoria ti agus-usar kaniada.",
        "notargettitle": "Awan ti puntaan",
        "notargettext": "Saanmo a nainagan ti puntaan a panid wenno agar-aramat ti mangtungpal iti daytoy nga annong.",
        "apisandbox-multivalue-all-values": "$1 (Amin a patpateg)",
        "booksources": "Dagiti taudan ti libro",
        "booksources-search-legend": "Agbiruk para kadagiti taudan ti libro",
-       "booksources-search": "Biruken",
+       "booksources-search": "Agbiruk",
        "booksources-text": "Dita baba ket listaan dagiti silpo ti sabali a sitio nga aglaklako ti baro ken saan a nausar a liblibro, ken mabalin nga addaan pay iti adu a pakaammo a maipanggep kadagiti libro a birbirukem:",
-       "booksources-invalid-isbn": "Ti naited nga ISBN ket kasla saan nga umisu; kitaen dagiti biddut ti panagtulad manipud ti kasisigud a taudan.",
+       "booksources-invalid-isbn": "Ti naited nga ISBN ket kasla saan nga umisu; kitaen dagiti biddut ti panagtulad manipud iti kasisigud a taudan.",
        "magiclink-tracking-rfc": "Pampanid nga agus-usar kadagiti salamangka a silpo ti RFC",
        "magiclink-tracking-rfc-desc": "Daytoy a panid ket agus-usar kadagiti salamangka a silpo ti RFC. Kitaen ti [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] no kasano iti mangiyakar.",
        "magiclink-tracking-pmid": "Pampanid nga agus-usar kadagiti salamangka a silpo ti PMID",
        "all-logs-page": "Amin a listaan a publiko",
        "alllogstext": "Naikaykaysa a panagiparang kadagiti amin a magun-od a listaan iti {{SITENAME}}.\nMapabassitmo ti panagkita babaen ti panagpili ti kita ti listaan, ti nagan ti agar-aramat (sensitibo ti kadakkel ti letra), wenno ti naapektaran a panid (sensitibo pay ti kadakkel ti letra).",
        "logempty": "Awan dagiti maipada a banag iti listaan.",
-       "log-title-wildcard": "Agbiruk kadagiti titulo a mangrugi iti daytoy a testo",
+       "log-title-wildcard": "Agbiruk kadagiti titulo a mangrugi iti daytoy a teksto",
        "showhideselectedlogentries": "Baliwan ti panagkita kadagiti napili a naikabil iti listaan",
        "log-edit-tags": "Urnosen dagiti etiketa iti napili a listaan ti naikabkabil",
        "checkbox-select": "Agpili: $1",
        "linksearch": "Panagbiruk kadagiti akinruar a silpo",
        "linksearch-pat": "Tabas ti panagbiruk:",
        "linksearch-ns": "Nagan ti espasio:",
-       "linksearch-ok": "Biruken",
+       "linksearch-ok": "Agbiruk",
        "linksearch-text": "Dagiti naatap a tarheta a kas ti \"*.wikipedia.org\" ket mabalin nga usaren.\nMasapul ti saan a basbassit ngem kangatuan a dominio, kas pagarigan \"*.org\".<br />\n{{PLURAL:$2|Ti protokol|Dagiti protokol}} a nasuportaran: $1 (kasisigud iti http:// no awan ti nainaganan a protokol).",
-       "linksearch-line": "Ti $1 ket naisilpo manipud ti $2",
+       "linksearch-line": "Ti $1 ket naisilpo manipud iti $2",
        "linksearch-error": "Ti naatap a tarheta ket mabalin nga agparang laeng iti rugi ti nagan ti agsangaili.",
        "listusersfrom": "Iparang dagiti agar-aramat a mangrugi iti:",
        "listusers-submit": "Ipakita",
        "listgrouprights-addgroup-self": "Agnayon {{PLURAL:$2|iti grupo|kadagiti grupo}} iti bukod a pakabilangan: $1",
        "listgrouprights-removegroup-self": "Agikkat {{PLURAL:$2|iti grupo|kadagiti grupo}} manipud ti bukod a pakabilangan: $1",
        "listgrouprights-addgroup-self-all": "Inayon amin dagiti grupo iti bukod a pakabilangan",
-       "listgrouprights-removegroup-self-all": "Ikkatem amin dagiti grupo manipud ti bukod a pakabilangan",
+       "listgrouprights-removegroup-self-all": "Ikkatem amin dagiti grupo manipud iti bukod a pakabilangan",
        "listgrouprights-namespaceprotection-header": "Dagiti panangigawid ti nagan ti espasio",
        "listgrouprights-namespaceprotection-namespace": "Nagan ti espasio",
        "listgrouprights-namespaceprotection-restrictedto": "Karbengan wenno karkarbengan a mangpalubos nga agurnos ti agar-aramat",
        "hidden-category-category-desc": "Ti kategoria ket aglaon ti <code><nowiki>__HIDDENCAT__</nowiki></code> iti panid a linaonna, a mangpawil daytoy nga agparang kadagiti silpo ti kahon ti kategoria kadagiti panid babaen ti kasisigud.",
        "trackingcategories-nodesc": "Awan ti magun-od a deskripsion.",
        "trackingcategories-disabled": "Nabaldado ti kategoria",
-       "mailnologin": "Awan ti pagipatulodan a pagtaengan",
-       "mailnologintext": "Masapul a [[Special:UserLogin|nakastrekka]] ken adda umisu nga esurat a pagtaengan idiay [[Special:Preferences|kaykayatam]] tapno makaipatulod iti esurat kadagiti sabali nga agar-aramat.",
+       "mailnologin": "Awan ti pagipatulodan nga adres",
+       "mailnologintext": "Masapul a [[Special:UserLogin|nakastrekka]] ken adda umisu nga adres ti esurat iti [[Special:Preferences|kaykayatam]] tapno makaipatulod iti esurat kadagiti sabali nga agar-aramat.",
        "emailuser": "Esuratan daytoy nga agar-aramat",
        "emailuser-title-target": "Esuratam daytoy nga {{GENDER:$1|agar-aramat}}",
        "emailuser-title-notarget": "Esuratan ti agar-aramat",
-       "emailpagetext": "Mabalinmo nga usaren ti porma dita baba tapno makaipatulod iti esurat a mensahe iti daytoy nga {{GENDER:$1|agar-aramat}}.\nTi esurat nga inkabilmo iti [[Special:Preferences|kakaykayatam]] ket agparang a kas \"Naggapo\" a pagtaengan ti esurat, tapno ti nagipatulodam ket makasungbat kenka.",
+       "emailpagetext": "Mabalinmo nga usaren ti porma dita baba tapno makaipatulod iti mensahe ti esurat iti daytoy nga {{GENDER:$1|agar-aramat}}.\nTi esurat nga inkabilmo iti [[Special:Preferences|kakaykayatam]] ket agparang a kas \"Naggapo\" nga adres ti esurat, tapno ti nagipatulodam ket makasungbat kenka.",
        "defemailsubject": "Esurat ti {{SITENAME}} a naggapo kenni \"$1\"",
        "usermaildisabled": "Saanmo a mabalin ti agipatulod ti esurat",
        "usermaildisabledtext": "Saanmo a mabalin ti agipatulod ti esurat kadagiti sabali nga agar-aramat iti daytoy a wiki",
-       "noemailtitle": "Awan ti esurat a pagtaengan",
-       "noemailtext": "Ti agar-aramat ket saan a nanginagan ti umisu nga esurat a pagtaengan.",
+       "noemailtitle": "Awan ti adres ti esurat",
+       "noemailtext": "Daytoy nga agar-aramat ket saan a nanginagan ti umisu nga adres ti esurat.",
        "nowikiemailtext": "Ti agar-aramat ket mabalinna ti agpili a saan nga umawat iti esurat kadagiti sabali nga agar-aramat.",
        "emailnotarget": "Awan wenno saan nga umisu a nagan ti agar-aramat para iti nagipatulodan.",
        "emailtarget": "Ikabil ti nagan ti agar-aramat a pangitulodam",
        "addedwatchtext": "Ti \"[[:$1]]\" ken ti tungtunganna a panid ket nainayonen iti [[Special:Watchlist|listaan ti bambantayam]].",
        "addedwatchtext-talk": "Ti \"[[:$1]]\" ken ti mainaig a panidna ket nainayoen iti [[Special:Watchlist|bambantayam]].",
        "addedwatchtext-short": "Ti panid ti \"$1\" ket nainayonen iti listaan ti bambantayam.",
-       "removewatch": "Ikkaten manipud ti listaan ti bambantayan",
+       "removewatch": "Ikkaten manipud iti listaan ti bambantayan",
        "removedwatchtext": "Ti \"[[:$1]]\" ken ti tungtunganna a panid ket naikkaten manipud iti [[Special:Watchlist|listaan ti bambantayam]].",
        "removedwatchtext-talk": "Ti \"[[:$1]]\" ken ti mainaig a panidna ket naikkaten manipud iti [[Special:Watchlist|bambantayam]].",
-       "removedwatchtext-short": "Ti panid ti \"$1\" ket naikkaten manipud ti listaan ti bambantayam.",
+       "removedwatchtext-short": "Ti panid ti \"$1\" ket naikkaten manipud iti listaan ti bambantayam.",
        "watch": "Bantayan",
        "watchthispage": "Bantayan daytoy a panid",
        "unwatch": "Saanen a bantayan",
        "log-name-contentmodel": "Listaan ti panagbaliw ti modelo ti linaon",
        "log-description-contentmodel": "Dagiti pasamak a mainaig kadagiti modelo ti linaon ti panid",
        "logentry-contentmodel-new": "{{GENDER:$2|Pinartuat}} ni $1 ti panid ti $3 a nagusar ti saan a kasisigud a modelo ti linaon ti \"$5\"",
-       "logentry-contentmodel-change": "{{GENDER:$2|Binaliwan}} ni $1 ti modelo ti panid ti $3 manipud ti \"$4\" iti \"$5\"",
+       "logentry-contentmodel-change": "{{GENDER:$2|Binaliwan}} ni $1 ti modelo ti panid ti $3 manipud iti \"$4\" iti \"$5\"",
        "logentry-contentmodel-change-revertlink": "isubli",
        "logentry-contentmodel-change-revert": "isubli",
        "protectlogpage": "Listaan ti panagsalaknib",
        "protectlogtext": "Dita baba ket adda listaan dagiti sinukatan a salaknib ti panid.\nKitaen ti [[Special:ProtectedPages|listaan kadagiti nasalakniban a panid]] ti listaan kadagiti agdama a panagpataray a panagsalaknib ti panid.",
        "protectedarticle": "nasalakniban ti \"[[$1]]\"",
        "modifiedarticleprotection": "nasukatan ti agpang ti salaknib para iti \"[[$1]]\"",
-       "unprotectedarticle": "naikkat ti salaknib manipud ti \"[[$1]]\"",
-       "movedarticleprotection": "iyalis ti kasasaad ti salaknib manipud ti \"[[$2]]\" iti \"[[$1]]\"",
+       "unprotectedarticle": "naikkat ti salaknib manipud iti \"[[$1]]\"",
+       "movedarticleprotection": "iyalis ti kasasaad ti salaknib manipud iti \"[[$2]]\" iti \"[[$1]]\"",
        "protect-title": "Sukatan ti agpang ti salaknib para iti \"$1\"",
        "protect-title-notallowed": "Kitaen ti agpang ti salaknib ti \"$1\"",
        "prot_1movedto2": "[[$1]] naiyalis iti [[$2]]",
        "restriction-upload": "Agikarga",
        "restriction-level-sysop": "napno a nasalakniban",
        "restriction-level-autoconfirmed": "nasalakniban-bassit",
-       "restriction-level-all": "aniaman nga agpang",
+       "restriction-level-all": "ania man nga agpang",
        "undelete": "Kitaen dagiti naikkat a panid",
        "undeletepage": "Kitaen ken isubli dagiti naikkat a panid",
        "undeletepagetitle": "<strong>Ti sumaganad ket buklen dagiti naikkat a rebision ti [[:$1|$1]]</strong>.",
        "undeleterevisions": "$1 {{PLURAL:$1|a rebision|kadagiti rebision}} ti naikkat",
        "undeletehistory": "No ipasublim daytoy a panid, amin dagiti rebision ket maipasubli iti pakasaritaan.\nKet no adda baro a panid a kanagnaganna a naaramid ti napalabas a panagikkat, dagiti naipasubli a rebision ket agparang iti napalabas a pakasaritaan.",
        "undeleterevdel": "Ti panagikkat ket saan a maaramid no agbanag iti rabaw ti panid, wenno ti rebision ti papeles ket maikkatan ti bassit.\nIti kastoy a kaso, masapul nga ikkatem ti kur-it wenno ikkatem ti lemmeng dagiti kabarbaro a naikkat a rebision.",
-       "undeletehistorynoadmin": "Daytoy a panid ket naikkaten.\nTi rason ti panagikkat ket naipakita iti pakabuklan dita baba, ken dagita a salaysay ti agar-aramat a nagurnos iti daytoy a panid sakbay a naikkat.\nTi husto a testo dagitoy a naikat a rebision ket magun-od laeng dagiti administrador.",
+       "undeletehistorynoadmin": "Daytoy a panid ket naikkaten.\nTi rason ti panagikkat ket naipakita iti pakabuklan dita baba, ken dagita a salaysay ti agar-aramat a nagurnos iti daytoy a panid sakbay a naikkat.\nTi husto a teksto dagitoy a naikat a rebision ket magun-od laeng dagiti administrador.",
        "undelete-revision": "Naikkat ti rebision ti $1 (manipud idi $4, $5) babaen ni $3:",
        "undeleterevision-missing": "Imbalido wenno napukaw a rebision.\nAddaanka ngata ti madi a silpo, wenno ti rebision ket mabalin a naipasubli wenno naikkat manipud ti arkibo.",
        "undeleterevision-duplicate-revid": "Saan a maisubli {{PLURAL:$1|ti maysa a rebision|dagiti $1 a rebision}}, gapu ta {{PLURAL:$1|ti bukona|dagiti bukodda}} nga <code>rev_id</code> ket naus-usaren.",
        "undeleteviewlink": "kitaen",
        "undeleteinvert": "Baliktaden ti napili",
        "undeletecomment": "Rason:",
-       "undeletedrevisions": "{{PLURAL:$1|1 a rebision|dagiti $1 a rebision}} ti naisubli",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 a rebision|dagiti $1 a rebision}} ken {{PLURAL:$2|1 a papeles|dagiti $2 a papeles}} ti naisubli",
-       "undeletedfiles": "{{PLURAL:$1|1 a papeles|dagiti $1 a papeles}} ti naisubli",
        "cannotundelete": "Napaay ti sangkabassit wenno amin iti panagisubli ti panagikkat:\n$1",
        "undeletedpage": "<strong>Naisublin ti $1</strong>\n\nBinsiren ti [[Special:Log/delete|listaan ti panagikkat]] para iti rehistro dagiti kaudian panagikkat ken naisubsubli.",
        "undelete-header": "Kitaen [[Special:Log/delete|ti listaan ti panagikkat]] kadagiti kaudian a naikkat a panid.",
-       "undelete-search-title": "Biruken dagiti naikkat a panid",
-       "undelete-search-box": "Biruken dagiti naikkat a panid",
+       "undelete-search-title": "Agbiruk kadagiti naikkat a panid",
+       "undelete-search-box": "Agbiruk kadagiti naikkat a panid",
        "undelete-search-prefix": "Ipakita dagiti panid a mangrugi iti:",
-       "undelete-search-submit": "Biruken",
+       "undelete-search-submit": "Agbiruk",
        "undelete-no-results": "Awan dagiti kapada ti panid a nasarakan idiay arkibo ti panagikkat.",
        "undelete-filename-mismatch": "Saan maisubli ti panagikkat ti rebision ti papeles nga adda oras ket petsana a $1: Saan nga agpada ti nagan ti papeles.",
        "undelete-bad-store-key": "Saan a maisubli ti pinagikkat ti rebision ti papeles nga adda oras ket petsana a $1: Ti papeles ket napukaw sakbay a naikkat.",
        "contributions-userdoesnotexist": "Ti pakabilangan ti agar-aramat ni \"$1\" ket saan a nakarehistro.",
        "nocontribs": "Awan ti nasarakan a nasukatan a kapada dagitoy a kriteria.",
        "uctop": "(agdama)",
-       "month": "Manipud ti bulan (ken nasapsapa):",
-       "year": "Manipud ti tawen (ken nasapsapa):",
+       "month": "Manipud iti bulan (ken nasapsapa):",
+       "year": "Manipud iti tawen (ken nasapsapa):",
        "sp-contributions-newbies": "Iparang dagiti kontribusion dagiti kabarbaro a pakabilangan laeng",
        "sp-contributions-newbies-sub": "Para kadagiti kabarbaro a pakabilangan",
        "sp-contributions-newbies-title": "Dagiti kontribusion para kadagiti baro a pakabilangan",
        "sp-contributions-talk": "tungtungan",
        "sp-contributions-userrights": "panagtaripato kadagiti karbengan ti agar-aramat",
        "sp-contributions-blocked-notice": "Agdama a naserraan daytoy nga agar-aramat.\nTi naudi a naikabil iti listaan ti pannakaserra ket naited dita baba para iti reperensia:",
-       "sp-contributions-blocked-notice-anon": "Daytoy nga IP a pagtaengan ket agdama a naserraan.\nTi naudi a naikabil iti listaan ti pannakaserra ket adda dita baba para iti reperensia:",
+       "sp-contributions-blocked-notice-anon": "Daytoy nga adres ti IP ket agdama a naserraan.\nTi naudi a naikabil iti listaan ti pannakaserra ket adda dita baba para iti reperensia:",
        "sp-contributions-search": "Agbiruk para kadagiti kontribusion",
-       "sp-contributions-username": "IP a pagtaengan wenno nagan ti agar-aramat:",
+       "sp-contributions-username": "Adres ti IP wenno nagan ti agar-aramat:",
        "sp-contributions-toponly": "Ipakita laeng dagiti inurnos dagiti kaudian a rebision",
        "sp-contributions-newonly": "Ipakita laeng dagiti inurnos a pannakapartuat ti pampanid",
        "sp-contributions-hideminor": "Ilemmeng dagiti bassit a panagurnos",
-       "sp-contributions-submit": "Biruken",
+       "sp-contributions-submit": "Agbiruk",
        "whatlinkshere": "Dagiti nakasilpo ditoy",
        "whatlinkshere-title": "Pampanid a nakasilpo iti \"$1\"",
        "whatlinkshere-page": "Panid:",
        "blockip": "Serraan ti {{GENDER:$1|agar-aramat}}",
        "blockip-legend": "Serraan ti agar-aramat",
        "blockiptext": "Usaren ti porma dita baba tapno maserraan ti panagserrek ti panagsurat manipud iti naisangayan nga adres ti IP wenno nagan ti agar-aramat.\nDaytoy ket nasken laeng a maaramid tapno mapawilan ti bandalismo, ken segun iti [[{{MediaWiki:Policy-url}}|annuroten]].\nIkabil ti naisangayan a rason dita baba (kas pagarigan, ti panagdakamat kadagiti naisangayan a panid a nabandalismo).\nMabalinmo a serraan dagiti sakup ti adres ti IP babaen ti panagusar ti sintaksis ti [https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing CIDR]; ti kadakkelan a maipalubos a sakup ket /$1 para iti IPv4 ken /$2 para iti IPv6.",
-       "ipaddressorusername": "IP a pagtaengan wenno nagan ti agar-aramat:",
+       "ipaddressorusername": "Adres ti IP wenno nagan ti agar-aramat:",
        "ipbexpiry": "Agpaso:",
        "ipbreason": "Rason:",
        "ipbreason-dropdown": "*Dagiti kadawyan a rason ti panagserra\n** Agikabil kadagiti  madi a pakaammo\n** Agikkat kadagiti linaon ti pampanid\n** Agikabil ti spam a silpo iti ruar\n** Agikabil ti minamaag/saan a maawatan a pampanid\n** Mangbutbuteng a panagkukua /mangriribok\n** Agab-abuso kadagiti nadumaduma a pakabilangan\n** Saan a maawat a nagan ti agar-aramat",
-       "ipb-hardblock": "Iparit dagiti nakastrek nga agar-aramat manipud ti panagurnos manipud ti daytoy nga IP a pagtaengan",
+       "ipb-hardblock": "Iparit dagiti nakastrek nga agar-aramat manipud iti panagurnos manipud iti daytoy nga adres ti IP",
        "ipbcreateaccount": "Pawilan ti panagpartuat iti pakabilangan",
        "ipbemailban": "Pawilan ti agar-aramat nga agipatulod iti esurat",
-       "ipbenableautoblock": "Automatiko a mangserra ti naudi nga IP a pagtaengan nga inusar daytoy nga agar-aramat, ken dagiti sumaruno nga IP a pagtaengan nga ayan ti pangipadasanda nga agurnos",
+       "ipbenableautoblock": "Automatiko a mangserra ti naudi nga adres ti IP nga inusar daytoy nga agar-aramat, ken dagiti sumaruno nga adres ti IP nga ayan ti pangipadasanda nga agurnos",
        "ipbsubmit": "Serraan daytoy nga agar-aramat",
        "ipbother": "Sabali nga oras:",
        "ipboptions": "2 nga oras:2 hours,1 nga aldaw:1 day,3 nga aldaw:3 days,1 a lawas:1 week,2 a lawas:2 weeks,1 a bulan:1 month,3 a bulan:3 months,6 a bulan:6 months,1 a tawen:1 year,awan inggana:infinite",
        "ipb-disableusertalk": "Pawilan daytoy nga agar-aramat nga agurnos kadagiti bukodda a tungtungan a panid bayat a naserraan",
        "ipb-change-block": "Serraan manen ti agar-aramat kadagitoy a pannakaisaad",
        "ipb-confirm": "Pasingkedan ti serra",
-       "badipaddress": "Imbalido nga IP a pagtaengan",
+       "badipaddress": "Imbalido nga adres ti IP",
        "blockipsuccesssub": "Balligi ti panangserra",
        "blockipsuccesstext": "Ni [[Special:Contributions/$1|$1]] ket naserraanen.<br />\nKitaen ti [[Special:BlockList|listaan ti serra]] tapno marepaso dagiti serra.",
        "ipb-blockingself": "Mangrugrugika nga agserra kenka! Sigurado a kayatmo nga aramiden daytoy?",
        "ipb-confirmaction": "No sigurado a kayatmo nga aramiden daytoy, pangngaasi a kitaen ti \"{{int:ipb-confirm}}\" a pagikabilan dita baba.",
        "ipb-edit-dropdown": "Urnosen dagiti rason ti panagserra",
        "ipb-unblock-addr": "Lukatan ti serra ni $1",
-       "ipb-unblock": "Lukatan ti serra ti nagan ti agar-aramat wenno IP a pagtaengan",
+       "ipb-unblock": "Lukatan ti serra ti nagan ti agar-aramat wenno adres ti IP",
        "ipb-blocklist": "Kitaen dagiti adda a serra",
        "ipb-blocklist-contribs": "Dagiti kontribusion para kenni {{GENDER:$1|$1}}",
        "ipb-blocklist-duration-left": "$1 ti nabati",
        "unblockip": "Lukatan ti serra ti agar-aramat",
-       "unblockiptext": "Usaren ti porma dita baba tapno maisubli ti panagserrek ti panagsurat ti dati a naserran nga IP a pagtaengan wenno nagan ti agar-aramat.",
+       "unblockiptext": "Usaren ti porma dita baba tapno maisubli ti panagserrek ti panagsurat ti dati a naserran nga adres ti IP wenno nagan ti agar-aramat.",
        "ipusubmit": "Ikkaten daytoy a serra",
        "unblocked": "Naikkat ti pannakaserra ni [[User:$1|$1]].",
        "unblocked-range": "Naikkaten ti serra ti $1.",
        "blocklist-by": "Ti nagserra nga admin",
        "blocklist-params": "Dagiti parametro ti serra",
        "blocklist-reason": "Rason",
-       "ipblocklist-submit": "Biruken",
+       "ipblocklist-submit": "Agbiruk",
        "ipblocklist-localblock": "Lokal a serra",
        "ipblocklist-otherblocks": "Sabali {{PLURAL:$1|a serra|kadagiti serra}}",
        "infiniteblock": "inggana't inggana",
        "emailblock": "nabaldado ti esurat",
        "blocklist-nousertalk": "saan a mabalin nga agurnos ti bukod a tungtungan a panid",
        "ipblocklist-empty": "Awan linaon ti listaan ti serra.",
-       "ipblocklist-no-results": "Ti kiniddaw nga IP a pagtaengan wenno nagan ti agar-aramat ket saan a naserraan.",
+       "ipblocklist-no-results": "Ti kiniddaw nga adres ti IP wenno nagan ti agar-aramat ket saan a naserraan.",
        "blocklink": "serraan",
        "unblocklink": "ikkaten ti serra",
        "change-blocklink": "baliwan ti serra",
        "blocklog-showsuppresslog": "Daytoy nga agar-aramat ket dati a naserraan ken nailemmeng.\nTi listaan ti panagpasardeng ket naikabil dita baba para iti reperensia:",
        "blocklogentry": "naserraan ni [[$1]] nga adda ti oras a panagpaso iti $2 $3",
        "reblock-logentry": "sinukatan ti pannakaserra para kenni [[$1]] nga adda ti oras a panagpaso iti $2 $3",
-       "blocklogtext": "Daytoy ket listaan ti agar-aramat kadagiti panagserra ken panaglukat ti serra\nDagiti automatiko a panakaserra ti IP a pagtaengan ket saan a nailista.\nKitaen ti [[Special:BlockList|listaan ti serra]] para iti listaan kadagiti agdama a naiparit a pagpataray ken dagiti serra.",
+       "blocklogtext": "Daytoy ket listaan ti agar-aramat kadagiti panagserra ken panaglukat ti serra\nDagiti automatiko a pannakaserra ti adres ti IP ket saan a nailista.\nKitaen ti [[Special:BlockList|listaan ti serra]] para iti listaan kadagiti agdama a panangiparit ti pagpataray ken dagiti serra.",
        "unblocklogentry": "lukatan ti serra ni $1",
        "block-log-flags-anononly": "dagiti di ammo nga agar-aramat laeng",
        "block-log-flags-nocreate": "nabaldado ti panagpartuat ti pakabilangan",
        "ipb-otherblocks-header": "Sabali {{PLURAL:$1|a naserraan|kadagiti naserraan}}",
        "unblock-hideuser": "Saanmo a maisubli ti serra daytoy nga agar-aramat, nailemmengen ti nagan daytoy nga agar-aramat.",
        "ipb_cant_unblock": "Biddut: San a nabirukan ti ID $1 ti serra. Mabalin a nalukatanen ti serrana.",
-       "ipb_blocked_as_range": "Biddut: Ti IP a pagtaengan ti $1 ket saan a dagus a naserraan ken saan a malukatan ti serrana.\nNgem, nupay kasta, naserran a kas paset ti sakop ti $2, a mabalin a malukatan ti serrana.",
+       "ipb_blocked_as_range": "Biddut: Ti adres ti IP ti $1 ket saan a dagus a naserraan ken saan a malukatan ti serrana.\nNgem, nupay kasta, naserran a kas paset ti sakop ti $2, a mabalin a malukatan ti serrana.",
        "ip_range_invalid": "Imbalido a sakop ti IP.",
        "ip_range_toolarge": "Dagiti serra a nasakop a dakdakkel ngem /$1 ket saan a maipalubos.",
        "proxyblocker": "Pannakbagi a panagserra",
        "proxyblockreason": "Ti IP a pagtaengam ket naserraan ngamin ket daytoy ket nakalukat a panakbagi.\nPangngaasi a kontakem ti agit-ited ti serbisio ti Internetmo wenno teknikal a suporta ti gunglom ken ibagam kaniada ti nakaro a parikut ti seguridad.",
        "sorbsreason": "Ti IP a pagtaengam ket nailista a kasla \"nalukatan a pannakbagi\" iti DNSBL nga inusar babaen ti {{SITNAME}}.",
        "sorbs_create_account_reason": "Ti IP a pagtaengam ket nailista a kasla \"nalukatan a pannakbagi\" iti DNSBL nga inusar babaen ti {{SITNAME}}.\nSaanka a makapartuat ti pakabilangan.",
-       "xffblockreason": "Ti maysa nga IP a pagtaengan nga adda iti X-Forwarded-For header, mabalin a kukuam wenno ti pannakbagi a server nga us-usarem, ket naserraan. Ti kasisigud a rason ti pannakaserra idi ket: $1",
+       "xffblockreason": "Ti maysa nga adres ti IP nga adda iti paulo ti X-Forwarded-For, mabalin a kukuam wenno ti pannakbagi a server nga us-usarem, ket naserraan. Ti kasisigud a rason ti pannakaserra idi ket: $1",
        "cant-see-hidden-user": "Ti agar-aramat a kayatmo a serraan ket naserraanen ken nailemmeng.\nGapu ta awan met ti karbengam nga agilemming ti agar-aramat, saanmo a makita wenno maurnos ti serra ti agar-aramat.",
        "ipbblocked": "Saanmo a mabalin ti agserra wenno agikkat ti serra ti sabali nga agar-aramat, ngamin ket naserraanka met.",
        "ipbnounblockself": "Saanmo a mabalin a lukatan ti serram.",
        "movepagetext-noredirectfixer": "Ti panagusar ti kinabuklan dita baba, ket panaganan ti panid, iyalisna amin ti pakasaritaanna iti baro a nagan.\nTi daan a titulo ket agbalin baw-ing a panid idiay baro a titulo.\nSiguraduem a kitaen ti [[Special:DoubleRedirects|doble]] wenno [[Special:BrokenRedirects|nadadael a baw-ing]].\nRebbengem ti mangpatalged nga amin a silpo ket agtultuloy a nakatudo iti nasken a papananda.\n\nLaglagipen a ti panid ket <strong>saan</strong> a maiyalis no addaan iti sigud a panid iti baro a titulo, malaksid no awan linaonna wenno no maysa a baw-ing a panid ken awan ti panagbaliw iti pakasaritaan ti napalabas. \nKayat a sawen daytoy a mabalinmo a sukatan ti nagan ti maysa a panid manipud iti punto ti pannakasukat ti nagan no nagbiddutka, ken saanmo a mabalin a suratan manen ti addaan a panid.\n\n<strong>Nota:</strong>\nMabalin a maysa daytoy a nakaro ken saan a bigla a panagbaliw iti maysa a nasikat a panid;\npangngaasim ta pasingkedam a maawatam ti ibunga daytoy sakbay nga agtuloyka a mangbaliw.",
        "movepagetalktext": "No kur-item daytoy a kahon, automatikonto a maiyalis ti mainaig a tungtungan a panid, malaksid no addanto idiay iti adda linaon a tungtungan a panid.\n\nIti daytoy a kaso, masapul nga iyalis wenno manual nga itiponmo ti panid no kayatmo.",
        "moveuserpage-warning": "<strong>Ballaag:</strong> Mangrugrugika nga agiyalis ti panid ti agar-aramat. Pangngaasi a laglapipen a ti panid ket isu laeng ti maiyalis ken ti agar-aramat ket <em>saanto</em> a managanan.",
-       "movecategorypage-warning": "<strong>Ballaag:</strong> Mangiyal-aliskan iti panid ti kategoria. Pangngaasi a laglagipen a ti maiyalisto laeng ket ti panid ken ti aniaman a pampanid iti daan a kategoria ket <em>saanto</em> a maikategoria iti baro.",
+       "movecategorypage-warning": "<strong>Ballaag:</strong> Mangiyal-aliskan iti panid ti kategoria. Pangngaasi a laglagipen a ti maiyalisto laeng ket ti panid ken ti ania man a pampanid iti daan a kategoria ket <em>saanto</em> a maikategoria iti baro.",
        "movenologintext": "Masapul a nakarehistroka nga agar-aramat ken [[Special:UserLogin|nakastrek]] tapno makaiyalis iti panid.",
        "movenotallowed": "Awan ti pammalubosmo nga agiyalis kadagiti panid.",
        "movenotallowedfile": "Awan ti pammalubosmo nga agiyalis kadagiti papeles.",
        "cant-move-to-user-page": "Awan ti pammalubosmo nga agiyalis ti panid iti panid ti agar-aramat (malaksid kadagiti subpanid ti agar-aramat).",
        "cant-move-category-page": "Awan ti pammalubosmo nga agiyalis kadagiti panid ti kategoria.",
        "cant-move-to-category-page": "Awan ti pammalubosmo nga agiyalis ti panid iti panid ti kategoria.",
+       "cant-move-subpages": "Awan pammalubosmo nga agiyalis kadagiti subpanid.",
+       "namespace-nosubpages": "Saan a mangipalubos kadagiti subpanid ti nagan ti espasio ti \"$1\".",
        "newtitle": "Baro a titulo:",
        "move-watch": "Bantayan ti taudan a panid ken puntaan a panid",
        "movepagebtn": "Iyalis ti panid",
        "movepage-moved-redirect": "Napartuaten ti maysa a baw-ing.",
        "movepage-moved-noredirect": "Napasardeng ti pannakapartuat ti baw-ing.",
        "articleexists": "Adda panid nga adda ti kastan a nagan, wenno ti nagan a pinilim ket saan a mabalin.\nPangngaasi nga agpili ti sabali a nagan.",
-       "cantmove-titleprotected": "Saanmo a maiyalis ti panid iti daytoy a lokasion ngamin ket ti baro a titulo ket nasalakniban manipud ti pannakapartuat",
+       "cantmove-titleprotected": "Saanmo a maiyalis ti panid iti daytoy a lokasion ngamin ket ti baro a titulo ket nasalakniban manipud iti pannakapartuat",
        "movetalk": "Iyalis ti mainaig a panid ti tungtungan",
        "move-subpages": "Iyalis dagiti subpanid (aginggana iti $1)",
        "move-talk-subpages": "Iyalis dagiti subpanid ti tungtungan ti panid (aginggana iti $1)",
        "revertmove": "isubli",
        "delete_and_move_text": "Addan ti pangipanan a panid ti \"[[:$1]]\".\nKayatmo nga ikkaten daytoy tapno makaiyaliska?",
        "delete_and_move_confirm": "Wen, ikkaten ti panid",
-       "delete_and_move_reason": "Naikkat tapno mawayaan ti pannaka-iyalis manipud ti \"[[$1]]\"",
+       "delete_and_move_reason": "Naikkat tapno mawayaan ti pannaka-iyalis manipud iti \"[[$1]]\"",
        "selfmove": "Ti titulo ti taudan ken ti pangipanan ket agpadpada;\nsaanmo a maiyalis ti panid ti isu met laeng a panid.",
        "immobile-source-namespace": "Saan a maiyalis dagiti panid iti nagan ti espasio ti \"$1\"",
        "immobile-target-namespace": "Saan a maiyalis dagiti panid iti nagan ti espasio ti \"$1\"",
        "immobile-target-namespace-iw": "Ti silpo nga interwiki ket saan nga umiso a puntaan para iti panagiyalis ti panid.",
        "immobile-source-page": "Saan a mabalin nga iyalis daytoy a panid.",
        "immobile-target-page": "Saan a maiyalis iti dayta a pangipanan a titulo.",
-       "bad-target-model": "Ti kinaykayat a pangipanan ket agus-usar ti sabali a modelo ti linaon. Saan a mapagbaliwen manipud ti $1 iti $2.",
+       "bad-target-model": "Ti kinaykayat a pangipanan ket agus-usar ti sabali a modelo ti linaon. Saan a mapagbaliwen manipud iti $1 iti $2.",
        "imagenocrossnamespace": "Saan a maiyalis ti papeles iti saan nagan ti espasio ti papeles",
        "nonfile-cannot-move-to-file": "Saan a maiyalis ti saan a papeles iti nagan ti espasio ti papeles",
        "imagetypemismatch": "Ti baro a pagpaatiddog ti papeles ket saan a maipada iti bukodna a kita",
        "imageinvalidfilename": "Ti puntaan a nagan ti papeles ket imbalido",
-       "fix-double-redirects": "Agpabaro kadagiti aniaman a baw-ing a mangipatudo ti kasisigud a titulo",
+       "fix-double-redirects": "Agpabaro kadagiti ania man a baw-ing a mangipatudo ti kasisigud a titulo",
        "move-leave-redirect": "Mangibati ti baw-ing",
        "protectedpagemovewarning": "<strong>Balaag:</strong> Daytoy a panid ket nasalakniban tapno dagiti laeng agar-aramat nga addaan ti gundaway nga administrador ti makaiyalis.\nTi naudi a naikabil iti listaan ket naited dita baba para iti reperensia:",
        "semiprotectedpagemovewarning": "<strong>Nota:</strong> Nasalakniban daytoy a panid tapno dagiti laeng nakarehistro nga agar-aramat ti makaiyalis daytoy.\nTi naudi a naikabil iti listaan ket naited dita baba para iti reperensia:",
        "move-over-sharedrepo": "Addan ti [[:$1]] iti pagbingayan a repositorio. Ti panagiyalis ti papeles iti daytoy a titulo ket tuonenna ti pagbingayan a papeles.",
        "file-exists-sharedrepo": "Ti napilim a nagan ti papeles ket naususaren iti pagbingayan a repositorio.\nPangngaasi nga agpilika ti sabali a nagan.",
        "export": "Agipan kadagiti panid",
-       "exporttext": "Maipanmo ti testo ken pakasaritaan ti inurnos iti maysa a panid wenno pampanid a nabalkut ti XML.\nDaytoy ket mabalin a maikabil iti sabali a wiki nga agususar ti MediaWiki nga usaren ti [[Special:Import|pinagala ti panid]].\n\nTi pinagipan ti panid, ikabil ti titulo dita kahon ti testo dita baba, maysa a titulo iti maysa a linia, ken agpili ka no ti kayatmo ket ti agdama a pinagbaliw ken amin nga daan a panagbalbaliw, nga addaan ti linia ti pakasaritaan ti pampanid, wenno ti agdama a panagbaliw nga addaan ti pakaammo a maipapan ti kinaudi a panagurnos.\n\nNo iti kinaudi a kaso mabalinmo nga usaren ti silpo, a kas pagarigan [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] para iti panid \"[[{{MediaWiki:Mainpage}}]]\".",
+       "exporttext": "Maipanmo ti teksto ken pakasaritaan ti inurnos iti maysa a panid wenno pampanid a nabalkut ti XML.\nDaytoy ket mabalin a maikabil iti sabali a wiki nga agus-usar ti MediaWiki nga usaren ti [[Special:Import|pinagala ti panid]].\n\nTi pinagipan ti panid, ikabil ti titulo dita kahon ti teksto dita baba, maysa a titulo iti maysa a linia, ken agpilika no ti kayatmo ket ti agdama a panagbaliw ken amin nga daan a panagbalbaliw, nga addaan ti linia ti pakasaritaan ti pampanid, wenno ti agdama a panagbaliw nga addaan ti pakaammo a maipapan ti kinaudi a panagurnos.\n\nNo iti kinaudi a kaso mabalinmo nga usaren ti silpo, a kas pagarigan [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] para iti panid \"[[{{MediaWiki:Mainpage}}]]\".",
        "exportall": "Ipan amin a pampanid",
        "exportcuronly": "Iraman laeng ti kinaudi a panagbaliw, saan a ti napno a pakasaritaan",
        "exportnohistory": "----\n<strong>Nota:</strong> Ti pagipapan dagiti napno a pakasaritaan dagiti panid iti daytoy a kinabuklan ket nabaldado gapu dagiti pannakalaing ti panagandar a rason.",
        "exportlistauthors": "Iraman ti amin a listaan kadagiti nagaramid iti tunggal a maysa a panid",
        "export-submit": "Agipan",
-       "export-addcattext": "Agnayon kadagiti panid manipud ti kategoria:",
+       "export-addcattext": "Agnayon kadagiti panid manipud iti kategoria:",
        "export-addcat": "Inayon",
-       "export-addnstext": "Agnayon kadagiti panid manipud ti nagan ti espasio:",
+       "export-addnstext": "Agnayon kadagiti panid manipud iti nagan ti espasio:",
        "export-addns": "Inayon",
        "export-download": "Idulin a kas papeles",
        "export-templates": "Mangiraman kadagiti plantilia",
        "export-manual": "Manual nga inayon dagiti panid:",
        "allmessages": "Dagiti mensahe ti sistema",
        "allmessagesname": "Nagan",
-       "allmessagesdefault": "Kasisigud a testo ti mensahe",
-       "allmessagescurrent": "Agdama a testo ti mensahe",
+       "allmessagesdefault": "Kasisigud a teksto ti mensahe",
+       "allmessagescurrent": "Agdama a teksto ti mensahe",
        "allmessagestext": "Daytoy ti listaan dagiti mensahe ti sistema a magun-od iti nagan ti espasio ti MediaWiki.\nPangngaasi a bisitaen ti [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation Lokalisasion ti MediaWiki] ken [https://translatewiki.net translatewiki.net] no kayatmo ti agparawad kadagiti sapasap a panagipatarus ti MediaWiki.",
        "allmessagesnotsupportedDB": "Daytoy a panid ket saan a musar gapu ta nabaldado ti <strong>$wgUseDatabaseMessages</strong>.",
        "allmessages-filter-legend": "Sagat",
        "thumbnail-more": "Padakkelen",
        "filemissing": "Awan ti papeles",
        "thumbnail_error": "Biddut ti panagpartuat ti bassit a ladawan: $1",
-       "thumbnail_error_remote": "Biddut a mensahe manipud ti $1: \n$2",
+       "thumbnail_error_remote": "Biddut a mensahe manipud iti $1: \n$2",
        "djvu_page_error": "Ti DjVu a panid ket saan a masakop",
        "djvu_no_xml": "Saan a naala ti XML iti DjVu a papeles",
        "thumbnail-temp-create": "Saan a makapartuat ti temporario a bassit a ladawan ti papeles",
        "import-mapping-subpage": "Alaen a kas dagiti subpanid ti sumaganad a panid:",
        "import-upload-filename": "Nagan ti papeles:",
        "import-comment": "Komentario:",
-       "importtext": "Pangngaasi nga ipanmo ti papeles manipud ti nagtaudan a wiki nga agusar ti [[Special:Export|ramit ti panagipan]].\nIdulinmo iti bukodmo a kompiuter ken ikarga ditoy.",
+       "importtext": "Pangngaasi nga ipanmo ti papeles manipud iti nagtaudan a wiki nga agusar ti [[Special:Export|ramit ti panagipan]].\nIdulinmo iti bukodmo a kompiuter ken ikarga ditoy.",
        "importstart": "Agal-ala kadagiti panid...",
        "import-revision-count": "$1 {{PLURAL:$1|a rebision|kadagiti rebision}}",
        "importnopages": "Awan dagiti maala a panid.",
        "xml-error-string": "$1 iti linia $2, tukol $3 (byte $4): $5",
        "import-upload": "Ikarga ti datos ti XML",
        "import-token-mismatch": "Pannakapukaw ti sesion ti datos.\n\nMabalin a nakaruarka. <strong>Pangngaasi a pasingkedan a nakastrekka pay laeng ken padasem manen</strong>.\nNo saan pay a mabalin, padasem ti [[Special:UserLogout|rummuar]] ken sumrek manen, ken kitaen no ti pagpasabasam ket mangipalubos kadagiti galieta manipud iti daytoy a sitio.",
-       "import-invalid-interwiki": "Saan a makaala manipud ti nainaganan a wiki.",
+       "import-invalid-interwiki": "Saan a makaala manipud iti nainaganan a wiki.",
        "import-error-edit": "Ti panid ti \"$1\" ket saan idi a naala ngamin ket saanmo a mabalin nga urnosen.",
        "import-error-create": "Ti panid ti \"$1\" ket saan idi a naala ngamin ket saanmo a mabalin a partuaten.",
        "import-error-interwiki": "Ti panid ti \"$1\" ket saan idi a naala ngamin ket ti nagan ket naireserba para iti ruar a panagsilpo (interwiki).",
        "import-rootpage-invalid": "Ti naited a ramut ti panid ket imbalido a titulo.",
        "import-rootpage-nosubpage": "Ti nagan ti espasio ti \"$1\" iti ramut ti panid ket saan a mangpalubos kadagiti subpanid.",
        "importlogpage": "Listaan ti panagala",
-       "importlogpagetext": "Dagiti administratibo a panagala kadagiti panid nga addaan iti pakasaritaan ti panag-urnos manipud kadagiti sabali a wiki.",
+       "importlogpagetext": "Dagiti administratibo a panagala kadagiti panid nga addaan iti pakasaritaan ti panagurnos manipud kadagiti sabali a wiki.",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|a rebision|kadagiti rebision}} ti naala",
-       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|rebision|dagiti rebision}} ti naala manipud ti $2",
+       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|rebision|dagiti rebision}} ti naala manipud iti $2",
        "javascripttest": "Panagsubok ti JavaScript",
        "javascripttest-pagetext-unknownaction": "Di ammo a tignay ti \"$1\".",
        "javascripttest-qunit-intro": "Kitaen ti [ $1 dukomentasion ti panagsubok] idiay mediawiki.org.",
        "tooltip-pt-userpage": "Panidmo nga agar-aramat",
-       "tooltip-pt-anonuserpage": "Ti panid ti agar-aramat para iti daytoy nga IP a pagtaengan a kas ur-urnosem",
+       "tooltip-pt-anonuserpage": "Ti panid ti agar-aramat para iti daytoy nga adres ti IP a kas ur-urnosem",
        "tooltip-pt-mytalk": "Tungtungam a panid",
        "tooltip-pt-anontalk": "Pakitungtungan a maipanggep kadagiti panagurnos manipud iti daytoy nga adres ti IP",
        "tooltip-pt-preferences": "Dagiti kakaykayatam",
        "tooltip-ca-undelete": "Isubli dagiti inurnos a naaramid iti daytoy a panid sakbay idi naikkat",
        "tooltip-ca-move": "Iyalis daytoy a panid",
        "tooltip-ca-watch": "Inayon daytoy a panid iti listaan ti bambantayam",
-       "tooltip-ca-unwatch": "Ikkaten daytoy a panid manipud ti listan ti bambantayam",
+       "tooltip-ca-unwatch": "Ikkaten daytoy a panid manipud iti listan ti bambantayam",
        "tooltip-search": "Agbiruk iti {{SITENAME}}",
        "tooltip-search-go": "Inka idiay panid nga adda kastoy a naganna no adda",
-       "tooltip-search-fulltext": "Biruken dagiti panid para iti daytoy a testo",
+       "tooltip-search-fulltext": "Agbiruk kadagiti panid para iti daytoy a teksto",
        "tooltip-p-logo": "Sarungkaran ti umuna a panid",
        "tooltip-n-mainpage": "Sarungkaran ti umuna a panid",
        "tooltip-n-mainpage-description": "Sarungkaran ti umuna a panid",
        "creditspage": "Dagiti pammadayaw ti panid",
        "nocredits": "Awan dagiti pakaammo ti pammadayaw a magun-od para iti daytoy a panid.",
        "spamprotectiontitle": "Panagsalaknib a sagat para iti spam",
-       "spamprotectiontext": "Ti testo a kayatmo nga idulin ket sinerraan babaen ti sagat ti spam.\nDaytoy ket mabalin a gapuanan babaen ti silpo a naiparit ti akin ruar a sitio.",
-       "spamprotectionmatch": "Ti sumaganad a testo ket isu ti nangkalbit ti sagat ti spam: $1",
+       "spamprotectiontext": "Ti teksto a kayatmo nga idulin ket sinerraan babaen ti sagat ti spam.\nDaytoy ket mabalin a gapuanan babaen ti silpo a naiparit ti akinruar a sitio.",
+       "spamprotectionmatch": "Ti sumaganad a teksto ket isu ti nangkalbit ti sagat ti spam: $1",
        "spambot_username": "Panagdalus iti spam ti MediaWiki",
        "spam_reverting": "Ipasubli ti naudi a rebision nga awan dagiti linaon a silpo iti $1",
        "spam_blanking": "Amin dagiti rebision ket aglaon kadagiti silpo iti $1, iblanko",
        "newimages-showbots": "Ipakita dagiti naikarga babaen dagiti bot",
        "newimages-hidepatrolled": "Ilemmeng dagiti panangikarga a napatruliaan",
        "noimages": "Awan ti makita.",
-       "ilsubmit": "Biruken",
+       "ilsubmit": "Agbiruk",
        "bydate": "babaen ti petsa",
        "sp-newimages-showfrom": "Iparang dagiti baro a papeles a mangrugi manipud idi $2, $1",
        "seconds": "{{PLURAL:$1|$1 a segundo|$1 a segsegundo}}",
        "confirmemail_needlogin": "Masapulmo ti $1 tapno mapasingkedan ti esurat a pagtaengam.",
        "confirmemail_success": "Napasingkedanen ti esurat a pagtaengam.\nMabalinmo tattan ti [[Special:UserLogin|sumrek]] ken nanamen ti wiki.",
        "confirmemail_loggedin": "Napasingkedanen ti esurat a pagtaengam.",
-       "confirmemail_subject": "Pammasingked ti esurat a pagtaengan ti {{SITENAME}}",
-       "confirmemail_body": "Addaan, baka sika, ti naggapu ti IP a pagtaengan $1,\nket nagrehistro ti pakabilangan \"$2\" iti daytoy nga esurat a pagtaengan idiay {{SITENAME}}\n\nTapno mapasingkedan a daytoy a pakabilangan ket kukuam ken ti \npinagpabalin ti esurat a kita idiay {{SITENAME}}, lukatam daytoy a panilpo dita pabasabasam:\n\n$3\n\nNo *saanmo* nga inrehistro ti pakabilangam, surotem daytoy a panilpo\nta pasardengem ti pinakasingkedan ti esurat a  pagtaengam:\n\n$5\n\nDaytoy a pammasingked a kodigo ket agpaso iti $4.",
-       "confirmemail_body_changed": "Addaan, baka sika, ti naggapu ti IP a pagtaengam $1,\nket nangsukat ti esurat a pagtaengan ti pakabilangan \"$2\" iti daytoy a pagtaengan idiay {{SITENAME}}\n\nTapno mapasingkedan daytoy a pakabilangan ket kukuam ken ti \npanagpabalin ti esurat a kita idiay {{SITENAME}}, lukatam daytoy a panilpo dita pabasabasam:\n\n$3\n\nNo *saanmo* nga inrehistro ti pakabilangam, surutem daytoy a panilpo\nta pasardengem ti pinakasingkedan ti esurat a pagtaengam:\n\n$5\n\nDaytoy a kodigo a pasingkedan ket agpaso iti $4.",
-       "confirmemail_body_set": "Addaan, baka sika met laeng, manipud ti IP a pagtaengan ti $1,\nket nangikabil ti esurat a pagtaengan ti pakabilangan ti \"$2\" iti daytoy a pagtaengan idiay {{SITENAME}}\n\nTapno mapasingkedan daytoy a pakabilangan ket agpayso a kukuam ken \npakabaelan dagiti esurat a langa idiay {{SITENAME}}, lukatam daytoy a silpo idiay pabasabasam:\n\n$3\n\nNo daytoy a pakabilangan ket *saanmo* a kukua, surutem daytoy a silpo\ntapno ukasen ti panagpasingked ti esurat a pagtaengan:\n\n$5\n\nDaytoy a panagpasingked ti kodigo ket agpaso intono $4.",
+       "confirmemail_subject": "Pammasingked ti adres ti esurat ti {{SITENAME}}",
+       "confirmemail_body": "Addaan, baka sika, ti naggapu ti adres ti IP ti $1,\nket nagrehistro ti pakabilangan \"$2\" iti daytoy nga adres ti esurat iti {{SITENAME}}\n\nTapno mapasingkedan a daytoy a pakabilangan ket kukuam ken ti \npinagpabalin ti esurat a kita iti {{SITENAME}}, lukatam daytoy a silpo dita pabasabasam:\n\n$3\n\nNo *saanmo* nga inrehistro ti pakabilangam, surotem daytoy a silpo\nta pasardengem ti panagpasingked ti adres ti esuratmo:\n\n$5\n\nDaytoy a kodigo ti pammasingked ket agpaso intono $4.",
+       "confirmemail_body_changed": "Addaan, baka sika, ti naggapu ti adres ti IP ti $1,\nket nangsukat ti adres ti esurat ti pakabilangan \"$2\" iti daytoy ngaadres iti {{SITENAME}}\n\nTapno mapasingkedan daytoy a pakabilangan ket kukuam ken ti \npanagpabalin ti esurat a kita idiay {{SITENAME}}, lukatam daytoy a panilpo dita pabasabasam:\n\n$3\n\nNo *saanmo* nga inrehistro ti pakabilangam, surutem daytoy a silpo\nta pasardengem ti panagpasingked ti adres ti esuratmo:\n\n$5\n\nDaytoy a kodigo a pammasingked ket agpaso intono $4.",
+       "confirmemail_body_set": "Addaan, baka sika met laeng, manipud iti adres ti IP ti $1,\nket nangikabil ti adres ti esurat ti pakabilangan ti \"$2\" iti daytoy nga adres iti {{SITENAME}}\n\nTapno mapasingkedan daytoy a pakabilangan ket agpayso a kukuam ken \npakabaelan dagiti esurat a langa iti {{SITENAME}}, lukatam daytoy a silpo iti pabasabasam:\n\n$3\n\nNo daytoy a pakabilangan ket *saanmo* a kukua, surutem daytoy a silpo\ntapno ukasen ti panagpasingked ti adres ti esurat:\n\n$5\n\nDaytoy a panagpasingked ti kodigo ket agpaso intono $4.",
        "confirmemail_invalidated": "Naukas ti pammasingked ti esurat a pagtaengam",
        "invalidateemail": "Ukasen ti pammasingked ti esurat",
        "notificationemail_subject_changed": "Nabaliwanen ti nairehistro nga adres ti esurat ti {{SITENAME}}",
        "confirm-watch-button": "Sige",
        "confirm-watch-top": "Inayon daytoy a panid iti listaan ti bambantayam?",
        "confirm-unwatch-button": "Sige",
-       "confirm-unwatch-top": "Ikkatem daytoy a panid manipud ti listaan ti bambantayam?",
+       "confirm-unwatch-top": "Ikkatem daytoy a panid manipud iti listaan ti bambantayam?",
        "confirm-rollback-button": "Sige",
        "confirm-rollback-top": "Isubli dagiti panagurnos iti daytoy a panid?",
        "quotation-marks": "\"$1\"",
        "lag-warn-normal": "Dagiti panangbalbaliw a nabarbaro ngem $1 {{PLURAL:$1|a segundo|a segsegundo}} ket mabalin a saan a maiparang iti daytoy a listaan.",
        "lag-warn-high": "Gapu ti kinabuntog ti database server, dagiti nasukatan a barbaro ngem $1 {{PLURAL:$1|a segundo|a segegundo}} ket mabalin a saan nga agparang iti daytoy a listaan.",
        "watchlistedit-normal-title": "Urnosen ti listaan ti bambantayan",
-       "watchlistedit-normal-legend": "Ikkaten dagiti titulo manipud ti listaan ti bambantayam",
+       "watchlistedit-normal-legend": "Ikkaten dagiti titulo manipud iti listaan ti bambantayam",
        "watchlistedit-normal-explain": "Dagiti titulo ti listaan ti bambantayam ket naipakita dita baba.\nTi mangikkat ti titulo, ikur-it ti kaaripingna a kahon, ken pinduten ti \"{{int:Watchlistedit-normal-submit}}\".\nMabalinmo pay nga [[Special:EditWatchlist/raw|urnosen ti naata a listaan]].",
        "watchlistedit-normal-submit": "Ikkaten dagiti titulo",
-       "watchlistedit-normal-done": "{{PLURAL:$1|1 ti titulo|$1 dagiti titulo}} a naikkat manipud ti listaan ti bambantayam:",
+       "watchlistedit-normal-done": "{{PLURAL:$1|Ti bugbugtong a titulo|Dagiti $1 a titulo}} ket naikkat manipud iti listaan ti bambantayam:",
        "watchlistedit-raw-title": "Urnosen ti naata a listaan ti bambantayan",
        "watchlistedit-raw-legend": "Urnosen ti naata a listaan ti bambantayan",
        "watchlistedit-raw-explain": "Dagiti titulo ti listaan ti bambantayam ket naipakita dita baba, ken mabaliwam nga urnosen babaen ti panagnayon ken panagkissay manipud ti listaan;\nmaysa a titulo tunggal maysa a linia.\nNo malpaska, pinduten ti \"{{int:Watchlistedit-raw-submit}}\".\nMabalinmo pay nga [[Special:EditWatchlist|usaren ti pagalagadan nga editor]].",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 a titulo|$1 kadagiti titulo}} ti naikkat:",
        "watchlistedit-clear-title": "Dalusan ti listaan ti bambantayan",
        "watchlistedit-clear-legend": "Dalusan ti listaan ti bambantayan",
-       "watchlistedit-clear-explain": "Amin dagiti titulo ket maikkatto manipud ti listaan ti bambantayam",
+       "watchlistedit-clear-explain": "Amin dagiti titulo ket maikkatto manipud iti listaan ti bambantayam",
        "watchlistedit-clear-titles": "Dagiti titulo:",
        "watchlistedit-clear-submit": "Dalusan ti listaan ti bambantayan (Daytoy ket permanente!)",
        "watchlistedit-clear-done": "Nadalusanen ti bambantayam.",
        "version-poweredby-others": "dadduma pay",
        "version-poweredby-translators": "dagiti agipatpatarus iti translatewiki.net",
        "version-credits-summary": "Kayatmi koma a pammadayawan dagiti sumaganad a tao para kadagiti kontribusonda iti [[Special:Version|MediaWiki]].",
-       "version-license-info": "Ti MediaWiki ket nawaya a sopwer; mabalinmo nga iwaras ken/wenno baliwan babaen kadagiti termino ti GNU General Public License a naipablaak babaen ti Free Software Foundation; wenno bersion 2 iti Lisensia, wenno (ti panagpilim) ti  aniaman a naudi a bersion.\n\nTi MediaWiki ket naiwarwaras iti namnama a makatulongto, ngem AWAN TI ANIA MAN A GARANTIA; nga awan pay ti naibagbaga a PANNAKAILAKO wenno KALAINGANNA ITI DAYTOY A PANGGEP. Kitaen ti GNU General Public License para kadagiti adu pay a salaysay.\n\nNaka-awatka koman ti [{{SERVER}}{{SCRIPTPATH}}/COPYING kopia iti GNU General Public License] a nairaman iti daytoy a programa; no saan, agsuratka idiay Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA wenno [//www.gnu.org/licenses/old-licenses/gpl-2.0.html basaem iti online].",
+       "version-license-info": "Ti MediaWiki ket nawaya a sopwer; mabalinmo nga iwaras ken/wenno baliwan babaen kadagiti termino ti GNU General Public License a naipablaak babaen ti Free Software Foundation; wenno bersion 2 iti Lisensia, wenno (ti panagpilim) ti  ania man a naudi a bersion.\n\nTi MediaWiki ket naiwarwaras iti namnama a makatulongto, ngem AWAN TI ANIA MAN A GARANTIA; nga awan pay ti naibagbaga a PANNAKAILAKO wenno KALAINGANNA ITI DAYTOY A PANGGEP. Kitaen ti GNU General Public License para kadagiti adu pay a salaysay.\n\nNaka-awatka koman ti [{{SERVER}}{{SCRIPTPATH}}/COPYING kopia iti GNU General Public License] a nairaman iti daytoy a programa; no saan, agsuratka idiay Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA wenno [//www.gnu.org/licenses/old-licenses/gpl-2.0.html basaem iti online].",
        "version-software": "Naisaad a sopwer",
        "version-software-product": "Produkto",
        "version-software-version": "Bersion",
        "fileduplicatesearch": "Agbiruk kadagiti duplikado a papeles",
        "fileduplicatesearch-summary": "Agbiruk kadagiti duplikado a papeles a naibatay kadagiti pateg ti hash.",
        "fileduplicatesearch-filename": "Nagan ti papeles:",
-       "fileduplicatesearch-submit": "Biruken",
+       "fileduplicatesearch-submit": "Agbiruk",
        "fileduplicatesearch-info": "$1 × $2 a piksel<br />Rukod ti papeles: $3<br />Kita ti MIME: $4",
        "fileduplicatesearch-result-1": "Awan ti kapadpadana a duplikado ti papeles ti \"$1\".",
        "fileduplicatesearch-result-n": "Ti papeles ti \"$1\" ket addaan {{PLURAL:$2|iti 1 nga agpadpada a duplikado|kadagiti $2 nga agpadpada a duplikado}}.",
        "tags-create-warnings-above": "Nakasarak {{PLURAL:$2|iti sumaganad a ballaag|kadagiti sumaganad a ballaag}} idi nagpadas a nagpartuat iti etiketa ti \"$1\":",
        "tags-create-warnings-below": "Kayatmo kadi ti agtuloy nga agpartuat iti etiketa?",
        "tags-delete-title": "Ikkaten ti etiketa",
-       "tags-delete-explanation-initial": "Ik-ikkatemon ti etiketa ti \"$1\" manipud ti database.",
+       "tags-delete-explanation-initial": "Ik-ikkatemon ti etiketa ti \"$1\" manipud iti database.",
        "tags-delete-explanation-in-use": "Daytoy ket maikkatto manipud {{PLURAL:$2|kadagiti $2 a rebision wenno naikabil iti listaan|kadagiti amin a $2 a rebision/wenno naikabil iti listaan}} iti agdama  a nakaipakatanna.",
        "tags-delete-explanation-warning": "Daytoy nga aksion ket <strong>saan a maipasubli</strong> ken <strong>saan a mabalin nga ibabawi</strong>, urayno babaen dagiti administradore ti database. Siguraduem a daytoy ti etiketa a kayatmo nga ikkaten.",
        "tags-delete-explanation-active": "<strong>Aktibo pay laeng ti etiketa ti \"$1\", ken agtuloy a maipakat iti masakbayan.</strong> Tapno mangpasardeng daytoy a mapasamak, mapan iti lugar wenno luglugar nga ayan a pakaipakatanto ti etiketa, ken ibaldado idiay.",
        "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-error1": "Biddut: Saan a malasin dagiti nagbanagan manipud ti API",
+       "feedback-error1": "Biddut: Saan a malasin dagiti nagbanagan manipud iti API",
        "feedback-error2": "Biddut: Napaay ti panagurnos",
-       "feedback-error3": "Biddut: Awan ti sungbat manipud ti API",
+       "feedback-error3": "Biddut: Awan ti sungbat manipud iti API",
        "feedback-error4": "Biddut:Saan a naipablak iti naited a titulo ti feedback",
        "feedback-message": "Mensahe:",
        "feedback-subject": "Suheto:",
        "restrictionsfield-badip": "Imbalido nga adres ti IP wenno sakup: $1",
        "restrictionsfield-label": "Dagiti mapalubosan a sakup ti IP:",
        "revid": "rebision $1",
-       "pageid": "ID ti panid $1"
+       "pageid": "ID ti panid $1",
+       "gotointerwiki": "Pumanpanaw iti {{SITENAME}}"
 }
index 7c5bc69..4f3d944 100644 (file)
        "yourdomainname": "Хьа нана-цIа:",
        "login": "Чувала/яла",
        "nav-login-createaccount": "Шоаш довзийтар / Дагара йоазув кхоллар",
-       "userlogin": "Шоаш довзийтар е дагара йоазув кхоллар",
-       "userloginnocreate": "Шоаш довзийта",
        "logout": "Аравала/яла",
        "userlogout": "Аравала/яла",
        "notloggedin": "Оаш шоаш довзийтадац системан",
        "userlogin-noaccount": "Доакъашхочун учета яздар дице хьа?",
        "userlogin-joinproject": "ДIахоттале {{SITENAME}}аца",
-       "nologin": "Дагара йоазув йице хьога? $1.",
-       "nologinlink": "Дагара йоазув хьакхолла",
        "createaccount": "Дагара йоазув хьакхолла",
-       "gotaccount": "Укхаза тхьовре дӀаяьзденна дий шо? $1.",
-       "gotaccountlink": "Чувала/яла",
-       "userlogin-resetlink": "Чувалара/ялара дараш дицданнадий шоана?",
        "userlogin-resetpassword-link": "ТIеракхосс хьа пароль?",
        "userlogin-helplink2": "Система чуваларах новкъостал",
        "userlogin-createanother": "Кхыдола дагара йоазув хьакхолла",
        "createacct-emailoptional": "Электронни почта адрес (ца яздича мегаш да)",
        "createacct-email-ph": "Iочуязде хьа электронни почта адрес",
        "createaccountmail": "Пайда эца ца ховш нийсденна къайладIоагIа, иштта хьадайта из белгалдаь электронни почта адреса тӀа.",
-       "createaccountreason": "Бахьан:",
        "createacct-reason": "Бахьан",
        "createacct-submit": "Хьакхолла учета яздар",
        "createacct-another-submit": "Дагара йоазув хьакхолла",
        "nextn-title": "{{PLURAL:$1|ТIадоагIа $1 яздар|ТIадоагIа $1 яздараш}}",
        "shown-title": "Гойта $1 {{PLURAL:$1|яздаьр|яздаьраш}} укх оáгIон тIа",
        "viewprevnext": "ДIахьажа ($1 {{int:pipe-separator}} $2) ($3)",
-       "searchmenu-exists": "'''Укх вики чу я иштта йола оагӀув «[[:$1]]»'''",
+       "searchmenu-exists": "<strong>Укх вики чу йолаш я оагӀув «[[:$1]]».</strong>",
        "searchmenu-new": "<strong>Хьакхолла оагIув «[[:$1]]» укх вики-проекте!</strong>\n{{PLURAL:$2|0=|Иштта хьажа Iайха лийха оагIонга.|Иштта хьажа хьай лахара хьахиннарашка.}}",
        "searchprofile-articles": "Кертера оагIонаш",
        "searchprofile-images": "Мультимедиа",
        "logentry-newusers-create": "{{GENDER:$2|Доакъашхочо хьакхеллад}} дагара йоазув $1",
        "logentry-upload-upload": "$1 {{GENDER:$2|чуяьккхай}} $3",
        "rightsnone": "(яц)",
-       "revdelete-summary": "хувцамий сурт оттадар",
        "searchsuggest-search": "Хьалаха {{grammar:prepositional|{{SITENAME}}}} чу",
        "expand_templates_preview": "Хьалххе бIаргтохар",
        "pagelang-name": "ОагIув",
index fcec7be..652f82e 100644 (file)
@@ -24,7 +24,8 @@
                        "Matma Rex",
                        "Xð",
                        "Sveinki",
-                       "Nemo bis"
+                       "Nemo bis",
+                       "Asmen"
                ]
        },
        "tog-underline": "Undirstrika tengla:",
        "externaldberror": "Uppfærsla mistókst. Annaðhvort varð villa í gagnasafninu eða að þér sé óheimilt að uppfæra aðra aðganga.",
        "login": "Innskrá",
        "nav-login-createaccount": "Innskrá / Búa til aðgang",
-       "userlogin": "Innskrá / Búa til aðgang",
-       "userloginnocreate": "Innskrá",
        "logout": "Útskráning",
        "userlogout": "Útskrá",
        "notloggedin": "Ekki innskráð(ur)",
        "userlogin-noaccount": "Áttu ekki aðgang?",
        "userlogin-joinproject": "Sameina {{SITENAME}}",
-       "nologin": "Ekki með aðgang? $1.",
-       "nologinlink": "Stofnaðu aðgang",
        "createaccount": "Nýskrá",
-       "gotaccount": "Nú þegar með notandanafn? '''$1'''.",
-       "gotaccountlink": "Skráðu þig inn",
-       "userlogin-resetlink": "Gleymdir þú notendaupplýsingunum þínum?",
        "userlogin-resetpassword-link": "Gleymdiru lykilorðinu þínu?",
        "userlogin-helplink2": "Hjálp við innskráningu",
        "userlogin-loggedin": "Þú ert búin(n) að skrá þig inn sem {{GENDER:$1|$1}}.\nNotaðu eyðablaðið fyrir neðan til að skrá þig inn sem annar notandi.",
        "createacct-another-email-ph": "Skrifaðu netfang",
        "createaccountmail": "Nota handahófsvalið bráðabirgðalykilorð og senda það á netfangið sem er tilgreint hér fyrir neðan",
        "createacct-realname": "Raunverulegt nafn (valfrjálst)",
-       "createaccountreason": "Ástæða:",
        "createacct-reason": "Ástæða",
        "createacct-reason-ph": "Afhverju ertu að búa til annan aðgang",
        "createacct-submit": "Búa til aðganginn",
        "undeleteviewlink": "skoða",
        "undeleteinvert": "Snúa vali við",
        "undeletecomment": "Ástæða:",
-       "undeletedrevisions": "$1 {{PLURAL:$1|breyting endurvakin|breytingar endurvaktar}}",
-       "undeletedrevisions-files": "$1 {{PLURAL:$1|breyting|breytingar}} og $2 {{PLURAL:$2|skrá|skrár}} endurvaktar",
-       "undeletedfiles": "$1 {{PLURAL:$1|skrá endurvakin|skrár endurvaktar}}",
        "cannotundelete": "Afturköllun eyðingar mistókst að hluta eða í heild: \n$1",
        "undeletedpage": "'''$1 var endurvakin'''\n\nSkoðaðu [[Special:Log/delete|eyðingaskrána]] til að skoða eyðingar og endurvakningar.",
        "undelete-header": "Sjá [[Special:Log/delete|eyðingarskrá]] fyrir síður sem nýlega hefur verið eytt.",
        "hebrew-calendar-m6": "Adar",
        "hebrew-calendar-m6a": "Adar I",
        "hebrew-calendar-m6b": "Adar II",
-       "hebrew-calendar-m7": "Nisan",
+       "hebrew-calendar-m7": "Nisane",
        "hebrew-calendar-m8": "Iyar",
        "hebrew-calendar-m9": "Sivan",
        "hebrew-calendar-m10": "Tamuz",
        "hebrew-calendar-m6-gen": "Adar",
        "hebrew-calendar-m6a-gen": "Adar I",
        "hebrew-calendar-m6b-gen": "Adar II",
-       "hebrew-calendar-m7-gen": "Nisan",
+       "hebrew-calendar-m7-gen": "Nisane",
        "hebrew-calendar-m8-gen": "Iyar",
        "hebrew-calendar-m9-gen": "Sivan",
        "hebrew-calendar-m10-gen": "Tamuz",
        "log-name-managetags": "Breytingaskrá yfir sýsl með merki",
        "logentry-managetags-create": "$1 {{GENDER:$2|bjó til}} merkið \"$4\"",
        "rightsnone": "(engum)",
-       "revdelete-summary": "breytingarágrip",
        "feedback-adding": "Bæti umsögn á síðuna...",
        "feedback-back": "Til baka",
        "feedback-bugcheck": "Frábært! Athugaðu hvort þessi villa hafi verið [$1 tilkynnt áður].",
index 6bac1e8..128586b 100644 (file)
                        "Tosky",
                        "Selven",
                        "Margherita.mignanelli",
-                       "Redredsonia"
+                       "Redredsonia",
+                       "Luigi.delia"
                ]
        },
        "tog-underline": "Sottolinea i collegamenti:",
        "post-expand-template-argument-warning": "'''Attenzione:''' questa pagina contiene uno o più argomenti di template troppo grandi per essere espansi. Tali argomenti verranno omessi.",
        "post-expand-template-argument-category": "Pagine contenenti template con parametri omessi",
        "parser-template-loop-warning": "Rilevato loop del template: [[$1]]",
+       "template-loop-category": "Pagine con template che richiamano sé stessi",
+       "template-loop-category-desc": "La pagina contiene un template che richiama sé stesso, cioè un template in cui è incluso lo stesso template.",
        "parser-template-recursion-depth-warning": "È stato raggiunto il limite di ricorsione nel template ($1)",
        "language-converter-depth-warning": "Limite di profondità del convertitore di lingua superato ($1)",
        "node-count-exceeded-category": "Pagine dove viene superato il numero di nodi",
        "page_first": "prima",
        "page_last": "ultima",
        "histlegend": "Confronto tra versioni: selezionare le caselle corrispondenti alle versioni desiderate e premere Invio o il pulsante in basso.\n\nLegenda: '''({{int:cur}})''' = differenze con la versione attuale, '''({{int:last}})''' = differenze con la versione precedente, '''{{int:minoreditletter}}''' = modifica minore",
-       "history-fieldset-title": "Naviga nella cronologia",
+       "history-fieldset-title": "Ricerca per versioni",
        "history-show-deleted": "Solo versioni cancellate",
        "histfirst": "prima",
        "histlast": "ultima",
        "saveusergroups": "Salva gruppi {{GENDER:$1|utente}}",
        "userrights-groupsmember": "Appartiene {{PLURAL:$1|al gruppo|ai gruppi}}:",
        "userrights-groupsmember-auto": "Membro implicito di:",
-       "userrights-groups-help": "È possibile modificare i gruppi cui è assegnato l'utente.\n* Una casella di spunta selezionata indica l'appartenenza dell'utente al gruppo\n* Una casella di spunta deselezionata indica la sua mancata appartenenza al gruppo.\n* Il simbolo * indica che non è possibile eliminare l'appartenenza al gruppo dopo averla aggiunta (o viceversa).\n* Il simbolo # indica che puoi solo mettere indietro la data di scadenza di questo gruppo; non è possibile portare avanti.",
+       "userrights-groups-help": "È possibile modificare i gruppi cui è assegnato l'utente.\n* Una casella di spunta selezionata indica l'appartenenza dell'utente al gruppo\n* Una casella di spunta deselezionata indica la sua mancata appartenenza al gruppo\n* Il simbolo * indica che non è possibile eliminare l'appartenenza al gruppo dopo averla aggiunta (o viceversa)\n* Il simbolo # indica che puoi solo mettere indietro la data di scadenza di appartenenza a questo gruppo; non è possibile portarla avanti",
        "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-expiry-existing": "Scadenza attuale: $2, $3",
        "userrights-expiry-othertime": "Altra durata:",
        "userrights-expiry-options": "1 giorno:1 day,1 settimana:1 week,1 mese:1 month,3 mesi:3 months,6 mesi:6 months,1 anno:1 year",
+       "userrights-invalid-expiry": "La scadenza per il gruppo \"$1\" non è valida",
+       "userrights-expiry-in-past": "La scadenza per il gruppo \"$1\" è già passata.",
+       "userrights-cannot-shorten-expiry": "Non puoi anticipare la scadenza dell'appartenenza al gruppo \"$1\". Soltanto gli utenti con il permesso di aggiungere e rimuovere questo gruppo possono anticiparne la scadenza.",
        "userrights-conflict": "Conflitto di modifica dei diritti utente! Controlla e conferma le tue modifiche.",
        "group": "Gruppo:",
        "group-user": "Utenti",
        "rcfilters-invalid-filter": "Filtro non valido",
        "rcfilters-empty-filter": "Nessun filtro attivo. Sono mostrati tutti i contributi.",
        "rcfilters-filterlist-title": "Filtri",
+       "rcfilters-filterlist-whatsthis": "Cos'è questo?",
        "rcfilters-highlightmenu-title": "Seleziona un colore",
        "rcfilters-highlightmenu-help": "Seleziona un colore per evidenziare questa proprietà",
        "rcfilters-filterlist-noresults": "Nessun filtro trovato",
+       "rcfilters-noresults-conflict": "Nessun risultato trovato, perché i criteri di ricerca sono in conflitto",
        "rcfilters-filtergroup-registration": "Registrazione utente",
        "rcfilters-filter-registered-label": "Registrato",
        "rcfilters-filtergroup-authorship": "Modifica paternità",
        "undeleteviewlink": "visualizza",
        "undeleteinvert": "Inverti selezione",
        "undeletecomment": "Motivo:",
-       "undeletedrevisions": "{{PLURAL:$1|Una versione recuperata|$1 versioni recuperate}}",
-       "undeletedrevisions-files": "{{PLURAL:$1|Una versione|$1 versioni}} e $2 file recuperati",
-       "undeletedfiles": "{{PLURAL:$1|Un file recuperato|$1 file recuperati}}",
        "cannotundelete": "Alcuni o tutti i ripristini non riusciti:\n$1",
        "undeletedpage": "'''La pagina $1 è stata recuperata'''\n\nConsulta il [[Special:Log/delete|registro delle cancellazioni]] per vedere le cancellazioni e i recuperi più recenti.",
        "undelete-header": "Consulta il [[Special:Log/delete|registro delle cancellazioni]] per vedere le cancellazioni più recenti.",
        "newimages-summary": "Questa pagina speciale mostra i file caricati più di recente.",
        "newimages-legend": "Filtra",
        "newimages-label": "Nome file (o una parte di esso):",
+       "newimages-user": "Indirizzo IP o nome utente",
        "newimages-showbots": "Mostra caricamenti di bot",
        "newimages-hidepatrolled": "Nascondi caricamenti verificati",
        "noimages": "Non c'è nulla da vedere.",
        "htmlform-user-not-exists": "<strong>$1</strong> non esiste.",
        "htmlform-user-not-valid": "<strong>$1</strong> non è un nome utente valido.",
        "logentry-delete-delete": "$1 {{GENDER:$2|ha cancellato}} la pagina $3",
-       "logentry-delete-restore": "$1 {{GENDER:$2|ha ripristinato}} la pagina \"$3\"",
+       "logentry-delete-restore": "$1 {{GENDER:$2|ha ripristinato}} la pagina $3 ($4)",
+       "logentry-delete-restore-nocount": "$1 {{GENDER:$2|ha ripristinato}} la pagina $3",
+       "restore-count-revisions": "{{PLURAL:$1|1 versione|$1 versioni}}",
+       "restore-count-files": "{{PLURAL:$1|1 file|$1 file}}",
        "logentry-delete-event": "$1 {{GENDER:$2|ha modificato}} la visibilità di {{PLURAL:$5|un'azione del registro|$5 azioni del registro}} di \"$3\": $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|ha modificato}} la visibilità per {{PLURAL:$5|una versione|$5 versioni}} della pagina $3: $4",
        "logentry-delete-event-legacy": "$1 {{GENDER:$2|ha modificato}} la visibilità di alcune azioni del registro di $3",
        "logentry-tag-update-revision": "$1 {{GENDER:$2|ha aggiornato}} le etichette della versione $4 della pagina $3 ({{PLURAL:$7|aggiunta|aggiunte}} $6; {{PLURAL:$9|rimossa|rimosse}} $8)",
        "logentry-tag-update-logentry": "$1 {{GENDER:$2|ha aggiornato}} le etichette della voce di registro $5 di pagina $3 ({{PLURAL:$7|aggiunta|aggiunte}} $6; {{PLURAL:$9|rimossa|rimosse}} $8)",
        "rightsnone": "(nessuno)",
+       "rightslogentry-temporary-group": "$1 (temporaneo, fino a $2)",
        "feedback-adding": "Inserimento del feedback nella pagina...",
        "feedback-back": "Indietro",
        "feedback-bugcheck": "Ottimo! Verifica che non sia già fra i [$1 bug conosciuti].",
        "restrictionsfield-label": "Intervalli IP consentiti:",
        "restrictionsfield-help": "Un indirizzo IP o intervallo CIDR per linea. Per consentire tutto, utilizza:<pre>0.0.0.0/0\n::/0</pre>",
        "revid": "versione $1",
-       "pageid": "ID della pagina $1"
+       "pageid": "ID della pagina $1",
+       "rawhtml-notallowed": "I tag &lt;html&gt; non possono essere utilizzati al di fuori delle normali pagine.",
+       "gotointerwiki-invalid": "Il titolo specificato non è valido."
 }
index 2c4c3ba..1e8ee00 100644 (file)
@@ -79,7 +79,8 @@
                        "Suchichi02",
                        "にょきにょき",
                        "おはぐろ蜻蛉",
-                       "Aefgh39622"
+                       "Aefgh39622",
+                       "Ayame"
                ]
        },
        "tog-underline": "リンクの下線:",
        "tog-watchdeletion": "自分が削除したページやファイルをウォッチリストに追加",
        "tog-watchuploads": "自分が新しくアップロードしたファイルをウォッチリストに追加",
        "tog-watchrollback": "自分が巻き戻したページをウォッチリストに追加",
-       "tog-minordefault": "編集をすべて既定で細部の編集とする",
+       "tog-minordefault": "すべての編集を既定で細部の編集とする",
        "tog-previewontop": "プレビューを編集ボックスの前に配置",
        "tog-previewonfirst": "編集開始時にもプレビューを表示",
        "tog-enotifwatchlistpages": "ウォッチリストにあるページやファイルが更新されたら、メールを受け取る",
        "login": "ログイン",
        "login-security": "あなたが同一人であることを確認します",
        "nav-login-createaccount": "ログインまたはアカウント作成",
-       "userlogin": "ログインまたはアカウント作成",
-       "userloginnocreate": "ログイン",
        "logout": "ログアウト",
        "userlogout": "ログアウト",
        "notloggedin": "ログインしていません",
        "userlogin-noaccount": "登録がまだの場合",
        "userlogin-joinproject": "{{SITENAME}}のアカウントを作成",
-       "nologin": "登録がまだの場合、$1。",
-       "nologinlink": "アカウントを作成してください",
        "createaccount": "アカウント作成",
-       "gotaccount": "アカウントを既に持っている場合、$1。",
-       "gotaccountlink": "ログインしてください",
-       "userlogin-resetlink": "ログイン情報をお忘れですか?",
        "userlogin-resetpassword-link": "パスワードをお忘れですか?",
        "userlogin-helplink2": "ログインについてのヘルプ",
        "userlogin-loggedin": "{{GENDER:$1|$1}} として既にログインしています。\n別の利用者としてログインするには下のフォームを使用してください。",
        "createacct-another-email-ph": "メールアドレスを入力",
        "createaccountmail": "無作為な仮パスワードを生成し、指定のメールアドレスに送信",
        "createacct-realname": "本名 (省略可能)",
-       "createaccountreason": "理由:",
        "createacct-reason": "理由",
        "createacct-reason-ph": "アカウントを作成する理由",
        "createacct-reason-help": "アカウント作成記録に表示されるメッセージ",
        "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": "<code>&lt;b/></code> や <code>&lt;span/></code> 等の無効な自己終了HTMLタグを含むページ。これらのタグはまもなく HTML5 の仕様に準拠する動作へと変更されるため、ウィキテキスト内での使用は非推奨となりました。",
        "duplicate-args-warning": "<strong>警告:</strong> [[:$1]]は複数の「$3」パラメータを伴って[[:$2]]を呼び出しています。提供されている最後の値のみが使用されます。",
        "duplicate-args-category": "テンプレート呼び出しで引数が重複しているページ",
        "duplicate-args-category-desc": "引数が重複したテンプレート呼び出しを含むページ。例: <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code>、<code><nowiki>{{foo|bar|1=baz}}</nowiki></code>",
        "post-expand-template-argument-warning": "<strong>警告:</strong> このページは、展開後のサイズが大きすぎるテンプレート引数を少なくとも 1 つ含んでいます。\nこれらの引数を省略しました。",
        "post-expand-template-argument-category": "省略されたテンプレート引数を含むページ",
        "parser-template-loop-warning": "テンプレートのループを検出しました: [[$1]]",
+       "template-loop-category": "テンプレートがループしているページ",
+       "template-loop-category-desc": "テンプレート自身が再帰的自己参照を行うなど、ループするテンプレートが含まれているページ。",
        "parser-template-recursion-depth-warning": "テンプレートの再帰の深さ ($1) が上限を超えました",
        "language-converter-depth-warning": "言語変換機能の深さ ($1) が制限を超えました",
        "node-count-exceeded-category": "ノード数が制限を超えたページ",
        "page_first": "先頭",
        "page_last": "末尾",
        "histlegend": "差分の選択: 比較したい版のラジオボタンを選択し、Enterキーを押すか、下部のボタンを押します。<br />\n凡例: <strong>({{int:cur}})</strong>=最新版との比較、<strong>({{int:last}})</strong>=直前の版との比較、<strong>{{int:minoreditletter}}</strong>=細部の編集",
-       "history-fieldset-title": "履歴の閲覧",
-       "history-show-deleted": "削除済みのみ",
+       "history-fieldset-title": "版の検索",
+       "history-show-deleted": "削除のみ",
        "histfirst": "最古",
        "histlast": "最新",
        "historysize": "({{PLURAL:$1|$1バイト}})",
        "search-interwiki-caption": "姉妹プロジェクト",
        "search-interwiki-default": "$1からの結果:",
        "search-interwiki-more": "(続き)",
+       "search-interwiki-more-results": "結果をさらに取得",
        "search-relatedarticle": "関連",
        "searchrelated": "関連",
        "searchall": "すべて",
        "username": "{{GENDER:$1|利用者名}}:",
        "prefs-memberingroups": "{{GENDER:$2|所属}}{{PLURAL:$1|グループ}}:",
        "prefs-memberingroups-type": "$1",
+       "group-membership-link-with-expiry": "$1 ($2 まで)",
        "prefs-registration": "登録日時:",
        "prefs-registration-date-time": "$1",
        "yourrealname": "本名:",
        "prefs-help-prefershttps": "この設定は、次回ログインの際に反映されます。",
        "prefswarning-warning": "個人設定にまだ保存されていない変更があります。\n「$1」をクリックせずに離れた場合、個人設定は更新されません。",
        "prefs-tabs-navigation-hint": "ヒント: ← キーと → キーで、タブ一覧内のタブ間を移動できます。",
-       "userrights": "利用者権限を管理",
+       "userrights": "利用者権限",
        "userrights-lookup-user": "利用者を選択",
        "userrights-user-editname": "利用者名を入力:",
        "editusergroup": "利用者グループの表示",
        "editinguser": "利用者<strong> [[User:$1|$1]]</strong> $2 の権限を変更",
        "viewinguserrights": "{{GENDER:$1|利用者}} <strong>[[User:$1|$1]]</strong> $2 の利用者権限",
        "userrights-editusergroup": "利用者グループを編集",
-       "userrights-viewusergroup": "利用者グループ",
+       "userrights-viewusergroup": "{{GENDER:$1|利用者}}グループ",
        "saveusergroups": "{{GENDER:$1|利用者}}グループを保存",
        "userrights-groupsmember": "所属グループ:",
        "userrights-groupsmember-auto": "自動的に付与される権限:",
        "userrights-groupsmember-type": "$1",
-       "userrights-groups-help": "この利用者が属するグループを変更できます。\n* チェックが入っているボックスは、この利用者がそのグループに属していることを意味します。\n* チェックが入っていないボックスは、この利用者がそのグループに属していないことを意味します。\n* 「*」はグループに一旦追加した場合に除去 (あるいはその逆) ができないことを示しています。",
+       "userrights-groups-help": "この利用者が属するグループを変更できます。\n* チェックが入っているボックスは、この利用者がそのグループに属していることを意味します。\n* チェックが入っていないボックスは、この利用者がそのグループに属していないことを意味します。\n*「*」はグループに一旦追加した場合に除去 (あるいはその逆) ができないことを示しています。\n*「#」は有効期限の延長のみを行うことができますが、現在の期限よりも短縮することはできません。",
        "userrights-reason": "理由:",
        "userrights-no-interwiki": "他ウィキ上における利用者権限の編集権限は、ありません。",
        "userrights-nodatabase": "データベース$1は存在しないか、ローカル上にありません。",
        "userrights-unchangeable-col": "変更できないグループ",
        "userrights-irreversible-marker": "$1*",
        "userrights-expiry-current": "期限 $1",
-       "userrights-expiry-none": "有効期限切れではありません",
+       "userrights-expiry-none": "無期限",
        "userrights-expiry": "有効期限:",
+       "userrights-expiry-existing": "現在の有効期限: $2 $3",
        "userrights-expiry-othertime": "その他の期間:",
+       "userrights-expiry-options": "1日:1 day,1週間:1 week,1か月:1 month,3か月:3 months,6か月:6 months,1 年:1 year",
+       "userrights-invalid-expiry": "「$1」グループに指定された有効期限は無効です。",
+       "userrights-expiry-in-past": "「$1」グループに指定された有効期限は過去の時刻です。",
+       "userrights-cannot-shorten-expiry": "「$1」グループの有効期限を短縮できません。このグループを与奪できる権限を持つ利用者だけが有効期限を短縮できます。",
        "userrights-conflict": "利用者権限の変更が競合しています! 変更内容を確認してください。",
        "group": "グループ:",
        "group-user": "登録利用者",
        "rcfilters-clear-all-filters": "すべてのフィルターをクリア",
        "rcfilters-invalid-filter": "無効なフィルター",
        "rcfilters-filterlist-title": "フィルター",
+       "rcfilters-highlightmenu-title": "色を選ぶ",
        "rcfilters-filterlist-noresults": "フィルターが見つかりませんでした",
        "rcfilters-filtergroup-registration": "利用者登録",
        "rcfilters-filter-registered-label": "登録済み",
        "rcfilters-filter-unregistered-label": "未登録",
        "rcfilters-filter-bots-label": "ボット",
        "rcfilters-filter-humans-label": "人間(ボットではない)",
+       "rcfilters-filter-patrolled-label": "巡回済み",
+       "rcfilters-filter-patrolled-description": "巡回済みとマークされた編集。",
+       "rcfilters-filter-unpatrolled-label": "未巡回",
+       "rcfilters-filter-unpatrolled-description": "まだ巡回済みとマークされていない編集。",
+       "rcfilters-filtergroup-significance": "重要度",
+       "rcfilters-filter-minor-label": "細部の編集",
+       "rcfilters-filter-minor-description": "編集者が細部の編集とマークしたもの。",
+       "rcfilters-filter-major-label": "細部でない編集",
+       "rcfilters-filter-major-description": "細部とマークされていない編集。",
+       "rcfilters-filtergroup-changetype": "変更の種類",
+       "rcfilters-filter-pageedits-label": "ページの編集",
+       "rcfilters-filter-newpages-label": "ページの作成",
+       "rcfilters-filter-newpages-description": "ページを新規作成する編集。",
+       "rcfilters-filter-categorization-label": "カテゴリ変更",
        "rcnotefrom": "以下は<strong>$3 $4</strong>以降の{{PLURAL:$5|更新です}} (最大 <strong>$1</strong> 件)。",
        "rclistfrom": "$3の$2以降の更新を表示する",
        "rcshowhideminor": "細部の編集を$1",
-       "rcshowhideminor-show": "表示",
-       "rcshowhideminor-hide": "非表示",
+       "rcshowhideminor-show": "表示する",
+       "rcshowhideminor-hide": "非表示にする",
        "rcshowhidebots": "ボットを$1",
-       "rcshowhidebots-show": "表示",
-       "rcshowhidebots-hide": "非表示",
+       "rcshowhidebots-show": "表示する",
+       "rcshowhidebots-hide": "非表示にする",
        "rcshowhideliu": "登録利用者を$1",
-       "rcshowhideliu-show": "表示",
-       "rcshowhideliu-hide": "非表示",
+       "rcshowhideliu-show": "表示する",
+       "rcshowhideliu-hide": "非表示にする",
        "rcshowhideanons": "匿名利用者を$1",
-       "rcshowhideanons-show": "表示",
-       "rcshowhideanons-hide": "非表示",
+       "rcshowhideanons-show": "表示する",
+       "rcshowhideanons-hide": "非表示にする",
        "rcshowhidepatr": "巡回された編集を$1",
-       "rcshowhidepatr-show": "表示",
-       "rcshowhidepatr-hide": "非表示",
+       "rcshowhidepatr-show": "表示する",
+       "rcshowhidepatr-hide": "非表示にする",
        "rcshowhidemine": "自分の編集を$1",
-       "rcshowhidemine-show": "表示",
-       "rcshowhidemine-hide": "非表示",
+       "rcshowhidemine-show": "表示する",
+       "rcshowhidemine-hide": "非表示にする",
        "rcshowhidecategorization": "ページのカテゴリー追加・除去を$1",
-       "rcshowhidecategorization-show": "表示",
-       "rcshowhidecategorization-hide": "非表示",
+       "rcshowhidecategorization-show": "表示する",
+       "rcshowhidecategorization-hide": "非表示にする",
        "rclinks": "最近 $2 日間の更新を最大 $1 件表示<br />$3",
        "diff": "差分",
        "hist": "履歴",
        "activeusers-intro": "これは過去 $1 {{PLURAL:$1|日|日間}}に何らかの活動をした利用者の一覧です。",
        "activeusers-count": "過去 {{PLURAL:$3|1 日|$3 日間}}に $1 {{PLURAL:$1|回の操作}}",
        "activeusers-from": "最初に表示する利用者:",
+       "activeusers-groups": "選択した利用者グループに属する利用者を表示:",
+       "activeusers-excludegroups": "選択した利用者グループに属する利用者を非表示:",
        "activeusers-noresult": "利用者が見つかりませんでした。",
        "activeusers-submit": "活動中の利用者を表示",
        "listgrouprights": "利用者グループの権限",
        "editcomment": "編集内容の要約: <em>$1</em>",
        "revertpage": "[[Special:Contributions/$2|$2]] ([[User talk:$2|トーク]]) による編集を [[User:$1|$1]] による直前の版へ差し戻しました",
        "revertpage-nouser": "非表示の利用者による編集を {{GENDER:$1|[[User:$1|$1]]}} による直前の版へ差し戻しました",
-       "rollback-success": "$1による編集を差し戻しました。\n$2による直前の版へ変更されました。",
+       "rollback-success": "{{GENDER:$3|$1}}による編集を差し戻しました。\n{{GENDER:$4|$2}}による直前の版へ変更されました。",
        "rollback-success-notify": "$1による編集を差し戻しました。\n$2による直前の版へ変更されました。[$3 変更を表示]",
        "sessionfailure-title": "セッションの失敗",
        "sessionfailure": "ログインのセッションに問題が発生しました。\nセッション乗っ取りを防ぐため、操作を取り消しました。\n前のページへ戻って再度読み込んだ後に、もう一度試してください。",
        "changecontentmodel-success-text": "[[:$1]]のコンテンツ・タイプは変更されました。",
        "changecontentmodel-cannot-convert": "[[:$1]]のコンテンツは$2の型には変換できません。",
        "changecontentmodel-nodirectediting": "$1 コンテンツ・モデルは、ダイレクト編集をサポートしていません。",
+       "changecontentmodel-emptymodels-title": "利用可能なコンテンツ・モデルがありません",
        "changecontentmodel-emptymodels-text": "[[:$1]]のコンテンツはどの型にも変換できません。",
        "log-name-contentmodel": "コンテンツ・モデル変更記録",
        "log-description-contentmodel": "ページのコンテンツ・モデルに関連する出来事",
        "protect-cantedit": "このページの編集権限がないため、保護レベルを変更できません。",
        "protect-othertime": "その他の期間:",
        "protect-othertime-op": "その他の期間",
-       "protect-existing-expiry": "現在の保護期限: $2 $3",
-       "protect-existing-expiry-infinity": "既存の有効期限: 無期限",
+       "protect-existing-expiry": "現在の有効期限: $2 $3",
+       "protect-existing-expiry-infinity": "現在の有効期限: 無期限",
        "protect-otherreason": "他の、または追加の理由:",
        "protect-otherreason-op": "その他の理由",
        "protect-dropdown": "*よくある保護理由\n** 度重なる荒らし\n** 度重なるスパム投稿\n** 非生産的な編集合戦\n** 高負荷ページ",
        "undeleteviewlink": "閲覧",
        "undeleteinvert": "選択を反転",
        "undeletecomment": "理由:",
-       "undeletedrevisions": "{{PLURAL:$1|$1版}}を復元しました",
-       "undeletedrevisions-files": "{{PLURAL:$1|$1版}}と{{PLURAL:$2|$2ファイル}}を復元しました",
-       "undeletedfiles": "{{PLURAL:$1|$1ファイル}}を復元しました",
        "cannotundelete": "復元に一部またはすべて失敗しました:\n$1",
        "undeletedpage": "<strong>$1 を復元しました。</strong>\n\n最近の削除と復元は[[Special:Log/delete|削除記録]]で参照できます。",
        "undelete-header": "最近削除されたページは[[Special:Log/delete|削除記録]]で確認できます。",
        "sorbs": "DNSBL",
        "sorbsreason": "ご使用中のIPアドレスが、{{SITENAME}}の使用しているDNSBLに公開プロキシとして記載されています。",
        "sorbs_create_account_reason": "ご使用中のIPアドレスが、{{SITENAME}}の使用しているDNSBLに公開プロキシとして記載されています。\nアカウント作成はできません",
+       "softblockrangesreason": "現在の IP アドレス ($1) からの匿名投稿は許可されていません。ログインしてください。",
        "xffblockreason": "X-Forwarded-For ヘッダーに含まれている IP アドレスがブロックされています。これはあなたのものか、あなたが利用しているプロキシサーバーのものです。元のブロックの理由は: $1",
        "cant-see-hidden-user": "ブロックしようとしている利用者は、既にブロックされ隠されています。\nあなたには hideuser 権限がないため、この利用者のブロックの閲覧/編集はできません。",
        "ipbblocked": "あなた自身がブロックされているため、他の利用者のブロックやブロック解除はできません。",
        "cant-move-to-user-page": "利用者下位ページ以外の利用者ページに、ページを移動させる権限がありません。",
        "cant-move-category-page": "カテゴリのページを移動させる権限がありません。",
        "cant-move-to-category-page": "ページをカテゴリのページに移動させる権限がありません。",
+       "cant-move-subpages": "下位のページを移動する権限がありません。",
+       "namespace-nosubpages": "名前空間「$1」はサブページが許可されていません。",
        "newtitle": "新しいページ名:",
        "move-watch": "移動元と移動先ページをウォッチ",
        "movepagebtn": "ページを移動",
        "newimages-summary": "この特別ページでは、最近アップロードされたファイルを表示します。",
        "newimages-legend": "絞り込み",
        "newimages-label": "ファイル名 (またはその一部):",
+       "newimages-user": "IPアドレスまたは利用者名:",
        "newimages-showbots": "ボットによるアップロードを表示",
        "newimages-hidepatrolled": "巡回済みのアップロードを隠す",
        "noimages": "表示できるものがありません。",
+       "gallery-slideshow-toggle": "トグルサムネイル",
        "ilsubmit": "検索",
        "bydate": "日付順",
        "sp-newimages-showfrom": "$1の$2以降の新しいファイルを表示",
        "tag-filter": "[[Special:Tags|タグ]]絞り込み:",
        "tag-filter-submit": "絞り込み",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|タグ}}]]: $2)",
+       "tag-mw-contentmodelchange": "コンテンツ・モデルの変更",
        "tags-title": "タグ",
        "tags-intro": "このページは、ソフトウェアが編集に対して付けるタグとその意味の一覧です。",
        "tags-tag": "タグ名",
        "logentry-tag-update-revision": "$1 がページ「$3」の版 $4 のタグを{{GENDER:$2|更新しました}} ($6 を{{PLURAL:$7|追加}}、$8 を{{PLURAL:$9|削除}})",
        "logentry-tag-update-logentry": "$1 がページ「$3」の記録項目 $5 のタグを{{GENDER:$2|更新しました}} ($6 を{{PLURAL:$7|追加}}、$8 を{{PLURAL:$9|削除}})",
        "rightsnone": "(なし)",
-       "revdelete-summary": "編集内容の要約",
+       "rightslogentry-temporary-group": "$1 ($2までの臨時)",
        "feedback-adding": "ページへのフィードバックの追加...",
        "feedback-back": "戻る",
        "feedback-bugcheck": "Great! [$1 既出のバグ]に既に含まれていないかご確認ください。",
        "pagelang-language": "言語",
        "pagelang-use-default": "既定の言語を使用",
        "pagelang-select-lang": "言語を選択",
+       "pagelang-reason": "理由",
        "pagelang-submit": "変更",
+       "pagelang-nonexistent-page": "ページ $1 は存在しません。",
        "right-pagelang": "ページの言語を変更",
        "action-pagelang": "ページの言語の変更",
        "log-name-pagelang": "言語変更の記録",
        "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>"
+       "restrictionsfield-help": "一行につき、単一の IP アドレス、もしくは CIDR による範囲。全帯域からの接続を許可する場合: <pre>0.0.0.0/0\n::/0</pre>"
 }
index 89c777e..be38848 100644 (file)
        "login": "Mlebu",
        "login-security": "Vèrifikasi idhèntitas panjenengan",
        "nav-login-createaccount": "Log mlebu / nggawé rékening (akun)",
-       "userlogin": "Mlebu log / gawé rékening (akun)",
-       "userloginnocreate": "Mlebu",
        "logout": "Metu",
        "userlogout": "Metu",
        "notloggedin": "Durung kalebu",
        "userlogin-noaccount": "Durung duwé akun?",
        "userlogin-joinproject": "Mèlua {{SITENAME}}",
-       "nologin": "Durung kagungan asma panganggo? '''$1'''.",
-       "nologinlink": "Gawé akun",
        "createaccount": "Gawé akun",
-       "gotaccount": "Wis duwé akun? $1.",
-       "gotaccountlink": "Mlebu",
-       "userlogin-resetlink": "Lali rincian mlebu log Sampéyan?",
        "userlogin-resetpassword-link": "Lali tembung wadining sampéyan?",
        "userlogin-helplink2": "Tulungi mlebu",
-       "userlogin-loggedin": "Sampeyan sampun mlebet log dadi {{GENDER:$1|$1}}.\nGunakna formulir ing ngisor iki kanggo mlebet log dadi panganggo liyane.",
+       "userlogin-loggedin": "Panjenengan wis mlebu log minangka {{GENDER:$1|$1}}.\nAnggonen formulir ngisor iki saperlu mlebu log minangka panganggo liya.",
        "userlogin-createanother": "Gawé akun liya",
        "createacct-emailrequired": "Alamat layang èlèktronik",
        "createacct-emailoptional": "Alamat layang èlèktronik (manasuka)",
        "createacct-another-email-ph": "Isi alamat layang èlèktronik",
        "createaccountmail": "Nganggoa sandi sauntara sembarang lan kirimna liwat layang e-mail ing ngisor iki",
        "createacct-realname": "Jeneng asli (manasuka)",
-       "createaccountreason": "Alesan:",
        "createacct-reason": "Alesan",
-       "createacct-reason-ph": "Kenapa sampeyan nggawe akun liyane",
+       "createacct-reason-ph": "Alesané panjenengan nggawé akun liya",
        "createacct-submit": "Gawé akun sampéyan",
        "createacct-another-submit": "Gawé akun",
        "createacct-continue-submit": "Banjuraké gawé akun",
        "noemailcreate": "Panjenengan kudu maringi alamat e-mail sing absah",
        "passwordsent": "Tembung sandi anyar wis dikirim menyang alamat layang èlèktronik tumrap \"$1\". \nMangga mlebu log manèh sawisé panjenengan nampa iku.",
        "blocked-mailpassword": "Alamat IP panjenengan diblokir saka panyuntingan, mulané panjenengan ora olèh nganggo fungsi pèngetan tembung sandhi kanggo ''mencegah penyalahgunaan''.",
-       "eauthentsent": "Sawijining layang élèktronik (e-mail) kanggo ndhedhes (konfirmasi) wis dikirim menyang alamat layang élèktronik sampeyan. \n\nSadhurunge layang élèktronik liyane dikirim menyang akun kuwi, sampeyan kudu melu parentah ing layang kuwi, kanggo mastikne yen alamat layang kuwi bener-bener dhuweke sampeyan.",
+       "eauthentsent": "Layang-èl konfirmasi wis dikirim nyang alamat layang-èl sing diisèkaké. Sadurungé ana layang-èl liyané sing dikirim nyang akun iku, panjenengan kudu nuruti arahan ana ing layang-èl iku saperlu ngonfirmasi yèn akun iku pancèn duwèké panjenengan.",
        "throttled-mailpassword": "Layang kanggo mbalèkaké tembung sandhi wis dikirim sasuwené ing {{PLURAL:$1|jam|$1 jam}}.\nKanggo nyegah ananing tumindhak culika, namung sak layang kanggo mbalèkaké tembung sandhi sing bakal dikirim sasuwéné ing {{PLURAL:$1|jam|$1 jam}}.",
        "mailerror": "Cacad nalika ngirim layang: $1",
        "acct_creation_throttle_hit": "Tamu ing wiki iki kanthi alamat IP sing padha karo panjenengan wis gawé {{PLURAL:$1|1 akun|$1 akun}} ing sadina pungkasan, nganti cacah maksimum sing diidinaké.\nAmarga saka kuwi., tamu kanthi alamat IP iki ora bisa gawé akun manèh kanggo sauntara iki.",
        "login-abort-generic": "Sampéyan ora bisa mlebu - Kawurungan",
        "loginlanguagelabel": "Basa: $1",
        "suspicious-userlogout": "Panjaluk panjenengan supaya metu ditolak amarga katoné panjlajah internt utawa proksi panyinggah.",
-       "createacct-another-realname-tip": "Jeneng asli ora kudu dilebokake.\n\nYen sampeyan milih nglebokake jeneng asli, jeneng kuwi bakal dinggo ngwenehi atribusi kanggo karya-karyane.",
+       "createacct-another-realname-tip": "Jeneng asli ora kudu diisi.\nYèn diisi, jeneng asliné panjenengan bakal kanggo atribusi awit karyané panjenengan.",
        "pt-login": "Mlebu log",
        "pt-login-button": "Mlebu",
        "pt-login-continue-button": "Banjuraké mlebu",
        "accmailtitle": "Tembung sandi wis kinirim",
        "accmailtext": "Tembung sandi sembarang kanggo [[User talk:$1|$1]] wis dikirim menyang $2.\n\nTembung sandi iki bisa diganti ing kaca <em>[[Special:ChangePassword|salin tembung sandi]]</em> sawisé mlebu log.",
        "newarticle": "(Anyar)",
-       "newarticletext": "Katonané panjenengan ngetutaké pranala artikel sing durung ana.\nManawa kersa manulis artikel iki, manggaa. (Mangga mirsani [$1 Pitulung] kanggo informasi sabanjuré).\nYèn ora sengaja tekan kéné, bisa ngeklik pencètan '''back''' waé ing panjlajah wèb panjenengan.",
+       "newarticletext": "Panjenengan ngetuti pranala sing durung ana.\nKanggo nggawé kaca, gagéa ngetik ing kothak ngisor iki (deleng [$1 kaca pitulung] ngenani katerangané).\nManawa panjenengan tekan kéné awit ora sengaja, kliken tumbul <strong>balik</strong> ana ing pangluruné panjenengan.",
        "anontalkpagetext": "---- ''Iki yaiku kaca dhiskusi sawijining panganggo anonim sing durung kagungan akun utawa ora nganggo akuné, dadi kita keeksa kudu nganggo alamat IP-né kanggo nepangi. Alamat IP kaya mengkéné iki bisa dienggo déning panganggo sing séjé-séjé. Yèn panjenengan pancèn panganggo anonim lan olèh komentar-komentar miring, mangga [[Special:CreateAccount|nggawé akun]] utawa [[Special:UserLogin|log mlebu]] supaya ora rancu karo panganggo anonim liyané ing mangsa ngarep.''",
        "noarticletext": "Kala saiki kaca iki durung ana tulisané.\nSampéyan bisa [[Special:Search/{{PAGENAME}}|nggolèki sesirahing kaca iki]] sajeroning kaca liya,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} nggolèki log sing magepokan],\nutawa [{{fullurl:{{FULLPAGENAME}}|action=edit}} nggawé kaca iki]</span>.",
        "noarticletext-nopermission": "Saiki ora ana tèks ing kaca iki. \nSampéyan bisa [[Special:Search/{{PAGENAME}}|nggolèki judhul kaca iki]] nèng kaca liya, \nutawa <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|kaca={{urlencode:{{FULLPAGENAME}}}}}} nggolèki log sing kaitan]</span>, nanging Sampéyan ora nduwèni idin nggawé kaca iki.",
        "edit-conflict": "Cengkah besutan",
        "edit-no-change": "Suntingan panjenengan dilirwakaké amerga panjenengan ora nglakoni pangowahan apa-apa ing tèks.",
        "postedit-confirmation-created": "Kaca wis kagawé.",
-       "postedit-confirmation-saved": "Besutan sampeyan wis kasimpen.",
+       "postedit-confirmation-saved": "Besutané panjenengan wis kasimpen.",
        "edit-already-exists": "Ora bisa nggawé kaca anyar.\nAmerga wis ana.",
        "defaultmessagetext": "Tèks layang gawan",
        "content-failed-to-parse": "Gagal menjabarkan konten $2 untuk model $1: $3",
        "last": "sadurung",
        "page_first": "kapisan",
        "page_last": "pungkasan",
-       "histlegend": "Kanggo mbandhingaké: tandhani kothak radhio révisi-révisi sing arep dibandhingaké lan pencèt ''Enter'' utawa tombol sing ana ing ngisor.<br />\nLegéndha: <strong>({{int:cur}})</strong> = béda karo révisi pungkasan, <strong>({{int:last}})</strong> = béda karo révisi sadurungé, <strong>{{int:minoreditletter}}</strong> = besutan cilik.",
+       "histlegend": "Kanggo nandhingaké: tandhani kothak radhio révisi-révisi sing arep dibandhingaké lan pencèt ''Enter'' utawa tombol sing ana ing ngisor.<br />\nLegéndha: <strong>({{int:cur}})</strong> = béda karo révisi pungkasan, <strong>({{int:last}})</strong> = béda karo révisi sadurungé, <strong>{{int:minoreditletter}}</strong> = besutan cilik.",
        "history-fieldset-title": "Luru sujarah",
        "history-show-deleted": "Mligi sing dibusak",
        "histfirst": "lawas dhéwé",
        "gender-female": "Dhèwèké mbesut kaca wiki",
        "prefs-help-gender": "Opsional: Dipigunakaké kanggo panyebutan jinis kelamin sing bener déning piranti alus.\nInformasi iki bakal kabuka kanggo publik.",
        "email": "Layangtronik",
-       "prefs-help-realname": "Jeneng asli manasuka.\nMenawa diisi, iku bakal kanggo ngatribusi sampéyan awit karyaning sampéyan.",
+       "prefs-help-realname": "Jeneng asli ora kudu diisi.\nYèn diisi, jeneng asliné panjenengan bakal kanggo atribusi awit karyané panjenengan.",
        "prefs-help-email": "Alamat layang èlèktronik sipaté mung pilihan, nanging dibutuhaké kanggo nyetèl ulang tembung sandhi yèn Sampéyan lali.",
        "prefs-help-email-others": "Sampéyan uga bisa milih kanggo ngidinaké wong liya ngubungi Sampéyan liwat layang èlèktronik sing ana ing kaca panganggo utawa kaca guneman.\nAlamat layang èlèktronik Sampéyan ora dituduhaké nalika wong liya ngubungi Sampéyan.",
        "prefs-help-email-required": "Alamat layang-e dibutuhaké.",
        "right-createpage": "Gawé kaca (sing dudu kaca parembugan)",
        "right-createtalk": "Gawé kaca parembugan",
        "right-createaccount": "Nggawé rékening (akun) panganggo anyar",
-       "right-minoredit": "Tandhani minangka besutan cilik",
+       "right-minoredit": "Tandhani yèn besutan cilik",
        "right-move": "Ngalih kaca",
        "right-move-subpages": "Pindhahaké kaca lan kabèh anak-kacané",
        "right-move-rootuserpages": "Ngalih kaca panganggo oyod",
        "right-editmyprivateinfo": "Owahi data pribadi sampeyan (kayata alamat layang elektronik, jeneng asli)",
        "right-editmyoptions": "Owahi preferensi sampeyan",
        "right-rollback": "Balèkaké kanthi gelis besutaning panganggo pungkasan sing mbesut kaca tinamtu",
-       "right-markbotedits": "Tandhani besutan kawurungan minangka besutan bot",
+       "right-markbotedits": "Tandhani besutan sing kawurungan yèn besutan bot",
        "right-noratelimit": "Ora dipengaruhi déning wates cacahing suntingan.",
        "right-import": "Impor kaca-kaca saka wiki liya",
        "right-importupload": "Impor kaca saka unggahan barkas",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (uga deleng [[Special:NewPages|pratélaning kaca-kaca anyar]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "recentchanges-submit": "Tuduhaké",
+       "rcfilters-activefilters": "Saringan murub",
+       "rcfilters-restore-default-filters": "Pulihaké saringan gawan",
+       "rcfilters-search-placeholder": "Saring owah-owahan anyar (lurua utawa wiwita ngetik)",
+       "rcfilters-invalid-filter": "Saringan ora sah",
+       "rcfilters-filterlist-title": "Saringan",
+       "rcfilters-filterlist-feedbacklink": "Wènèhi saran ngenani saringan (béta) singa anyar",
+       "rcfilters-filterlist-noresults": "Saringan ora katemu",
        "rcnotefrom": "Ing ngisor iki owah-owahan wiwit <strong>$2</strong> (kapacak nganti <strong>$1</strong> owah-owahan).",
        "rclistfrom": "Tuduhaké owah-owahan anyar kawit $2, $3",
        "rcshowhideminor": "$1 besutan cilik",
        "logempty": "Ora ditemokaké èntri log sing pas.",
        "log-title-wildcard": "Golèk sesirah sing diwiwiti tulisan iki",
        "showhideselectedlogentries": "Tuduhalé/dhelikaké èntri log kapilih",
+       "checkbox-all": "Kabèh",
+       "checkbox-none": "Ora ana",
+       "checkbox-invert": "Balèkaké",
        "allpages": "Kabèh kaca",
        "nextpage": "Kaca sabanjuré ($1)",
        "prevpage": "Kaca sadurungé ($1)",
        "cachedspecial-viewing-cached-ts": "Sampéyan lagi ndelok vèrsi cadhangan saka kaca iki, sing bisa dadi ora padha karo kasunyatan.",
        "cachedspecial-refresh-now": "Delok sing paling anyar.",
        "categories": "Kategori",
+       "categories-submit": "Tuduhaké",
        "categoriespagetext": "{{PLURAL:$1|kategori ing ngisor iki ngandhut|kategori ing ngisor iki ngandhut}} kaca utawa media.\n[[Special:UnusedCategories|Kategori sing ora dianggo]] ora ditampilaké ing kéné.\nDeleng uga [[Special:WantedCategories|kategori sing diperlokaké]].",
        "categoriesfrom": "Tampilaké kategori-kategori diwiwiti saka:",
        "deletedcontributions": "Sumbangan panganggo sing dibusak",
        "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-groups": "Tuduhaké panganggo sing mlebu golongan:",
        "activeusers-noresult": "Panganggo ora ana.",
+       "activeusers-submit": "Tuduhaké panganggo aktif",
        "listgrouprights": "Hak-hak grup panganggo",
        "listgrouprights-summary": "Ing ngisor iki kapacak dhaftar grup panganggo sing didéfinisi ing wiki iki, kanthi hak-hak aksès gandhèngané.\nInformasi tambahan perkara hak-hak individual bisa ditemokaké ing [[{{MediaWiki:Listgrouprights-helppage}}|kéné]].",
        "listgrouprights-key": "* <span class=\"listgrouprights-granted\">Hak sing diidinaké</span>\n* <span class=\"listgrouprights-revoked\">Hak sing dijabel</span>",
        "wlheader-showupdated": "Kaca-kaca sing wis owah wiwit ditiliki panjenengan kaping pungkasan, dituduhaké mawa '''aksara kandel'''",
        "wlnote": "Ngisor iki {{PLURAL:$1|owahan pungkasan|'''$1''' owahan pungkasan}} {{PLURAL:$2|jam|'''$2''' jam}} kapungkur, per $3, $4.",
        "wlshowlast": "Tuduhna $1 jam $2 dina  pungkasan",
+       "watchlist-hide": "Dhelikaké",
+       "watchlist-submit": "Tuduhaké",
+       "wlshowtime": "Kala mangsa kanggo dituduhaké:",
+       "wlshowhideminor": "besutan cilik",
+       "wlshowhidebots": "bot",
+       "wlshowhideliu": "panganggo kadhaftar",
+       "wlshowhideanons": "panganggo anonim",
+       "wlshowhidepatr": "besutan sing diawasi",
+       "wlshowhidemine": "besutanku",
        "wlshowhidecategorization": "kategorisasi kaca",
        "watchlist-options": "Pilihaning pawawangan",
        "watching": "Ngawasi...",
        "delete-confirm": "Busak \"$1\"",
        "delete-legend": "Busak",
        "historywarning": "'''Pènget''': Kaca sing bakal panjenengan busak ana sajarahé kanthi $1 {{PLURAL:$1|révisi|révisi}}:",
+       "historyaction-submit": "Tuduhaké",
        "confirmdeletetext": "Panjenengan bakal mbusak kaca utawa berkas iki minangka permanèn karo kabèh sajarahé saka basis data. Pastèkna dhisik menawa panjenengan pancèn nggayuh iki, ngerti kabèh akibat lan konsekwènsiné, lan apa sing bakal panjenengan tumindak iku cocog karo [[{{MediaWiki:Policy-url}}|kawicaksanan {{SITENAME}}]].",
        "actioncomplete": "Kasil diayahi",
        "actionfailed": "Tindakan gagal",
        "deletedtext": "\"$1\" wis dibusak. \nDelenga $2 minangka cathetan ngenani sing pungkasan kabusak.",
-       "dellogpage": "Log busak",
+       "dellogpage": "log busak",
        "dellogpagetext": "Ing ngisor iki kapacak log pambusakan kaca sing anyar dhéwé.",
        "deletionlog": "log busak",
        "reverted": "Dibalèkaké ing revisi sadurungé",
        "delete-edit-reasonlist": "Besut jalaraning pambusak",
        "delete-toobig": "Kaca iki darbé sujarah besutan sing dawa, punjul $1 {{PLURAL:$1|owahan}}.\nPambusak tumrap kaca sing kaya mangkono wis ora diidinaké nedya njagani murih ora ana karusakan ing {{SITENAME}}.",
        "delete-warning-toobig": "Kaca iki duwé sajarah panyuntingan sing dawa, luwih saka $1 {{PLURAL:$1|révisi|révisi}}.\nMbusak kaca iki bisa ngrusak operasi basis data ing {{SITENAME}};\nkudu ngati-ati.",
+       "deleteprotected": "Panjenengan ora bisa mbusak kaca iki amarga direksa.",
        "deleting-backlinks-warning": "'''Awas:''' Kaca liyane mungkin ana sing nautake ing kaca sing arep sampeyan busak.",
        "rollback": "Pulihaké besutan",
        "rollbacklink": "balèkaké",
        "rollback-success": "Suntingan dibalèkaké déning $1;\ndiowahi bali menyang vèrsi pungkasan déning $2.",
        "sessionfailure-title": "Sèsi gagal",
        "sessionfailure": "Katoné ana masalah karo sèsi log panjenengan; log panjenengan wis dibatalaké kanggo nyegah pambajakan. Mangga mencèt tombol \"back\" lan unggahaké manèh kaca sadurungé mlebu log, lan coba manèh.",
+       "changecontentmodel-title-label": "Sesirahé kaca",
+       "changecontentmodel-model-label": "Modhèl kontèn anyar",
+       "changecontentmodel-reason-label": "Alesan:",
+       "changecontentmodel-submit": "Ganti",
+       "changecontentmodel-success-title": "Modhèl kontèn wis diowahi",
        "protectlogpage": "Log reksa",
        "protectlogtext": "Ngisor iki daptar owahan saka panjagan kaca.\nDelok [[Special:ProtectedPages|daptar kaca sing dijaga]] kanggo daptar panjagan kaca paling anyar.",
        "protectedarticle": "ngreksa \"[[$1]]\"",
        "undeleteviewlink": "pirsani",
        "undeleteinvert": "Walik pilihan",
        "undeletecomment": "Alesan:",
-       "undeletedrevisions": "$1 {{PLURAL:$1|révisi|révisi}} wis dibalèkaké",
-       "undeletedrevisions-files": "$1 {{PLURAL:$1|révisi|révisi}} lan $2 berkas dibalèkaké",
-       "undeletedfiles": "$1 {{PLURAL:$1|berkas|berkas}} dibalèkaké",
        "cannotundelete": "Olèhé mbatalaké pambusakan gagal;\n$1",
        "undeletedpage": "'''$1 bisa dibalèkaké'''\n\nDelengen [[Special:Log/delete|log pambusakan]] kanggo data pambusakan lan pambalèkan.",
        "undelete-header": "Mangga mirsani [[Special:Log/delete|log pambusakan]] kanggo daftar kaca sing lagi waé dibusak.",
        "movepage-page-moved": "Kaca $1 wis dipindhah menyang $2.",
        "movepage-page-unmoved": "Kaca $1 ora bisa dialihaké menyang $2.",
        "movepage-max-pages": "Paling akèh $1 {{PLURAL:$1|kaca|kaca}} wis dialihaké lan ora ana manèh sing bakal dialihaké sacara otomatis.",
-       "movelogpage": "Log alih",
+       "movelogpage": "log alih",
        "movelogpagetext": "Ing ngisor iki kapacak log pangalihan kaca.",
        "movesubpage": "{{PLURAL:$1|Anak-kaca|Anak-kaca}}",
        "movesubpagetext": "Kaca iki nduwèni $1 {{PLURAL:$1|anak-kaca|anak-kaca}} kaya kapacak ing ngisor.",
        "tooltip-ca-nstab-template": "Deleng cithakan",
        "tooltip-ca-nstab-help": "Mirsani kaca pitulung",
        "tooltip-ca-nstab-category": "Deleng kaca kategori",
-       "tooltip-minoredit": "Tandhani iki minangka besutan cilik",
+       "tooltip-minoredit": "Tandhani iki yèn besutan cilik",
        "tooltip-save": "Simpen owah-owahaning sampéyan",
        "tooltip-preview": "Pratuduhing owah-owahaning sampéyan. Anggoa cara iki sadurungé nyimpen.",
        "tooltip-diff": "Tuduhaké owah-owahan endi sing sampéyan gawé tumrap tulisan iki",
        "logentry-rights-autopromote": "$1 otomatis {{GENDER:$2|dipromosikne}} saka $4 nèng $5",
        "logentry-upload-upload": "$1 {{GENDER:$2|ngunggah}} $3",
        "rightsnone": "(ora ana)",
-       "revdelete-summary": "tingkesan besutan",
        "feedback-adding": "Nambahaké lebon saran nèng kaca...",
        "feedback-bugcheck": "Apik! Pesthèké kuwi dudu sawijining [$1 bug sing dingertèni].",
        "feedback-bugnew": "Aku wis mriksa. Kandakaké bug anyar",
index 3f7fd96..97b3e87 100644 (file)
        "savearticle": "გვერდის შენახვა",
        "savechanges": "ცვლილებების შენახვა",
        "publishpage": "გვერდის გამოქვეყნება",
-       "publishchanges": "á\83ªá\83\95á\83\9aá\83\98á\83\9aá\83\94á\83\91á\83\94á\83\91á\83\98á\83¡ á\83\92á\83\90á\83\9bá\83\9dá\83¥á\83\95á\83\94á\83§á\83\9cá\83\94á\83\91ა",
+       "publishchanges": "á\83ªá\83\95á\83\9aá\83\98á\83\9aá\83\94á\83\91á\83\94á\83\91á\83\98á\83¡ á\83¨á\83\94á\83\9cá\83\90á\83®á\83\95ა",
        "preview": "წინასწარი გადახედვა",
        "showpreview": "წინასწარი გადახედვის ჩვენება",
        "showdiff": "ცვლილებების ჩვენება",
        "undeleteviewlink": "იხილე",
        "undeleteinvert": "გააუქმეთ გამოყოფა",
        "undeletecomment": "მიზეზი:",
-       "undeletedrevisions": "$1 ვერსია აღდგენილია",
-       "undeletedrevisions-files": "$1 ვერსია და $2 ფაილი აღდგენილია",
-       "undeletedfiles": "$1 ფაილი აღდგენილია",
        "cannotundelete": "ზოგიერთი ან ყველა წაშლის გაუქმება ვერ განხორციელდა:\n$1",
        "undeletedpage": "'''$1 აღდგენილია'''\n\nუკანასკნელი წაშლილთა და აღდგენის სია შეგიძლიათ ნახოთ [[Special:Log/delete|წაშლილთა სიაში]].",
        "undelete-header": "ბოლოს წაშლილი გვერდების სიის ნახვა შეიძლება [[Special:Log/delete|წაშლათა ჟურნალში]].",
index 1b03b32..b05a9b6 100644 (file)
@@ -26,7 +26,7 @@
        "tog-watchdefault": "Pel u dosyê ke mı vurnê lista mına şêrkerdişi ke",
        "tog-watchmoves": "Pel u dosyê ke mı kırısnê lista mına şêrkerdişi ke",
        "tog-watchdeletion": "Pel u dosyê ke mı esterıtê, lista mına şêrkerdişi ke",
-       "tog-minordefault": "Vurnayisunê ho pêrune ‘vurnayiso qızkek’ nisan bıde",
+       "tog-minordefault": "Vırnayışanê xo pêrıne ‘vırnayışo qıckek’ nışan bıde",
        "tog-previewontop": "Verqayti pela nustene ser de bıasne",
        "tog-previewonfirst": "Vurnayiso verên de verqayti tım bıasne",
        "tog-enotifwatchlistpages": "Zû pele ya ki dosyawa ke lista mına şêrkerdişi de vurnê mı rê e-poste bırusne",
        "editsection": "bıvurne",
        "editold": "bıvurne",
        "viewsourceold": "çımey bıvêne",
-       "editlink": "bıvurne",
+       "editlink": "bıvırne",
        "viewsourcelink": "çıme bıvêne",
        "editsectionhint": "Qısımi bıvurne: $1",
        "toc": "Tedeestey",
        "externaldberror": "Cıfeteliyaisê naskerdene de ya xeta esta ya ki tebera vırastena hesabê sıma rê destur çino.",
        "login": "Cı kuye",
        "nav-login-createaccount": "Cı kuye / hesab vıraze",
-       "userlogin": "Cı kuye / hesab vıraze",
-       "userloginnocreate": "Cı kuye",
        "logout": "Veciye",
        "userlogout": "Veciye",
        "notloggedin": "Cı nêkota",
-       "nologin": "Hesabê sıma çino? '''$1'''.",
-       "nologinlink": "Jü hesab rake",
        "createaccount": "Hesab vıraze",
-       "gotaccount": "Hesabê sıma ke esto? '''$1'''.",
-       "gotaccountlink": "Cı kuye",
-       "userlogin-resetlink": "Melumatê cıkewtışi xo vira kerdê?",
        "createaccountmail": "e-poste sera",
-       "createaccountreason": "Sebeb:",
        "badretype": "Parola sıma nêvêrena.",
        "userexists": "No namê karberi guretiyo.\nKerem ke, namêna weçine.",
        "loginerror": "Xeta cıkotene",
        "compare-page1": "Pele 1",
        "compare-page2": "Pele 2",
        "rightsnone": "(qet jü)",
-       "revdelete-summary": "xulasa vurnaene",
        "feedback-cancel": "Bıtexelne"
 }
index 9724c72..96e8396 100644 (file)
        "minoredit": "នេះជា​កំណែប្រែតិចតួចប៉ុណ្ណោះ",
        "watchthis": "តាមដាន​ទំព័រនេះ",
        "savearticle": "រក្សាទំព័រទុក",
+       "savechanges": "រក្សាទុកបន្លាស់ប្ដូរ",
+       "publishpage": "ផ្សព្វផ្សាយទំព័រ",
+       "publishchanges": "ផ្សព្វផ្សាយការផ្លាស់ប្តូរ",
        "preview": "មើលជាមុន",
        "showpreview": "បង្ហាញ​ការមើលជាមុន",
        "showdiff": "បង្ហាញ​បន្លាស់ប្ដូរ",
        "undeleteviewlink": "មើល",
        "undeleteinvert": "ក្រៅពីនោះ",
        "undeletecomment": "មូលហេតុ៖",
-       "undeletedrevisions": "បានស្តារឡើងវិញនូវ{{PLURAL:$1|១កំណែ|$1កំណែ}}",
-       "undeletedrevisions-files": "បានស្តារឡើងវិញនូវ{{PLURAL:$1|១កំណែ|$1កំណែ}}និង{{PLURAL:$2|១ឯកសារ|$2ឯកសារ}}",
-       "undeletedfiles": "{{PLURAL:$1|១ ឯកសារ|$1 ឯកសារ}} ត្រូវបានស្ដារឡើងវិញ",
        "cannotundelete": "ឈប់លុបមិនសម្រេច៖​$1",
        "undeletedpage": "'''$1 ត្រូវបានស្តារឡើងវិញហើយ'''\n\nសូម​ចូល​ទៅ [[Special:Log/delete|កំណត់ហេតុ​នៃ​ការលុប]] ដើម្បី​ពិនិត្យ​មើល​កំណត់ត្រា​នៃ​ការលុប​និង​ការ​ស្ដារ​ឡើង​វិញ​។",
        "undelete-header": "មើលទំព័រដែលត្រូវបានលុបចោលថ្មីៗក្នុង[[Special:Log/delete|កំណត់ហេតុនៃការលុបចោល]]។",
        "anonymous": "{{PLURAL:$1|user|អ្នកប្រើប្រាស់}}អនាមិកនៃ {{SITENAME}}",
        "siteuser": "អ្នកប្រើប្រាស់{{SITENAME}} $1",
        "anonuser": "អ្នកប្រើប្រាស់{{SITENAME}}អនាមិក $1",
-       "lastmodifiedatby": "ទំព័រនេះត្រូវបានប្តូរចុងក្រោយដោយ$3នៅវេលា$2,$1។",
+       "lastmodifiedatby": "ទំព័រនេះត្រូវបានប្តូរចុងក្រោយដោយ $3 នៅវេលា $2,$1។",
        "othercontribs": "ផ្អែកលើការងាររបស់$1។",
        "others": "ផ្សេងៗទៀត",
        "siteusers": "{{PLURAL:$2|អ្នកប្រើប្រាស់|អ្នកប្រើប្រាស់}} {{SITENAME}} $1",
index 7404eea..8d1450a 100644 (file)
@@ -65,7 +65,8 @@
                        "Matma Rex",
                        "Tursetic",
                        "Jerrykim306",
-                       "Sukjong0406"
+                       "Sukjong0406",
+                       "Garam"
                ]
        },
        "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\" 봇 이름을 추가하는데 실패했습니다. 이미 등록되지 않았는지 확인하기 바랍니다.",
        "page_first": "처음",
        "page_last": "마지막",
        "histlegend": "차이 선택: 비교하려는 판의 라디오 상자를 선택한 다음 엔터나 아래의 버튼을 누르세요.<br />\n설명: <strong>({{int:cur}})</strong> = 최신 판과 비교, <strong>({{int:last}})</strong> = 이전 판과 비교, <strong>{{int:minoreditletter}}</strong>= 사소한 편집",
-       "history-fieldset-title": "역사 찾아보기",
-       "history-show-deleted": "삭제된 것만",
+       "history-fieldset-title": "특정판 검색",
+       "history-show-deleted": "특정판이 삭제된 것만",
        "histfirst": "오래됨",
        "histlast": "최신",
        "historysize": "({{PLURAL:$1|1 바이트|$1 바이트}})",
        "yourrealname": "실명:",
        "yourlanguage": "언어:",
        "yourvariant": "언어 변종:",
-       "prefs-help-variant": "이 위키 내용을 볼 때 사용할 언어 변종이나 철자 체계를 선택하세요.",
+       "prefs-help-variant": "이 위키 내용을 표시하기 위해 사용할 언어 변종이나 철자 체계를 선택하세요.",
        "yournick": "새 서명:",
        "prefs-help-signature": "토론 문서에 글을 쓴 후에는 마지막에 서명을 해야 합니다.  “<nowiki>~~~~</nowiki>” 기호를 추가하면 서명과 글 작성 시각이 자동으로 입력됩니다.",
        "badsig": "서명이 잘못되었습니다.\nHTML 태그를 확인하세요.",
        "prefs-help-prefershttps": "이 사용자 환경 설정은 다음 로그인부터 적용됩니다.",
        "prefswarning-warning": "사용자 환경 설정에서 바뀐 것이 아직 저장되어 있지 않습니다.\n사용자 환경 설정에서 \"$1\"을 클릭하지 않고 이 페이지를 떠나면 바뀌지 않습니다.",
        "prefs-tabs-navigation-hint": "팁: 탭 목록에서 탭 사이를 둘러보려면 왼쪽과 오른쪽 화살표 키를 사용할 수 있습니다.",
-       "userrights": "사용자 권한 관리",
+       "userrights": "사용자 권한",
        "userrights-lookup-user": "사용자 선택",
        "userrights-user-editname": "사용자 이름 입력:",
        "editusergroup": "사용자 그룹 불러오기",
        "saveusergroups": "{{GENDER:$1|사용자}} 권한 저장",
        "userrights-groupsmember": "현재 권한:",
        "userrights-groupsmember-auto": "자동으로 부여된 권한:",
-       "userrights-groups-help": "이 사용자의 권한을 바꿀 수 있습니다.\n* 사용자는 체크 표시가 있는 권한을 갖습니다.\n* 사용자는 체크 표시가 없는 권한을 갖지 않습니다.\n* <nowiki>*</nowiki>표시는 권한을 주거나 거두는 것 중 하나만 할 수 있다는 뜻입니다.",
+       "userrights-groups-help": "이 사용자의 권한을 바꿀 수 있습니다.\n* 사용자는 체크 표시가 있는 권한을 갖습니다.\n* 사용자는 체크 표시가 없는 권한을 갖지 않습니다.\n* <nowiki>*</nowiki>표시는 권한을 주거나 거두는 것 중 하나만 할 수 있다는 뜻입니다.\n* <nowiki>#</nowiki> 표시는 권한의 만료일을 늦출 수만 있다는 뜻입니다; 만료일을 앞당길 수는 없습니다.",
        "userrights-reason": "이유:",
        "userrights-no-interwiki": "다른 위키의 사용자 권한을 바꿀 권한이 없습니다.",
        "userrights-nodatabase": "데이터베이스 $1이 존재하지 않거나 로컬에 있지 않습니다.",
        "userrights-expiry-options": "1일:1 day,1주일:1 week,1개월:1 month,3개월:3 months,6개월:6 months,1년:1 year",
        "userrights-invalid-expiry": "그룹 \"$1\"의 만료 시간이 유효하지 않습니다.",
        "userrights-expiry-in-past": "그룹 \"$1\"의 만료 시간이 과거입니다.",
+       "userrights-cannot-shorten-expiry": "\"$1\" 권한의 만료일을 앞당길 수 없습니다. 권한을 추가하고 회수할 수 있는 권한을 가진 사용자만 권한의 만료일을 앞당길 수 있습니다.",
        "userrights-conflict": "사용자 권한 바꾸기가 충돌합니다! 바뀜을 검토하고 확인하세요.",
        "group": "그룹:",
        "group-user": "사용자",
        "rcfilters-invalid-filter": "유효하지 않은 필터",
        "rcfilters-empty-filter": "활성화된 필터가 없습니다. 모든 기여가 표시됩니다.",
        "rcfilters-filterlist-title": "필터",
+       "rcfilters-filterlist-whatsthis": "이게 뭐죠?",
        "rcfilters-filterlist-feedbacklink": "새로운 (베타) 필터에 대한 의견을 주세요",
        "rcfilters-highlightbutton-title": "결과 강조",
        "rcfilters-highlightmenu-title": "색 선택",
        "rcfilters-highlightmenu-help": "이 속성을 강조할 색을 선택하십시오",
        "rcfilters-filterlist-noresults": "필터를 찾을 수 없습니다",
+       "rcfilters-noresults-conflict": "검색 조건이 충돌하기 때문에 결과를 찾을 수 없습니다",
        "rcfilters-filtergroup-registration": "사용자 등록",
        "rcfilters-filter-registered-label": "등록됨",
        "rcfilters-filter-registered-description": "로그인된 편집자.",
        "rcfilters-filter-editsbyother-label": "다른 사용자의 편집",
        "rcfilters-filter-editsbyother-description": "다른 사용자에 의한 편집 (당신의 편집이 아님).",
        "rcfilters-filtergroup-userExpLevel": "경험 수준 (등록된 사용자 전용)",
-       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "ì\9d´ í\95\84í\84°ë\8a\94 ë\93±ë¡\9d ì\82¬ì\9a©ì\9e\90ë§\8c ì°¾ê¸° ë\95\8c문ì\97\90 ë¹\84í\99\9cì\84±í\99\94ë\90\98ì\96´ ì\9e\88ì\9c¼ë¯\80ë¡\9c \"미ë\93±ë¡\9d\" í\95\84í\84°ë\8a\94 í\9a¨ê³¼ë¥¼ ì·¨ì\86\8cí\95©ë\8b\88ë\8b¤.",
-       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "\"미ë\93±ë¡\9d\" í\95\84í\84°ë\8a\94 í\95\98ë\82\98 ì\9d´ì\83\81ì\9d\98 ê²½í\97\98 í\95\84í\84°ì\99\80 ì¶©ë\8f\8cí\95©ë\8b\88ë\8b¤. ê²½í\97\98 í\95\84í\84°ë\8a\94 ë\93±ë¡\9dë\90\9c ì\82¬ì\9a©ì\9e\90ë§\8c ì°¾ì\8aµë\8b\88ë\8b¤. ì¶©ë\8f\8cë\90\98ë\8a\94 í\95\84í\84°ë\8a\94 ì\9c\84ì\97\90ì\84\9c ë¹\84í\99\9cì\84±í\99\94ë\90\9c ê²\83ì\9c¼ë¡\9c 표시됩니다.",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "ê²½í\97\98 í\95\84í\84°ë\8a\94 ë\93±ë¡\9dë\90\9c ì\82¬ì\9a©ì\9e\90ë§\8cì\9d\84 ê²\80ì\83\89í\95\98기 ë\95\8c문ì\97\90 ì\9d´ í\95\84í\84°ë\8a\94 \"ë\93±ë¡\9d ì\95\88 ë\90¨\" í\95\84í\84°ì\99\80 ì¶©ë\8f\8cí\95©ë\8b\88ë\8b¤.",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "\"ë\93±ë¡\9d ì\95\88 ë\90¨\" í\95\84í\84°ë\8a\94 í\95\98ë\82\98 ì\9d´ì\83\81ì\9d\98 ê²½í\97\98 í\95\84í\84°ì\99\80 ì¶©ë\8f\8cí\95©ë\8b\88ë\8b¤. ê²½í\97\98 í\95\84í\84°ë\8a\94 ë\93±ë¡\9dë\90\9c ì\82¬ì\9a©ì\9e\90ë§\8c ì°¾ì\8aµë\8b\88ë\8b¤. ì¶©ë\8f\8cë\90\98ë\8a\94 í\95\84í\84°ë\8a\94 ì\9c\84ì\9d\98 í\99\9cì\84±í\99\94ë\90\9c í\95\84í\84° ëª©ë¡\9dì\97\90 표시됩니다.",
        "rcfilters-filter-user-experience-level-newcomer-label": "신규 사용자",
        "rcfilters-filter-user-experience-level-newcomer-description": "10회 미만의 편집 및 4일 미만의 활동.",
        "rcfilters-filter-user-experience-level-learner-label": "학습자",
        "rcfilters-filter-bots-description": "자동 도구를 이용한 편집.",
        "rcfilters-filter-humans-label": "사람 (봇이 아님)",
        "rcfilters-filter-humans-description": "사람이 한 편집.",
+       "rcfilters-filtergroup-reviewstatus": "검토 상태",
+       "rcfilters-filter-patrolled-label": "점검됨",
+       "rcfilters-filter-patrolled-description": "검토한 것으로 표시된 편집들.",
+       "rcfilters-filter-unpatrolled-label": "점검 안 됨",
+       "rcfilters-filter-unpatrolled-description": "검토한 것으로 표시되지 않은 편집들.",
        "rcfilters-filtergroup-significance": "의미",
        "rcfilters-filter-minor-label": "사소한 편집",
+       "rcfilters-filter-minor-description": "기여자가 사소한 기여로 표시한 편집.",
        "rcfilters-filter-major-label": "사소하지 않은 편집",
        "rcfilters-filter-major-description": "사소한 편집으로 표시되지 않은 편집.",
        "rcfilters-filtergroup-changetype": "차이 종류",
        "rcfilters-filter-categorization-label": "분류 차이",
        "rcfilters-filter-categorization-description": "분류에서 추가되거나 제거되는 페이지의 기록.",
        "rcfilters-filter-logactions-description": "관리적 조치, 계정 만들기, 페이지 삭제, 업로드...",
+       "rcfilters-hideminor-conflicts-typeofchange-global": "특정한 유형의 변경사항을 \"사소한 편집\"으로 지정할 수 없기 때문에 \"사소한 편집\" 필터는 하나 이상의 변경사항 유형 필터와 충돌합니다. 충돌되는 필터들은 위의 사용 중인 필터 영역에 표시됩니다.",
+       "rcfilters-hideminor-conflicts-typeofchange": "특정한 종류의 변경사항은 \"사소한 편집\"으로 지정할 수 없으므로 이 필터는 다음 유형의 변경사항 필터와 충돌합니다: $1",
+       "rcfilters-typeofchange-conflicts-hideminor": "이 유형의 변경사항 필터는 \"사소한 편집\" 필터와 충돌합니다. 특정한 종류의 변경사항은 \"사소한 편집\"으로 지정할 수 없습니다.",
        "rcnotefrom": "아래는 <strong>$3, $4</strong>부터 시작하는 {{PLURAL:$5|바뀜이 있습니다}}. (최대 <strong>$1</strong>개가 표시됨)",
+       "rclistfromreset": "날짜 선택 초기화",
        "rclistfrom": "$3 $2부터 시작하는 새로 바뀐 문서 보기",
        "rcshowhideminor": "사소한 편집 $1",
        "rcshowhideminor-show": "보이기",
        "upload_directory_read_only": "파일 저장 디렉터리($1)에 쓰기 권한이 없습니다.",
        "uploaderror": "올리기 오류",
        "upload-recreate-warning": "<strong>경고: 해당 이름으로 된 파일이 삭제되었거나 이동되었습니다.</strong>\n\n편의를 위해 이 문서에 대한 삭제와 이동 기록을 다음과 같이 제공합니다:",
-       "uploadtext": "파일을 올리기 위해서는 아래의 양식을 채워주세요.\n[[Special:FileList|파일 목록]]에서 이전에 올라온 파일을 검색할 수 있습니다. [[Special:Log/upload|올리기 기록]]에는 파일이 올라온 기록이 남습니다. 삭제 기록은 [[Special:Log/delete|삭제 기록]]에서 볼 수 있습니다.\n\n문서에 파일을 넣으려면 아래 방법 중 하나를 사용하세요.\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' 파일의 온전한 모양을 사용하고자 할 때\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200픽셀|섬네일|왼쪽|설명]]</nowiki></code>''' 파일의 너비를 200픽셀로 하고 왼쪽 정렬하며 '설명' 이라는 주석을 파일 밑에 달 때\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' 파일을 직접 보여주지 않고 파일로 바로 링크할 때",
+       "uploadtext": "파일을 올리기 위해서는 아래의 양식을 채워주세요.\n[[Special:FileList|파일 목록]]에서 이전에 올라온 파일을 검색할 수 있습니다. [[Special:Log/upload|올리기 기록]]에는 파일이 올라온 기록이 남습니다. 삭제 기록은 [[Special:Log/delete|삭제 기록]]에서 볼 수 있습니다.\n\n문서에 파일을 넣으려면 아래 방법 중 하나를 사용하세요.\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code></strong> 파일의 온전한 모양을 사용하고자 할 때\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200픽셀|섬네일|왼쪽|설명]]</nowiki></code></strong> 파일의 너비를 200픽셀로 하고 왼쪽 정렬하며 '설명' 이라는 주석을 파일 밑에 달 때\n* <strong><code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code></strong> 파일을 직접 표시하지 않고 파일로 바로 링크할 때",
        "upload-permitted": "허용된 파일 {{PLURAL:$2|형식}}: $1",
        "upload-preferred": "권장 파일 {{PLURAL:$2|형식}}: $1",
        "upload-prohibited": "금지된 파일 {{PLURAL:$2|형식}}: $1",
        "php-uploaddisabledtext": "PHP 파일 올리기가 비활성화되었습니다. 파일 올리기 설정을 확인하십시오.",
        "uploadscripted": "이 파일에는 HTML이나 다른 스크립트 코드가 포함되어 있어, 웹 브라우저에서 오류를 일으킬 수 있습니다.",
        "upload-scripted-pi-callback": "XML 스타일시트 처리 명령을 포함하는 파일은 업로드할 수 없습니다.",
+       "upload-scripted-dtd": "비표준 DTD 선언이 포함된 SVG 파일을 업로드할 수 없습니다.",
        "uploaded-script-svg": "업로드된 SVG 파일에서 스크립트로 만들 수 있는 \"$1\" 요소를 발견했습니다.",
        "uploaded-hostile-svg": "업로드된 SVG 파일의 스타일 요소에 안전하지 않은 CSS가 있습니다.",
        "uploaded-event-handler-on-svg": "이벤트 핸들러 속성 <code>$1=\"$2\"</code> 설정은 SVG 파일에서 사용할 수 없습니다.",
        "uploaded-href-attribute-svg": "SVG 파일의 href 속성은 http:// 또는 https:// 대상의 링크만 허용되지만 <code>&lt;$1 $2=\"$3\"&gt;</code>를 발견했습니다.",
        "uploaded-href-unsafe-target-svg": "안전하지 않은 데이터를 가리키는 href를 발견했습니다: 업로드된 SVG 파일의 URI 대상 <code>&lt;$1 $2=\"$3\"&gt;</code>",
-       "uploaded-animate-svg": "업로드된 SVG 파일에서 \"from\" 성 <code>&lt;$1 $2=\"$3\"&gt;</code>을 이용 중 \"animate\" 태그가 href를 변경할 수 있음을 발견했습니다.",
+       "uploaded-animate-svg": "업로드된 SVG 파일에서 \"from\" 성 <code>&lt;$1 $2=\"$3\"&gt;</code>을 이용 중 \"animate\" 태그가 href를 변경할 수 있음을 발견했습니다.",
        "uploaded-setting-event-handler-svg": "이벤트 핸들러 속성을 차단으로 설정한 상태에서 <code>&lt;$1 $2=\"$3\"&gt;</code>가 업로드된 SVG 파일에서 발견되었습니다.",
-       "uploaded-setting-href-svg": "부모 요소에 \"href\" 성을 추가할 목적으로 \"set\" 태그를 사용하는 것은 금지됩니다.",
-       "uploaded-wrong-setting-svg": "원격/데이터/스크립트 대상을 임의의 성에 추가할 목적으로 \"set\" 태그를 사용하는 것은 금지됩니다. 업로드된 SVG 파일에 <code>&lt;set to=\"$1\"&gt;</code>를 발견했습니다.",
-       "uploaded-setting-handler-svg": "원격/데이터/스크립트와 함께 \"handler\" 성을 설정한 SVG는 이용이 금지됩니다. 업로드된 SVG 파일에서 <code>$1=\"$2\"</code>를 발견하였습니다.",
-       "uploaded-remote-url-svg": "원격 URL로 style 성이 설정된 SVG파일은 금지됩니다. 업로드된 SVG 파일에서 <code>$1=\"$2\"</code>를 발견하였습니다.",
+       "uploaded-setting-href-svg": "부모 요소에 \"href\" 성을 추가할 목적으로 \"set\" 태그를 사용하는 것은 금지됩니다.",
+       "uploaded-wrong-setting-svg": "원격/데이터/스크립트 대상을 임의의 성에 추가할 목적으로 \"set\" 태그를 사용하는 것은 금지됩니다. 업로드된 SVG 파일에 <code>&lt;set to=\"$1\"&gt;</code>를 발견했습니다.",
+       "uploaded-setting-handler-svg": "원격/데이터/스크립트와 함께 \"handler\" 성을 설정한 SVG는 이용이 금지됩니다. 업로드된 SVG 파일에서 <code>$1=\"$2\"</code>를 발견하였습니다.",
+       "uploaded-remote-url-svg": "원격 URL로 style 성이 설정된 SVG파일은 금지됩니다. 업로드된 SVG 파일에서 <code>$1=\"$2\"</code>를 발견하였습니다.",
        "uploaded-image-filter-svg": "URL에 이미지 필터를 발견했습니다: 업로드된 SVG 파일의 <code>&lt;$1 $2=\"$3\"&gt;</code>.",
        "uploadscriptednamespace": "이 SVG 파일은 사용할 수 없는 이름공간 '<nowiki>$1</nowiki>'을 포함하고 있습니다.",
        "uploadinvalidxml": "업로드된 파일의 XML의 구문을 분석할 수 없습니다.",
        "log": "기록 목록",
        "logeventslist-submit": "보기",
        "all-logs-page": "모든 공개 기록",
-       "alllogstext": "{{SITENAME}}ì\97\90ì\84\9cì\9d\98 ê¸°ë¡\9dì\9d´ ëª¨ë\91\90 ë\82\98ì\99\80 ì\9e\88ì\8aµë\8b\88ë\8b¤.\n기ë¡\9d ì¢\85ë¥\98, ì\82¬ì\9a©ì\9e\90 ì\9d´ë¦\84, ë¬¸ì\84\9c ì\9d´ë¦\84ì\9d\84 ì\84 í\83\9dí\95´서 볼 수 있습니다. (대소문자를 구별합니다.)",
+       "alllogstext": "{{SITENAME}}ì\9d\98 ì\82¬ì\9a©í\95  ì\88\98 ì\9e\88ë\8a\94 ê¸°ë¡\9dì\9d´ ëª¨ë\91\90 í\91\9cì\8b\9cë\90\98ì\96´ ì\9e\88ì\8aµë\8b\88ë\8b¤.\n기ë¡\9d ì¢\85ë¥\98, ì\82¬ì\9a©ì\9e\90 ì\9d´ë¦\84, ì\98\81í\96¥ì\9d\84 ë°\9bë\8a\94 ë¬¸ì\84\9cì\9d\84 ì\84 í\83\9dí\95´ì\84\9c ë²\94ì\9c\84를 ì¢\81í\98\80서 볼 수 있습니다. (대소문자를 구별합니다.)",
        "logempty": "일치하는 항목이 없습니다.",
        "log-title-wildcard": "다음 글로 시작하는 제목 검색",
        "showhideselectedlogentries": "선택한 기록 항목 보이기/숨기기",
        "undeleteviewlink": "보기",
        "undeleteinvert": "선택 반전",
        "undeletecomment": "이유:",
-       "undeletedrevisions": "{{PLURAL:$1|판 1개|판 $1개}}를 되살렸습니다",
-       "undeletedrevisions-files": "{{PLURAL:$1|판 1개|판 $1개}}와 {{PLURAL:$2|파일 1개|파일 $2개}}를 되살렸습니다",
-       "undeletedfiles": "{{PLURAL:$1|파일 1개|파일 $1개}}를 되살렸습니다",
        "cannotundelete": "일부 또는 모든 항목의 되살리기를 실패했습니다:\n$1",
        "undeletedpage": "<strong>$1 문서를 되살렸습니다.</strong>\n\n[[Special:Log/delete|삭제 기록]]에서 최근의 삭제 및 되살리기 기록을 볼 수 있습니다.",
        "undelete-header": "최근에 삭제한 문서에 대한 기록은 [[Special:Log/delete|여기]]에서 볼 수 있습니다.",
        "newimages-summary": "이 특수 문서는 최근에 올라온 파일을 나열하고 있습니다.",
        "newimages-legend": "필터",
        "newimages-label": "파일 이름 (또는 그 일부분):",
+       "newimages-user": "IP 주소 또는 사용자 이름",
        "newimages-showbots": "봇이 올린 것 보기",
        "newimages-hidepatrolled": "점검한 업로드 숨기기",
        "noimages": "그림이 없습니다.",
        "metadata-help": "이 파일은 카메라나 스캐너가 파일을 만들거나 디지털화하는 데 사용하기위해 기록한 부가 정보를 포함하고 있습니다.\n프로그램에서 파일을 편집한 경우, 새로 저장한 파일에 일부 부가 정보가 빠질 수 있습니다.",
        "metadata-expand": "자세한 정보 보이기",
        "metadata-collapse": "자세한 정보 숨기기",
-       "metadata-fields": "파일 메타데이터 표가 접혀 있을 때, 이 메시지에 올라와 있는 다음 속성값만이 기본적으로 보이게 됩니다.\n나머지 값은 자동적으로 숨겨집니다.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
+       "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-imagewidth": "너비",
        "exif-imagelength": "높이",
        "exif-bitspersample": "픽셀당 비트 수",
        "htmlform-user-not-valid": "<strong>$1</strong>은 올바른 사용자 이름이 아닙니다.",
        "logentry-delete-delete": "$1님이 $3 문서를 {{GENDER:$2|삭제했습니다}}",
        "logentry-delete-delete_redir": "$1님이 덮어쓰기를 통해 $3 문서를 {{GENDER:$2|삭제했습니다}}",
-       "logentry-delete-restore": "$1님이 $3 문서를 {{GENDER:$2|되살렸습니다}}",
+       "logentry-delete-restore": "$1님이 $3 문서를 {{GENDER:$2|되살렸습니다}} ($4)",
+       "logentry-delete-restore-nocount": "$1님이 $3 문서를 {{GENDER:$2|되살렸습니다}}",
+       "restore-count-revisions": "{{PLURAL:$1|1개의 판|$1개의 판}}",
+       "restore-count-files": "{{PLURAL:$1|1개의 파일|$1개의 파일}}",
        "logentry-delete-event": "$1님이 $3의 {{PLURAL:$1|기록 $5개}}에 대해 보이기 설정을 {{GENDER:$2|바꾸었습니다}}: $4",
        "logentry-delete-revision": "$1님이 $3 문서의 {{PLURAL:$5|$5개 편집}}의 설정을 {{GENDER:$2|바꾸었습니다}}: $4",
        "logentry-delete-event-legacy": "$1님이 $3 문서 기록의 보이기 설정을 {{GENDER:$2|바꾸었습니다}}",
        "authprovider-confirmlink-request-label": "연결할 계정",
        "authprovider-confirmlink-success-line": "$1: 연결을 성공했습니다.",
        "authprovider-confirmlink-failed": "계정 연결을 완전히 성공하지 못했습니다: $1",
-       "authprovider-confirmlink-ok-help": "연결 실패 메시지를 보여준 뒤에도 계속합니다.",
+       "authprovider-confirmlink-ok-help": "연결 실패 메시지를 표시한 뒤에도 계속합니다.",
        "authprovider-resetpass-skip-label": "건너뛰기",
        "authprovider-resetpass-skip-help": "비밀번호 재설정을 건너뜁니다.",
        "authform-nosession-login": "인증은 성공했으나 사용자의 브라우저가 로그인 상태를 저장하지 못했습니다.\n\n$1",
        "restrictionsfield-label": "허용된 IP 대역:",
        "restrictionsfield-help": "줄 단위의 하나의 IP 주소 또는 CIDR 대역입니다. 모든 곳에 적용하려면, 다음을 사용하세요:<pre>0.0.0.0/0\n::/0</pre>",
        "revid": "$1 판",
-       "pageid": "페이지 ID $1"
+       "pageid": "페이지 ID $1",
+       "gotointerwiki": "{{SITENAME}}을(를) 떠납니다",
+       "gotointerwiki-invalid": "지정된 제목이 올바르지 않습니다.",
+       "gotointerwiki-external": "별개의 웹사이트인 [[$2]]의 방문을 위해 {{SITENAME}}을(를) 떠나려고 합니다.\n\n[$1 $1(으)로 계속 진행하려면 여기를 클릭하십시오].",
+       "undelete-cantedit": "이 문서를 편집할 권한이 없으므로 이 문서를 복구할 수 없습니다.",
+       "undelete-cantcreate": "이 이름으로 된 문서가 없고 이 문서를 만들 권한이 없으므로 이 문서를 복구할 수 없습니다."
 }
index 6afca3d..6ea2658 100644 (file)
        "userlogin-remembermypassword": "Pijä miut kirjuttautunuona",
        "login": "Kirjauvu šiämeh",
        "nav-login-createaccount": "Kirjauvu šiämeh / rekisteriyvy",
-       "userlogin": "Kirjauvu šiämeh / rekisteriyvy",
-       "userloginnocreate": "Kirjauvu šiämeh",
        "logout": "Kirjauvu pois",
        "userlogout": "Kirjauvu pois",
        "userlogin-noaccount": "Eikö šiula vielä ole käyttäjätunnušta?",
        "userlogin-joinproject": "Liity {{SITENAME}}",
        "createaccount": "Luaji käyttäjätili",
-       "gotaccountlink": "Kirjauvu šiämeh",
        "userlogin-resetpassword-link": "Unohitko šalašanan?",
        "userlogin-helplink2": "Apu kirjuttautumiseh",
        "createacct-emailoptional": "Šähköpoštiošoiteh (ei tarviče välttämättä kirjuttua)",
        "createacct-email-ph": "Kirjuta oma šähköpoštiošoiteh",
-       "createaccountreason": "Šyy:",
        "createacct-reason": "Šyy",
        "createacct-submit": "Luaji oma käyttäjätunnuš",
        "createacct-benefit-heading": "{{SITENAME}} on šiun kaltasien ihmisien luatima.",
        "searchprofile-everything-tooltip": "Eči kaikilta šivuloilta (niise pakinoista)",
        "searchprofile-advanced-tooltip": "Eči miärätyistä nimitiloista",
        "search-result-size": "$1 ({{PLURAL:$2|1 šana|$2 šanua}})",
-       "search-redirect": "(šiirretty $1)",
+       "search-redirect": "(šiirretty šivulta $1)",
        "search-section": "(alaluku $1)",
        "search-suggest": "Tarkotitko: $1",
        "searchall": "kaikki",
        "logentry-move-move": "$1 {{GENDER:$2|šiirretty}} šivu $3 kohtah $4",
        "logentry-newusers-create": "Käyttäjätunnuš $1 {{GENDER:$2|oli luotu}}",
        "logentry-upload-upload": "$1 {{GENDER:$2|päivitetty}} $3",
-       "searchsuggest-search": "Eči"
+       "searchsuggest-search": "Eči {{SITENAME}}"
 }
index 511e962..266b25b 100644 (file)
        "templatesusedpreview": "{{PLURAL:$1|Schabloun|Schablounen}} déi an dëser nach net gespäicherter Versioun benotzt {{PLURAL:$1|gëtt|ginn}}:",
        "templatesusedsection": "{{PLURAL:$1|Schabloun|Schablounen}} déi an dësem Abschnitt benotzt {{PLURAL:$1|gëtt|ginn}}:",
        "template-protected": "(gespaart)",
-       "template-semiprotected": "(gespaart fir net-ugemellten an nei Benotzer)",
+       "template-semiprotected": "(gespaart fir net-ugemellt an nei Benotzer)",
        "hiddencategories": "Dës Säit gehéiert zu {{PLURAL:$1|1 verstoppter Kategorie|$1 verstoppte Kategorien}}:",
        "edittools": "<!-- Dësen Text gëtt ënner dem \"Ännere\"-Formulaire souwéi dem \"Eropluede\"-Formulaire ugewisen. -->",
        "nocreatetext": "Op {{SITENAME}} gouf d'Schafe vun neie Säite limitéiert. Dir kënnt Säiten déi scho bestinn änneren oder Iech [[Special:UserLogin|aloggen oder e Benotzerkont opmaachen]].",
        "post-expand-template-argument-warning": "'''Warnung: Op dëser Säit ass mindestens een Argument an enger Schabloun dat eng ze grouss Expansiounsgréisst huet. Dës Argumenter goufen ewechgelooss.",
        "post-expand-template-argument-category": "Säiten, op dene mindestens e Parameter vun enger Schabloun vergiess ginn ass",
        "parser-template-loop-warning": "Endlos Schleef an der Schabloun: [[$1]] entdeckt",
+       "template-loop-category": "Säite mat Endlos-Schleefe vu Schablounen",
        "parser-template-recursion-depth-warning": "D'Limit vun der Zuel vun de Verschachtelunge vu Schabloune gouf iwwerschratt ($1)",
        "language-converter-depth-warning": "D'Limite vun der déift vun der Sproochëmwandlung gouf iwwerschratt ($1)",
        "node-count-exceeded-category-desc": "D'Säit huet méi wéi déi maximal Zuel vu Kniet (Node-count).",
        "page_first": "éischt",
        "page_last": "lescht",
        "histlegend": "Fir d'Ännerungen unzeweisen: Klickt déi zwou Versiounen un, déi solle verglach ginn.<br />\n*(aktuell) = Ënnerscheed mat der aktueller Versioun,\n*(lescht) = Ënnerscheed mat der aler Versioun,\n*k = Kleng Ännerung.",
-       "history-fieldset-title": "An de Versioune sichen",
-       "history-show-deleted": "nëmmen déi geläscht",
+       "history-fieldset-title": "No Versioune sichen",
+       "history-show-deleted": "Nëmme geläscht Versiounen",
        "histfirst": "eelst",
        "histlast": "neist",
        "historysize": "({{PLURAL:$1|1 Byte|$1 Byten}})",
        "saveusergroups": "{{GENDER:$1|Benotzer}}gruppe späicheren",
        "userrights-groupsmember": "Member vun:",
        "userrights-groupsmember-auto": "Implizit Member vun:",
-       "userrights-groups-help": "Dir kënnt d'Gruppen zu deenen dëse Benotzer gehéiert änneren.\n* Een ugekräizt Haische bedeit, datt de Benotzer Member vun dëser Grupp ass.\n* Een net ugekräizt Haische bedeit, datt de Benotzer net Member vun dëser Grupp ass.\n* E Stäerchen (*) bedeit datt Dir d'Grupp net méi ewechhuele kënnt wann e bis eemol dobäigesat ass oder gouf.\n* Eng Raut (#) gëtt un Datt Dir d'Oflafzäit vun dëser Grupp just zrécksetze kënnt; Dir kënnt se net no vir setzen.",
+       "userrights-groups-help": "Dir kënnt d'Gruppen zu deenen dëse Benotzer gehéiert änneren.\n* Een ugekräizt Haische bedeit, datt de Benotzer Member vun dëser Grupp ass.\n* Een net ugekräizt Haische bedeit, datt de Benotzer net Member vun dëser Grupp ass.\n* E Stäerchen (*) bedeit datt Dir d'Grupp net méi ewechhuele kënnt wann e bis eemol dobäigesat ass oder gouf.\n* Eng Raut (#) gëtt un Datt Dir d'Oflafzäit als Member vun dëser Grupp just zrécksetze kënnt; Dir kënnt se net no vir setzen.",
        "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.",
        "rcfilters-search-placeholder": "Rezent Ännerunge filteren (duerchsichen oder ufänke mat tippen)",
        "rcfilters-invalid-filter": "Net valabele Filter",
        "rcfilters-filterlist-title": "Filteren",
+       "rcfilters-filterlist-whatsthis": "Wat ass dat?",
        "rcfilters-highlightbutton-title": "Resultater ervirhiewen",
        "rcfilters-highlightmenu-title": "Eng Faarf eraussichen",
        "rcfilters-filterlist-noresults": "Keng Filtere fonnt",
+       "rcfilters-noresults-conflict": "Näischt fonnt well d'Sichcritère sech widderspriechen",
        "rcfilters-filter-unregistered-description": "Auteuren déi net ageloggt sinn.",
        "rcfilters-filter-editsbyself-label": "Är eegen Ännerungen",
        "rcfilters-filter-editsbyself-description": "Ännerunge vun Iech.",
        "undeleteviewlink": "weisen",
        "undeleteinvert": "Auswiel ëmdréinen",
        "undeletecomment": "Grond:",
-       "undeletedrevisions": "$1 {{PLURAL:$1|Versioun gouf|$1 Versioune goufe}} restauréiert",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 Versioun|$1 Versiounen}} a(n) {{PLURAL:$2|1 Fichier|$2 Fichiere}} goufe restauréiert",
-       "undeletedfiles": "$1 {{PLURAL:$1|Fichier gouf|Fichiere goufe}} restauréiert",
        "cannotundelete": "E puer oder all d'Restauratiounen hunn net funktionéiert:\n$1",
        "undeletedpage": "'''$1''' gouf restauréiert.\n\nAm [[Special:Log/delete|Läsch-Logbuch]] fannt Dir déi geläscht a restauréiert Säiten.",
        "undelete-header": "Kuckt [[Special:Log/delete|Läschlescht]] fir rezent geläscht Säiten.",
        "newimages-summary": "Dës Spezialsäit weist eng Lëscht mat de Fichieren déi als lescht eropgeluede goufen.",
        "newimages-legend": "Filter",
        "newimages-label": "Numm vum Fichier (oder en Deel dovun):",
+       "newimages-user": "IP-Adress oder Benotzernumm",
        "newimages-showbots": "Vu Botten eropgeluede Fichiere weisen",
        "newimages-hidepatrolled": "Nogekuckt Fichiere verstoppen",
        "noimages": "Keng Biller fonnt.",
        "htmlform-user-not-valid": "<strong>$1</strong> ass kee valabele Benotzernumm.",
        "logentry-delete-delete": "$1 {{GENDER:$2|huet}} d'Säit $3 geläscht",
        "logentry-delete-delete_redir": "$1 huet d'Viruleedung $3 duerch Iwwerschreiwe {{GENDER:$2|geläscht}}.",
-       "logentry-delete-restore": "$1 {{GENDER:$2|huet}} d'Säit $3 restauréiert",
+       "logentry-delete-restore": "$1 {{GENDER:$2|huet}} d'Säit $3 ($4) restauréiert",
+       "logentry-delete-restore-nocount": "$1 {{GENDER:$2|huet}} d'Säit $3 restauréiert",
+       "restore-count-revisions": "{{PLURAL:$1|1 Versioun|$1 Versiounen}}",
+       "restore-count-files": "{{PLURAL: $1|1 Fichier|$1 Fichieren}}",
        "logentry-delete-event": "$1 huet d'Visibilitéit vun {{PLURAL:$5|engem Evenement|$5 Evenementer}} am Logbuch op $3:$4 {{GENDER:$2|geännert}}",
        "logentry-delete-revision": "$1 huet d'Visibilitéit {{PLURAL:$5|vun enger Versioun|vu(n) $5 Versiounen}} op der Säit $3:$4 {{GENDER:$2|geännert}}",
        "logentry-delete-event-legacy": "$1 huet d'Visibilitéit vun Elementer am Log op $3 {{GENDER:$2|geännert}}",
        "special-characters-group-thai": "Thai",
        "special-characters-group-lao": "Lao",
        "special-characters-group-khmer": "Khmer",
+       "special-characters-group-canadianaboriginal": "Kanadesch Silbeschrëft",
        "special-characters-title-endash": "en dash",
        "special-characters-title-emdash": "em dash",
        "special-characters-title-minus": "Minus-Zeechen",
        "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:",
-       "revid": "Versioun $1"
+       "revid": "Versioun $1",
+       "gotointerwiki": "{{SITENAME}} verloossen",
+       "gotointerwiki-invalid": "De spezifizéierten Titel war net valabel.",
+       "undelete-cantedit": "Dir kënnt dës Säit net restauréiere well Dir dës Säit net änneren däerft.",
+       "undelete-cantcreate": "Dir kënnt dës Säit net restauréieren well et elo keng Säit mat deem Numm gëtt a well Dir dës Säit net uleeën däerft."
 }
index 195699d..08bff71 100644 (file)
@@ -35,7 +35,8 @@
                        "Macofe",
                        "Zygimantus",
                        "Matma Rex",
-                       "Nemo bis"
+                       "Nemo bis",
+                       "Nersip"
                ]
        },
        "tog-underline": "Nuorodos pabraukimas:",
        "login": "Prisijungti",
        "login-security": "Patvirtinkite savo tapatybę",
        "nav-login-createaccount": "Prisijungti / sukurti paskyrą",
-       "userlogin": "Prisijungti / sukurti paskyrą",
-       "userloginnocreate": "Prisijungti",
        "logout": "Atsijungti",
        "userlogout": "Atsijungti",
        "notloggedin": "Neprisijungęs",
        "userlogin-noaccount": "Neturite paskyros?",
        "userlogin-joinproject": "Prisijungti prie {{SITENAME}}",
-       "nologin": "Neturite prisijungimo vardo? '''$1'''.",
-       "nologinlink": "Sukurkite paskyrą",
        "createaccount": "Sukurti paskyrą",
-       "gotaccount": "Jau turite paskyrą? '''$1'''.",
-       "gotaccountlink": "Prisijunkite",
-       "userlogin-resetlink": "Pamiršote savo prisijungimo duomenis?",
        "userlogin-resetpassword-link": "Pamiršote savo slaptažodį?",
        "userlogin-helplink2": "Padėti prisijungti",
        "userlogin-loggedin": "Jūs jau prisijungęs kaip {{GENDER:$1|$1}}.\nNaudokite žemiau pateiktą pavidalą, kad prisijungtumėte kaip kitas naudotojas.",
        "createaccountmail": "Naudokite laikiną atsitiktinį slaptažodį ir nusiųskite jį į elektroninį paštą, nurodytą žemiau.",
        "createaccountmail-help": "Gali būti naudojamas paskyros sukūrimui kitam asmeniui, neatskleidžiant slaptažodžio.",
        "createacct-realname": "Vardas (neprivaloma)",
-       "createaccountreason": "Priežastis:",
        "createacct-reason": "Priežastis",
        "createacct-reason-ph": "Kodėl kuriate kitą paskyrą",
        "createacct-reason-help": "Pranešimas rodomas paskyros sukūrimo žurnale",
        "watchthis": "Stebėti šį puslapį",
        "savearticle": "Išsaugoti puslapį",
        "savechanges": "Išsaugoti pakeitimus",
-       "publishpage": "Skelbti puslapį",
-       "publishchanges": "Skelbti pakeitimus",
+       "publishpage": "Išsaugoti puslapį",
+       "publishchanges": "Išsaugoti pakeitimus",
        "preview": "Peržiūra",
        "showpreview": "Rodyti peržiūrą",
        "showdiff": "Rodyti skirtumus",
        "contentmodelediterror": "Jūs negalite redaguoti šios versijos, nes jos turinio modelis yra <code>$1</code>, kuris skiriasi nuo dabartinio puslapio turinio modelio, kuris yra <code>$2</code>.",
        "recreate-moveddeleted-warn": "'''Dėmesio: Jūs atkuriate puslapį, kuris anksčiau buvo ištrintas.'''\n\nTurėtumėte nuspręsti, ar reikėtų toliau redaguoti šį puslapį.\nJūsų patogumui čia pateikiamas šio puslapio šalinimų ir perkėlimų sąrašas:",
        "moveddeleted-notice": "Šis puslapis buvo ištrintas.\nŽemiau pateikiamas puslapio šalinimų ir pervadinimų sąrašas.",
-       "moveddeleted-notice-recent": "Atsiprašome, šis puslapis nesenai buvo ištrintas (per pastarąsias 24 valandas). Puslapio ištrynimo ir perkėlimo istorija yra pateikiama žemiau kaip nuoroda.",
+       "moveddeleted-notice-recent": "Atsiprašome, šis puslapis neseniai buvo ištrintas (per pastarąsias 24 valandas). Žemiau pateikiama detali puslapio ištrynimo ir perkėlimo istorija.",
        "log-fulllog": "Rodyti visą istoriją",
        "edit-hook-aborted": "Keitimas nutrauktas užlūžimo.\nTam nėra paaiškinimo.",
        "edit-gone-missing": "Negalima atnaujinti puslapio.\nGreičiausiai jis yra ištrintas.",
        "rcfilters-clear-all-filters": "Valyti visus filtrus",
        "rcfilters-invalid-filter": "Negalimas filtras",
        "rcfilters-filterlist-title": "Filtrai",
-       "rcfilters-highlightmenu-title": "Pasirinkti spalvą",
+       "rcfilters-filterlist-whatsthis": "Kas tai?",
+       "rcfilters-highlightmenu-title": "Pasirinkite spalvą",
        "rcfilters-filterlist-noresults": "Nerastas toks filtras",
        "rcfilters-filtergroup-registration": "Vartotojo registracija",
        "rcfilters-filter-registered-label": "Registruoti",
        "rcfilters-filter-unregistered-label": "Neregistruoti",
+       "rcfilters-filter-unregistered-description": "Redaktoriai, kurie nėra prisijungę.",
        "rcfilters-filter-editsbyself-label": "Jūsų keitimai",
        "rcfilters-filter-editsbyself-description": "Jūsų keitimai.",
        "rcfilters-filter-editsbyother-label": "Kitų keitimai",
        "rcfilters-filter-editsbyother-description": "Kaitimai sukurti kitų vartotojų (ne jūsų).",
        "rcfilters-filtergroup-userExpLevel": "Patirties lygis (tik registruotiems vartotojams)",
-       "rcfilters-filter-userExpLevel-newcomer-label": "Naujokai",
-       "rcfilters-filter-userExpLevel-learner-label": "Mokiniai",
-       "rcfilters-filter-userExpLevel-experienced-label": "Patyrę vartotojai",
-       "rcfilters-filter-userExpLevel-experienced-description": "Daugiau nei 30 dienų veiklos ir 500 keitimų.",
+       "rcfilters-filter-user-experience-level-newcomer-label": "Naujokai",
+       "rcfilters-filter-user-experience-level-learner-label": "Mokiniai",
+       "rcfilters-filter-user-experience-level-experienced-label": "Patyrę vartotojai",
+       "rcfilters-filter-user-experience-level-experienced-description": "Daugiau nei 30 dienų veiklos ir 500 keitimų.",
        "rcfilters-filter-bots-label": "Robotas",
        "rcfilters-filter-bots-description": "Keitimai, atlikti automatinių įrankių.",
        "rcfilters-filter-humans-label": "Žmogaus (ne roboto)",
        "rcfilters-filter-humans-description": "Keitimai atlikti žmonių.",
+       "rcfilters-filtergroup-reviewstatus": "Peržiūrėti statusą",
        "rcfilters-filtergroup-significance": "Reikšmė",
        "rcfilters-filter-minor-label": "Smulkūs pakeitimai",
        "rcfilters-filter-minor-description": "Keitimai, kuriuos autorius pažymėjo kaip mažus.",
        "undeleteviewlink": "žiūrėti",
        "undeleteinvert": "Žymėti priešingai",
        "undeletecomment": "Priežastis:",
-       "undeletedrevisions": "{{PLURAL:$1|atkurta $1 versija|atkurtos $1 versijos|atkurta $1 versijų}}",
-       "undeletedrevisions-files": "{{PLURAL:$1|atkurta $1 versija|atkurtos $1 versijos|atkurta $1 versijų}} ir $2 {{PLURAL:$2|failas|failai|failų}}",
-       "undeletedfiles": "{{PLURAL:$1|atkurtas $1 failas|atkurti $1 failai|atkurta $1 failų}}",
        "cannotundelete": "Visi arba kai kurie atkūrimai nepavyko:\n$1",
        "undeletedpage": "'''$1 buvo atkurtas'''\n\nPeržiūrėkite [[Special:Log/delete|trynimų sąrašą]], norėdami rasti paskutinių trynimų ir atkūrimų sąrašą.",
        "undelete-header": "Kad sužinotumėte, kurie puslapiai paskiausiai ištrinti, žiūrėkite [[Special:Log/delete|šalinimų sąrašą]].",
        "newimages-summary": "Šis specialus puslapis rodo paskiausiai įkeltus failus.",
        "newimages-legend": "Filtras",
        "newimages-label": "Failo vardas (ar jo dalis):",
+       "newimages-user": "IP adresas ar vartotojo vardas",
        "newimages-showbots": "Rodyti robotų atliktus įkėlimus",
        "newimages-hidepatrolled": "Paslėpti patruliuotus įkeltus failus",
        "noimages": "Nėra ką parodyti.",
        "htmlform-user-not-valid": "<strong>$1</strong> nėra tinkamas naudotojo vardas.",
        "logentry-delete-delete": "$1 {{GENDER:$2|ištrynė}} puslapį $3",
        "logentry-delete-delete_redir": "$1 pervadindamas {{GENDER:$2|ištrynė}} buvusį nukreipimą $3",
-       "logentry-delete-restore": "$1 {{GENDER:$2|atkūrė}} puslapį $3",
+       "logentry-delete-restore": "$1 atkūrė puslapį $3 ($4)",
+       "logentry-delete-restore-nocount": "$1 atkūrė puslapį $3",
+       "restore-count-files": "{{PLURAL:$1|1 failas|$1 failai}}",
        "logentry-delete-event": "$1 {{GENDER:$2|pakeitė}} matomumą {{PLURAL:$5|žurnalo įvykio|$5 žurnalo įvykių}} $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|pakeitė}} matomumą {{PLURAL:$5|versijos|$5 versijų}} puslapyje $3: $4",
        "logentry-delete-event-legacy": "$1 {{GENDER:$2|pakeitė}} matomumą žurnalo renginiams $3",
        "logentry-tag-update-revision": "$1 {{GENDER:$2|atnaujino}} žymes $3 puslapio versijoje $4, ({{PLURAL:$7|pridėjo}} $6; {{PLURAL:$9|pašalino}} $8)",
        "logentry-tag-update-logentry": "$1 {{GENDER:$2|atnaujino}} žymes $3 puslapio žurnalo įraše $5 ({{PLURAL:$7|pridėtas}} $6; {{PLURAL:$9|pašalintas}} $8)",
        "rightsnone": "(jokių)",
-       "revdelete-summary": "keitimo paaiškinimas",
        "rightslogentry-temporary-group": "$1 (laikinai, iki $2)",
        "feedback-adding": "Pridedamas atsiliepimas į puslapį ...",
        "feedback-back": "Atgal",
        "unlinkaccounts": "Atsieti paskyras",
        "unlinkaccounts-success": "Paskyra buvo atsieta.",
        "revid": "apžvalga $1",
-       "pageid": "puslapio ID $1"
+       "pageid": "puslapio ID $1",
+       "rawhtml-notallowed": "&lt;html&gt; negali būti naudojamos ne normaliuose puslapiuose.",
+       "gotointerwiki": "Išeinama iš {{SITENAME}}",
+       "gotointerwiki-invalid": "Nurodytas pavadinimas negalimas."
 }
index fe20055..b339dcc 100644 (file)
        "readonlytext": "Basis data agi dikonci sekang inputan anyar lan modifikasi liyane, ndeyane agi ana perawatan basis data, seuwise kuwe toli bakal mbalik normal maning.\n\nAdministrator sing ngunci kiye aweh katerangan kaya kiye: $1",
        "missing-article": "Basis data ora teyeng nemokna teks paca sing kudune ana, yaiku \"$1\" $2.\n\nKiye biasanye jalaran pranala daluwarsa maring revisi sedurunge sekang kaca sing wis dibusak.\n\nAngger dudu kuwe sebabe, Rika ndeyan nemokna \"bug\" nang software. \nMonggo dilaporna maring [[Special:ListUsers/sysop|administrator]], karo nyebutna URL sing dituju.\n\nA",
        "missingarticle-rev": "(révisi#: $1)",
-       "missingarticle-diff": "(Béda: $1, $2)",
+       "missingarticle-diff": "(Beda: $1, $2)",
        "readonly_lag": "Basis data uwis dikunci otomatis sawetara basis data sekunder lagi nglakokna sinkronisasi karo basis data utama",
        "internalerror": "Kasalahan internal",
        "internalerror_info": "Kasalahan internal: $1",
        "externaldberror": "Ana kesalahan otentikasi basis data utawa Rika ora olih nglakokna pemutakhiran maring akun eksternale Rika.",
        "login": "Melebu",
        "nav-login-createaccount": "Mlebu / gawe kaca anggota (akun)",
-       "userlogin": "Melebu / gawe kaca anggota (account)",
-       "userloginnocreate": "Mlebu log",
        "logout": "Metu Log",
        "userlogout": "Metu Log",
        "notloggedin": "Durung mlebu log",
        "userlogin-noaccount": "Durung duwe akun?",
        "userlogin-joinproject": "Melu {{SITENAME}}",
-       "nologin": "Durung duwe akun? $1.",
-       "nologinlink": "Gawe akun anyar",
        "createaccount": "Gawe akun anyar",
-       "gotaccount": "Wis duwe akun? $1.",
-       "gotaccountlink": "Mlebu log",
-       "userlogin-resetlink": "Apa Rika kelalen info detil nggo mlebune?",
        "userlogin-resetpassword-link": "Rika kelalen tembung sandhine?",
        "userlogin-helplink2": "Pitulung mlebu log",
        "userlogin-loggedin": "Rika uwis mlebu log nganggo jeneng {{GENDER:$1|$1}}.\nGunakna formulir nang ngisor kiye kanggo mlebu log dadi pangganggo sejen.",
        "createacct-another-email-ph": "Lebokna alamat imel",
        "createaccountmail": "Gunakna tembung sandhi acak sementara lan kirimna maring alamat imel",
        "createacct-realname": "Jeneng asli (ora kudu)",
-       "createaccountreason": "Alesan:",
        "createacct-reason": "Alesan",
        "createacct-reason-ph": "Kenangapa Rika nggawe akun sejen",
        "createacct-submit": "Gawe akune Rika",
        "passwordreset-emaildisabled": "Fitur imel wis dinonaktifna nang wiki kiye.",
        "passwordreset-username": "Jeneng panganggo:",
        "passwordreset-domain": "Domain:",
-       "passwordreset-capture": "Deleng imel hasile?",
-       "passwordreset-capture-help": "Angger Rika nyonteng kotak kiye, imel (sing isi tembung sandhi sauntara) bakal ditidokna maring Rika barengan karo dikirimna maring panganggo.",
        "passwordreset-email": "Alamat imel:",
        "passwordreset-emailtitle": "Detil akun nang {{SITENAME}}",
        "passwordreset-emailelement": "Jeneng panganggo: \n$1\n\nTembung sandhi sauntara: \n$2",
        "template-protected": "(direksa)",
        "template-semiprotected": "(semi-pangreksan)",
        "hiddencategories": "Kaca kiye kuwe anggota sekang {{PLURAL:$1|1 kategori sing diumpetna|$1 kategori-kategori sing diumpetna}}:",
-       "nocreatetext": "{{SITENAME}} wis mbatesi panggawean kaca anyar.\nRika teyeng mbalik lan nyunting kaca sing wis ana, utawa [[Special:UserLogin|mlebu utawa gawe akun]]",
+       "nocreatetext": "{{SITENAME}} wis mbatesi panggawean kaca anyar.\nRika teyeng mbalik lan nyunting kaca sing wis ana, utawa [[Special:UserLogin|mlebu]] utawa [[Special:CreateAccount|gawe akun]]",
        "nocreate-loggedin": "Rika ora duwe hak akses nggo gawe kaca anyar.",
        "sectioneditnotsupported-title": "Panyuntingan bagiya ora didukung",
        "permissionserrorstext-withaction": "Rika ora duwé hak aksès kanggo $2, jalaran {{PLURAL:$1|alesan|alesan}} nang ngisor kiye:",
        "saveprefs": "Simpen",
        "restoreprefs": "Balekna kabeh setelan gawane (nang kabeh bagiyan)",
        "prefs-editing": "Panyuntingan",
-       "rows": "Baris:",
        "searchresultshead": "Goleti",
        "stub-threshold": "Ambang wates kanggo format <a href=\"#\" class=\"stub\">pranala rintisan</a> (bita):",
        "stub-threshold-disabled": "Dinonaktifna",
        "userrights-reason": "Alesan:",
        "userrights-no-interwiki": "Rika ora duwe hak kanggo ngowahi hak panganggo nang wiki liyane.",
        "userrights-nodatabase": "Basis data $1 ora ana utawa ora lokal.",
-       "userrights-nologin": "Rika kudu [[Special:UserLogin|mlebu log]] nganggo akun pangurus ben teyeng ngowahi hak panganggo.",
-       "userrights-notallowed": "Akune Rika ora duwe hak kanggo nambah utawa ngilangna hak panganggo.",
        "userrights-changeable-col": "Grup sing teyeng Rika owahi",
        "userrights-unchangeable-col": "Grup sing ora teyeng Rika owahi",
        "group": "Grup:",
        "statistics-pages": "Kaca",
        "statistics-pages-desc": "Kabeh kaca nang wiki kiye, klebu kaca dhiskusi, pangalihan, lan liya-liyané.",
        "statistics-files": "Berkas sing diunggahna",
-       "statistics-edits": "Jumlah suntingan wiwit {{SITENAME}} dimolai",
+       "statistics-edits": "Jumlah suntingan sapet {{SITENAME}} dimolai",
        "statistics-edits-average": "Rata-rata suntingan saben kaca",
        "statistics-users": "Jumlah [[Special:ListUsers|panganggo sing kedaftar]]",
        "statistics-users-active": "Jumlah panganggo aktif",
        "cantrollback": "Ora teyeng mbatalna suntingan;\nkontributor pungkasane kuwe siji-sijine sing nulis artikel kiye.",
        "alreadyrolled": "Ora teyeng mbalekna suntingan pungkasan [[:$1]] sekang [[User:$2|$2]] ([[User talk:$2|talk]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);\nwis ana wong sejen sing nyunting utawa mbalekna artikel kuwe.\n\nSuntingan pungkasan kaca kiye digawe nang [[User:$3|$3]] ([[User talk:$3|talk]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Ringkesan suntingan yakuwe: <em>$1</em>.",
-       "revertpage": "Suntingane [[Special:Contributions/$2|$2]] ([[User talk:$2|dhiskusi]]) dibalekna maring vèrsi pungkasan sekang [[User:$1|$1]]",
+       "revertpage": "Suntingane [[Special:Contributions/$2|$2]] ([[User talk:$2|dhiskusi]]) dibalekna maring versi pungkasan sekang [[User:$1|$1]]",
        "revertpage-nouser": "Mbalekna suntingan sekang (jeneng panganggo dibusek) ming revisi pungkasan sekang [[User:$1|$1]]",
        "rollback-success": "Mbalekna suntingane $1;\ndibalekna ming revisi pungkasan sekang $2.",
        "rollback-success-notify": "Mbalekna besutan sekang $1; owah mbalik nggo revisi mburi sekang $2. [$3 Deleng owahane]",
        "exif-lightsource-17": "Cahya standar A",
        "exif-lightsource-18": "Cahya standar B",
        "exif-lightsource-19": "Cahya standar C",
-       "namespacesall": "kabèh",
+       "namespacesall": "kabeh",
        "monthsall": "kabèh",
        "watchlisttools-view": "Tidokna owahan sing ana gandhèngané",
        "watchlisttools-edit": "Tidokna lan sunting daftar pangawasan",
index dfe50d3..31b5304 100644 (file)
        "title-invalid-interwiki": "Ahitana rohy interwiki tsy azo ampiasaina amin'ny lohateny ny pejy angatahana.",
        "title-invalid-talk-namespace": "Mampatsiahy pejin-dresaka tsy misy ilay pejy angatahana.",
        "title-invalid-characters": "Ahitana soratra tsy azo ekena ny lohatenim-pejy angatahana: \"$1\".",
+       "title-invalid-relative": "Manana lalana tsy mahaleotena ilay lohateny. Tsy manan-kery ny lohatenim-pejy misy mamana tsy mahaleotena (./, ../) satria tsy ho takatra izy ireo rehefa amin'ny mpitetin'ny mpampiasa sasany.",
+       "title-invalid-magic-tilde": "Ahitana filaharana majika tsy azo raisina ny lohatenim-pejy angatahana (<nowiki>~~~</nowiki>).",
+       "title-invalid-too-long": "Lava loatra ny lohatenim-pejy angatahana. Tsy mahazo ho lava noho $1 $1{{PLURAL:$1|}} ôktety ilay izy amin'ny fikaodiana UTF-8.",
+       "title-invalid-leading-colon": "Ahitana teboka roa tsy azo raisina ny lohatenim-pejy angatahana.",
        "perfcached": "Ao amin'ny voatakona ireo data manaraka ireo ary mety tsy voavao. $1{{PLURAL:}} ihany no isan'ireo zavatra voatahiry ao amin'ny voatakona",
        "perfcachedts": "Ao amin'ny voatakona (cache) ny data aseho, ary tamin'ny $1 izy no navaozina farany. $4{{PLURAL:}} no isan'ny valim-pikarohana ao amin'ilay voatakona.",
        "querypage-no-updates": "Amin'izao fotoana izao dia tsy havaozina ny votoatin'ity pejy ity. Noho izany dia tsy mitaratra ny tena zava-misy ny votoatiny ato.",
        "grant-group-high-volume": "Manao zavatra haingana",
        "grant-group-customization": "Fikirakirana ary safidy",
        "grant-group-administration": "Hanao asam-pandrindrana",
+       "grant-group-private-information": "Hijery ny angona tsy sarababembahoaka momba anao",
        "grant-group-other": "Manao hetsika maro samihafa",
        "grant-blockusers": "Manakana sy manala sakan'ny mpikambana",
        "grant-createaccount": "Hamorona kaonty",
        "rcfilters-invalid-filter": "Sivana tsy azo raisina",
        "rcfilters-empty-filter": "Tsy misy sivana miasa. Aseho avokoa ireo fandraisan'anjara.",
        "rcfilters-filterlist-title": "Sivana",
+       "rcfilters-filterlist-whatsthis": "Inona ity?",
        "rcfilters-filterlist-feedbacklink": "Mamoaka hevitra mikasika ny sivana vaovao (beta)",
        "rcfilters-highlightbutton-title": "Hampibaribary ny valiny",
        "rcfilters-highlightmenu-title": "Hisafidy loko",
        "rcfilters-highlightmenu-help": "Misafidy loko hampanabaribariana ilay tondro",
        "rcfilters-filterlist-noresults": "Tsy nahitana sivana",
+       "rcfilters-noresults-conflict": "Tsy nahitana valiny satria tsy mifanaraka ny mason-tsivana",
        "rcfilters-filtergroup-registration": "Fisoratan'ny mpikambana",
        "rcfilters-filter-registered-label": "Nisoratra anarana",
        "rcfilters-filter-registered-description": "Mpanova tafiditra.",
        "rcfilters-filter-bots-description": "Fiovana nataon'ny rôbô aotômatika.",
        "rcfilters-filter-humans-label": "Olona (tsy rôbô)",
        "rcfilters-filter-humans-description": "Fiovana nataon'ny olombelona mpikambana.",
+       "rcfilters-filter-patrolled-label": "Voatsidika",
+       "rcfilters-filter-patrolled-description": "Fiovana nomarihana ho voatsidika.",
+       "rcfilters-filter-unpatrolled-label": "Tsy mbola voatsidika",
+       "rcfilters-filter-unpatrolled-description": "Fiovana tsy voamarika ho voatsidika.",
        "rcfilters-filtergroup-significance": "Dikany",
        "rcfilters-filter-minor-label": "Fiovana madinika",
        "rcfilters-filter-minor-description": "Fiovana nataon'ny tompony ho madinika.",
        "uploaddisabledtext": "Tsy afaka andefasana rakitra aloha eto amin'ity wiki ity.",
        "php-uploaddisabledtext": "Ny fampidiran-drakitra dia tsy ampiasaina amin'ny PHP.\nMarino ny option configuration file_uploads.",
        "uploadscripted": "\nMisy kialo HTML na fango script mety tsy ho hain'ny navigateur sasany haseho ity rakitra ity.",
+       "uploaded-script-svg": "Zavatra azo atao ho azy \"$1\" ao amin'ny rakitra SVG nampiakarina.",
+       "uploaded-hostile-svg": "Nahitana CSS tsy azo antoka ao amin'ny zava-pisehoan'ny rakitra SVG nampiakarina.",
        "uploadscriptednamespace": "ahitana valan'anarana \"<nowiki>$1</nowiki>\" ny rakitra SVG.",
        "uploadinvalidxml": "Tsy afaka vakiana ny XML tao anatin'ilay rakitra nafaranao.",
        "uploadvirus": "Misy viriosy io rakitra io! Toy izao ny antsipirihany: $1",
        "uploadstash-badtoken": "Tsy navokatra ny fampandefasana ilay tao, mety efa lany daty angamba ny fampahalalam-pamantarana anao.\nAvereno fanindroany.",
        "uploadstash-errclear": "Tsy navokatra ny famafana rakitra.",
        "uploadstash-refresh": "Vaozina ny lisi-drakitra",
+       "uploadstash-thumbnail": "haneho sarikely",
        "img-auth-accessdenied": "Tsy afa-mankao",
        "img-auth-nopathinfo": "Tsy misy PATH_INFO.\nTsy voaparametatra ny lohamilinao hampita io fampahalalàna io.\nMety mampiasa CGI angamba ilay lohamilina ka tsy mahazaka an'i img_auth\nVangio ny https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "img-auth-notindir": "Ny lalana nangatahana dia tsy ny petra-drakitra nokaonfigiorena.",
        "apisandbox-submit": "Hanao hataka",
        "apisandbox-reset": "Diovina",
        "apisandbox-retry": "Andramana indray",
+       "apisandbox-no-parameters": "Tsy manana parametatra ity module API ity.",
        "apisandbox-helpurls": "Rohim-panoroana",
        "apisandbox-examples": "Ohatra",
        "apisandbox-dynamic-parameters": "Parametatra miampy",
        "apisandbox-sending-request": "Mandefa hataka API...",
        "apisandbox-loading-results": "Mandray valiny API...",
        "apisandbox-results-error": "Nisy hadisoana tamin'ny fakàna ny valin-kataka API: $1.",
+       "apisandbox-request-format-url-label": "Tohin-tsora-kataka URL",
        "apisandbox-request-url-label": "Hataka URL:",
+       "apisandbox-request-json-label": "Hangataka JSON:",
        "apisandbox-request-time": "Fotoana nangatahana{{PLURAL:$1|$1 ms}}",
        "apisandbox-results-fixtoken": "Ahitsio ny token ary alefaso indray",
        "apisandbox-results-fixtoken-fail": "Tsy afaka naka ny token \"$1\".",
        "apisandbox-alert-page": "Tsy ekena ny votoatin'ny saha ato amin'ity pejy ity.",
+       "apisandbox-alert-field": "Tsy azo raisina ny sandan'ity saha ity.",
+       "apisandbox-continue": "Tohizana",
+       "apisandbox-continue-clear": "Diovina",
+       "apisandbox-multivalue-all-namespaces": "$1 (anaran-tsehatra rehetra)",
+       "apisandbox-multivalue-all-values": "$1 (sanda rehetra)",
        "booksources": "boky tsiahy",
        "booksources-search-legend": "hikaroka anatin'ny boky todika",
        "booksources-search": "Fikarohana",
        "booksources-text": "Ity misy lisitra maneho ny rohy makany amin'ny sehatra mivarotra boky vaovao sy efa vaky ary mety ahitanao fampahalalàna momba ny boky sy soratra notadiavinao :",
        "booksources-invalid-isbn": "Ny ISBN nomena dia mety diso ; marino raha diso ianao teo am-pandikanana ny loharano fotony.",
+       "magiclink-tracking-rfc": "Pejy mampiasa rohy majika RFC",
        "specialloguserlabel": "Mpikambana nanao :",
        "speciallogtitlelabel": "Tanjona (lohateny na mpikambana) :",
        "log": "Tatitr’asa",
        "changecontentmodel-reason-label": "Antony :",
        "changecontentmodel-submit": "Ovaina",
        "changecontentmodel-success-title": "Niova ny môdelim-botoatiny",
+       "changecontentmodel-emptymodels-title": "Tsy nahitana môdelim-botoatiny azo ampiasaina",
+       "changecontentmodel-emptymodels-text": "Tsy afaka avadika ho karazana na inona na inona [[:$1]].",
+       "log-name-contentmodel": "Laogim-panovana môdelim-botoatiny",
        "logentry-contentmodel-change-revertlink": "mamerina",
        "logentry-contentmodel-change-revert": "mamerina",
        "protectlogpage": "Laogim-piarovana",
        "undeleteviewlink": "hijery",
        "undeleteinvert": "Hampifamaidika ny safidy",
        "undeletecomment": "Antony :",
-       "undeletedrevisions": "voaverina ny {{PLURAL:$1|fanovana|fanovana}} $1",
-       "undeletedfiles": "rakitra voaverina $1 {{PLURAL:$1}}",
        "cannotundelete": "Tsy nandeha soa aman-tsara ilay famerenana ;\nefa nisy mpikambana iray hafa angamba no namerina ilay pejy.",
        "undeletedpage": "'''Voaverina ny pejy $1.'''\n\nVakio ny [[Special:Log/delete|laogim-pamafana]] ho an'ny lisitry ny famafana sy ny famerenana pejy.",
        "undelete-header": "Jereo ny [[Special:Log/delete|laogim-pamafana]] rehefa hanalisitra ny pejy vao voafafa.",
        "sp-contributions-username": "Adiresy IP na anaram-pikambana :",
        "sp-contributions-toponly": "Fiovana izay farany ihany no aseho",
        "sp-contributions-newonly": "Fiovana izay namorom-pejy ihany no aseho",
+       "sp-contributions-hideminor": "Hanafina fiovana kely",
        "sp-contributions-submit": "Hikaroka",
        "whatlinkshere": "Pejy mirohy eto",
        "whatlinkshere-title": "Pejy mirohy any amin'i « $1 »",
        "ipb-unblock": "Hanala ny sakan'ny mpikambana na adiresy IP",
        "ipb-blocklist": "Hijery ny sakana efa misy",
        "ipb-blocklist-contribs": "Fandraisan'anjaran'i $1",
+       "ipb-blocklist-duration-left": "$1 sisa",
        "unblockip": "Esory ny sakana amin'io mpikambana io",
        "unblockiptext": "\nAmpiasao ity fisy eto ambany ity hanalana ny sakana\nmihatra amin'ny adiresy IP na solonanarana iray.",
        "ipusubmit": "Esory ny sakana",
        "tooltip-ca-nstab-category": "Hijery ny pejin'ilay sokajy",
        "tooltip-minoredit": "Mariho ho fanovana madinika ihany",
        "tooltip-save": "Tehirizo ny fanovana",
+       "tooltip-publish": "Hamoaka ny fiovana",
        "tooltip-preview": "Topazy maso ny fanovana nataonao, iangaviana ianao mba hijery tsipalotra mialoha ny fitahirizana ny fanovana!",
        "tooltip-diff": "Asehoy izay novainao tamin'ny lahatsoratra.",
        "tooltip-compareselectedversions": "Jereo ny fahasamihafana amin'ireo votoatin'ny pejy anankiroa ireo.",
        "patrol-log-page": "Laogin'ny fanovana voamarina",
        "patrol-log-header": "Ity dia laogy mikasikan'ny fanovana voamarina.",
        "log-show-hide-patrol": "$1 ny laogy mikasikan'ny versiona voamarina",
+       "log-show-hide-tag": "$1 laogim-balizy",
        "confirm-markpatrolled-button": "OK",
        "deletedrevision": "Fanovana an'i $1 taloha voafafa.",
        "filedeleteerror-short": "Tsi-fetezana teo am-pamafàna ilay rakitra : $1",
        "exif-flash-redeye-1": "Fanoherana ny fisiana maso mena",
        "exif-focalplaneresolutionunit-2": "Posy",
        "exif-sensingmethod-1": "Tsy voafaritra",
+       "exif-scenecapturetype-0": "Ara-penitra",
+       "exif-scenecapturetype-1": "Mandry",
+       "exif-scenecapturetype-2": "Mitsangana",
+       "exif-scenecapturetype-3": "Alina",
        "exif-gaincontrol-0": "Tsy misy",
        "exif-gaincontrol-1": "Fahazoana miabo kely",
        "exif-gaincontrol-2": "Fitomboana miabo be",
        "exif-saturation-2": "Ambony",
        "exif-sharpness-0": "Tsotra",
        "exif-sharpness-1": "Malefaka",
+       "exif-sharpness-2": "Mahery",
        "exif-subjectdistancerange-0": "Tsy fantatra",
        "exif-subjectdistancerange-1": "Makrô",
        "exif-subjectdistancerange-2": "Fijerena akaiky",
        "exif-gpslatitude-s": "Atsimo",
        "exif-gpslongitude-e": "Atsinanana",
        "exif-gpslongitude-w": "Andrefana",
+       "exif-gpsaltitude-above-sealevel": "$1 {{PLURAL:$1|}}metatra eo ambonin'ny lentan'ny ranomasina",
+       "exif-gpsaltitude-below-sealevel": "$1 metatra{{PLURAL:$1|}} eo ambanin'ny lentan-dranomasina",
        "exif-gpsstatus-a": "Am-pandrefesana",
        "exif-gpsmeasuremode-2": "Fandrefesana 2D",
        "exif-gpsmeasuremode-3": "Fandrefesana 3D",
        "exif-objectcycle-b": "Sady maraina no hariva",
        "exif-gpsdirection-t": "Tena avaratra",
        "exif-gpsdirection-m": "Avaratra arak'andriamby",
+       "exif-ycbcrpositioning-1": "Miafovoany",
+       "exif-ycbcrpositioning-2": "Co-sited",
        "exif-dc-contributor": "Mpandray anjara",
        "exif-dc-date": "Daty",
        "exif-dc-publisher": "Mpamoaka",
+       "exif-dc-relation": "Media misy ifandraisana",
        "exif-dc-rights": "Zo",
        "exif-dc-source": "Haino aman-jery niaviana",
        "exif-dc-type": "Karazana baino aman-jery",
        "confirm-watch-top": "Hanaraka ity pejy ity?",
        "confirm-unwatch-button": "OK",
        "confirm-unwatch-top": "Hanala ity pejy ity amin'ny lisitry ny pejy arahinao?",
+       "confirm-rollback-button": "OK",
+       "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← pejy nialoha",
        "imgmultipagenext": "pejy manaraka →",
        "imgmultigo": "Andao !",
        "imgmultigoto": "Handeha any amin'ny pejy $1",
        "img-lang-default": "(fiteny tsipalotra)",
+       "img-lang-info": "Haneho ity sary ity ho $1. $2",
        "img-lang-go": "Alefa",
        "ascending_abbrev": "mihak.",
        "descending_abbrev": "mihid.",
        "autosumm-replace": "Votoatiny novaina ho « $1 »",
        "autoredircomment": "Pejy fihodinana mankany [[$1]]",
        "autosumm-new": "Pejy voaforona amin'ny « $1 »",
+       "autosumm-newblank": "Namorona pejy fotsy",
        "lag-warn-normal": "Ny fanovana vaovao nohon'ny $1 segondra {{PLURAL:}} dia tsy hiseho eo amin'ity lisitra ity.",
        "lag-warn-high": "Noho ny hataraiky ny lohamilin'ny banky angona, tsy hiseho eto ny fanovana natao tao anatin'ny fotoana latsaky ny $1 segondra{{PLURAL:}}.",
        "watchlistedit-normal-title": "Hanova ny lisitra ny pejy arahako maso",
        "watchlistedit-raw-titles": "Lohateny :",
        "watchlistedit-raw-submit": "Havaozina ny lisitra",
        "watchlistedit-raw-done": "Voavao ny lisitrao.",
+       "watchlistedit-clear-title": "Handio ny lisitra arahanao",
+       "watchlistedit-clear-legend": "Handio ny lisitra arahanao",
+       "watchlistedit-clear-explain": "Ho esorina amin'ny lisitry ny pejy arahanao ny lohateny rehetra",
+       "watchlistedit-clear-titles": "Lohateny:",
        "watchlisttools-view": "pejy arahako maso",
        "watchlisttools-edit": "Jereo sy ovao ny lisitra ny pejy fanaraha-maso",
        "watchlisttools-raw": "Ovay ilay pejy arahako maso amizao",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|resaka]])",
+       "timezone-local": "An-toerana",
        "duplicate-defaultsort": "'''Tandremo''' : manitsaka ny sort key taloha \"$1\" ilay sort key ankehitriny \"$2\".",
        "version": "Versiona",
        "version-extensions": "Fanitarana nampidirina",
        "version-other": "Samihafa",
        "version-hook-subscribedby": "Nalefan'i",
        "version-version": "($1)",
+       "version-no-ext-name": "[tsy misy anarana]",
        "version-license": "Lisansa Mediawiki",
        "version-ext-license": "Fahazoan-dalana",
        "version-ext-colheader-name": "Fanitarana",
        "tags-deactivate-submit": "Aza alefa",
        "tags-edit-title": "Hanova balizy",
        "tags-edit-manage-link": "Hikirakira balizy",
+       "tags-edit-existing-tags": "Balizy misy:",
+       "tags-edit-existing-tags-none": "<em>Tsy misy</em>",
        "tags-edit-new-tags": "Balizy vaovao:",
        "tags-edit-add": "Ampiana ireo balizy ireo:",
        "tags-edit-remove": "Hanala ireo balizy ireo:",
        "htmlform-cloner-create": "Hanampy be kokoa",
        "htmlform-cloner-delete": "Esorina",
        "htmlform-cloner-required": "Sanda iray farafahakeliny no ilaina",
+       "htmlform-date-placeholder": "TTTT-VV-AA",
+       "htmlform-time-placeholder": "HH:MM:SS",
+       "htmlform-datetime-placeholder": "TTTT-VV-AA HH:MM:SS",
+       "htmlform-date-invalid": "Tsy daty fantatra ny sanda nampidirinao. Andramo ampiasina ny fipetraka TTTT-VV-AA.",
        "htmlform-title-badnamespace": "Tsy ao amin'i anaran-tsehatra \"{{ns:$2}}\" i [[:$1]].",
        "htmlform-title-not-creatable": "Lohatenim-pejy tsy azo foronina \"$1\"",
        "htmlform-title-not-exists": "Tsy misy $1.",
        "logentry-upload-upload": "Nampiditra an'i $3 i $1{{GENDER:$2}}",
        "rightsnone": "(tsy misy)",
        "feedback-adding": "Manampy ny fahenoan-kevitra amin'ilay pejy...",
+       "feedback-back": "Hiverina",
        "feedback-bugnew": "Efa nomariniko. Hitory baogy iray",
        "feedback-cancel": "Foanana",
        "feedback-close": "Vita",
+       "feedback-dialog-title": "Handefa resaka",
        "feedback-error1": "Hadisoana: Valiny avy amin'ny API tsy fantatra",
        "feedback-error2": "Hadisoana: Tsy voaòva",
        "feedback-error3": "Hadisoana: Tsy nisy valiny avy amin'ny API",
        "feedback-subject": "Lohahevitra:",
        "feedback-submit": "Alefa",
        "feedback-thanks": "Misaotra! lanefa tany amin'ilay pejy ''[$2 $1]'' ilay fanehoan-kevitrao.",
+       "feedback-thanks-title": "Misaotra indrindra!",
        "feedback-useragent": "User agent:",
-       "searchsuggest-search": "Hikaroha eto amin'i {{SITENAME}}",
+       "searchsuggest-search": "Hikaroka eto amin'i {{SITENAME}}",
        "searchsuggest-containing": "misy...",
        "api-error-badtoken": "Hadisoana anaty : \"token\" diso.",
        "api-error-emptypage": "Tsy azo atao ny mamorona pejy vaovao tsy misy votoatiny.",
        "api-error-stashfailed": "Hadisoana anaty: Tsy nahomby ny fitahirizana ilay rakitra vonjimaika ilay lohamilina.",
        "api-error-unknown-warning": "Fampitandremana tsy fantatra : ''$1''.",
        "api-error-unknownerror": "Hadisoana tsy fantatra : ''$1''.",
+       "duration-seconds": "$1 segondra{{PLURAL:$1|}}",
+       "duration-minutes": "$1 minitra{{PLURAL:$1|}}",
+       "duration-hours": "$1 ora{{PLURAL:$1|}}",
+       "duration-days": "$1 andro{{PLURAL:$1|}}",
+       "duration-weeks": "$1{{PLURAL:$1|}} herinandro",
+       "duration-years": "$1 taona{{PLURAL:$1|}}",
+       "duration-decades": "folotaona{{PLURAL:$1|}} $1",
+       "duration-centuries": "taonjato $1{{PLURAL:$1|}}",
+       "limitreport-walltime": "Tena fotoam-pampiasana",
+       "limitreport-walltime-value": "$1 segondra{{PLURAL:$1|}}",
+       "expandtemplates": "Hanitatra ny endrika",
+       "expand_templates_input": "Wikisoratra loharano:",
+       "expand_templates_output": "Valiny",
+       "expand_templates_xml_output": "Famoahana XML",
+       "expand_templates_html_output": "Famoahana HTML",
+       "expand_templates_ok": "OK",
+       "expand_templates_remove_comments": "Hanala resaka",
+       "expand_templates_generate_rawhtml": "Haneho HTML maina",
+       "expand_templates_preview": "Topi-maso",
+       "pagelang-name": "Pejy",
+       "pagelang-language": "Fiteny",
+       "pagelang-use-default": "Hampiasan ny fiteny raha tsy misy",
+       "pagelang-select-lang": "Hisafidy teny",
+       "pagelang-reason": "Antony",
+       "pagelang-submit": "Alefa",
+       "right-pagelang": "Hanova ny fitenin'ny pejy",
+       "action-pagelang": "hanova ny fitenin'ny pejy",
+       "mediastatistics": "Statistikan'ny haino aman-jery",
+       "mediastatistics-table-mimetype": "Karazana MIME",
+       "mediastatistics-table-extensions": "Itatra azo atao",
+       "mediastatistics-table-count": "Isan'ny rakitra",
+       "mediastatistics-header-unknown": "Tsy fantatra",
+       "mediastatistics-header-bitmap": "Sary bitmap",
+       "mediastatistics-header-drawing": "Sary (sary vektôrialy)",
+       "mediastatistics-header-audio": "Feo",
+       "mediastatistics-header-video": "Horonantsary",
+       "mediastatistics-header-multimedia": "Haino aman-jery be harena",
+       "mediastatistics-header-office": "Birao",
+       "mediastatistics-header-text": "Soratra",
+       "mediastatistics-header-executable": "Azo alefa",
+       "mediastatistics-header-total": "Rakitra rehetra",
+       "json-error-syntax": "Hadisoan-drariteny",
        "special-characters-group-latin": "latina",
        "special-characters-group-latinextended": "latina nitarina",
        "special-characters-group-ipa": "AAI",
        "special-characters-title-endash": "tsipika anglisy",
        "special-characters-title-emdash": "tsipika em",
        "special-characters-title-minus": "marika mainosy",
+       "mw-widgets-mediasearch-noresults": "Tsy nahitana valiny",
+       "mw-widgets-titleinput-description-new-page": "Tsy mbola misy ilay pejy",
+       "mw-widgets-usersmultiselect-placeholder": "Hanampy be kokoa",
        "sessionmanager-tie": "Tsy afaka mampikambana karazan-kataka fampamantarana maromaro: $1.",
+       "log-action-filter-all": "Manontolo",
+       "log-action-filter-block-block": "Bolongana",
+       "log-action-filter-protect-protect": "Fiarovana",
+       "log-action-filter-protect-unprotect": "Fanalana fiarovana",
        "authmanager-authn-not-in-progress": "Tsy andalam-panaovana ny fampamantarana, na very ny angon'ny sesiôna. Avereno hatramin'ny voalohany azafady.",
        "authmanager-authplugin-setpass-failed-title": "Tsy nahomby ny fanovana tenimiafina",
        "authmanager-authplugin-setpass-failed-message": "Nandà ny fanovana tenimiafina ny plugin fampamantarana.",
        "authmanager-username-help": "Anaram-pikambana ho an'ny fampamantarana.S",
        "authmanager-password-help": "Tenimiafina ho an'ny fampamantarana.",
        "authmanager-retype-help": "tenimiafina indray hanamarinana.",
+       "authmanager-email-label": "Mailaka",
+       "authmanager-email-help": "Adiresy mailaka:",
+       "authmanager-realname-label": "Tena anarana:",
        "authmanager-provider-password": "Fampamamtarana mifototra amin'ny tenimiafina",
        "authmanager-provider-password-domain": "Fampamantarana mifototra amin'ny tenimiafina ary vala",
        "authmanager-provider-temporarypassword": "Tenimiafina vonjimaika",
+       "authprovider-resetpass-skip-label": "Dinganina",
        "authprovider-resetpass-skip-help": "Handingana ny famerenam-tenimiafina.",
-       "authform-nosession-login": "nahomby ny fidirana, fa tsy mahatadidy anao tafiditra ny mpitety tranonkalanao."
+       "authform-nosession-login": "nahomby ny fidirana, fa tsy mahatadidy anao tafiditra ny mpitety tranonkalanao.",
+       "specialpage-securitylevel-not-allowed-title": "Voarara",
+       "changecredentials": "Hanova torohay fampahafantarana",
+       "changecredentials-submit": "Ovaina ny torohay fampahafantarana",
+       "changecredentials-invalidsubpage": "Tsy karazan-torohay fampahafantarana azo ekena $1",
+       "changecredentials-success": "Niova ny torohay fampahafantarana anao.",
+       "removecredentials": "Hanala torohay fampahafantarana",
+       "removecredentials-submit": "Esorina ny torohay fampahafantarana",
+       "credentialsform-provider": "Karazan-torohay fampahafantarana:",
+       "credentialsform-account": "Anaran-kaonty:",
+       "restrictionsfield-badip": "Adiresy na valan'IP tsy azo raisina: $1",
+       "restrictionsfield-label": "Valan' IP ekena:",
+       "revid": "versiona $1",
+       "pageid": "ID pejy $1"
 }
index 949cbca..1f1e6de 100644 (file)
        "searchprofile-articles": "Возымо лаштык-влак",
        "searchprofile-images": "Мультимедий",
        "searchprofile-everything": "Чыла",
-       "searchprofile-advanced": "Кумдарак",
+       "searchprofile-advanced": "Кумда кычалмаш",
        "searchprofile-articles-tooltip": "Кычалмаш $1ште",
        "searchprofile-images-tooltip": "Файл-влакым кычалмаш",
        "searchprofile-everything-tooltip": "Чыла лаштык-влакыште кычалаш (каҥашымаш лаштык-влакыштат)",
        "search-nonefound": "Тыйын йодышет почеш нимо муалтын огыл",
        "powersearch-legend": "Сайынрак кычалаш",
        "powersearch-ns": "Кычалаш тиде лӱм-влакын кумдыкышт-влакыште:",
-       "powersearch-togglelabel": "Сайлаш:",
+       "powersearch-togglelabel": "Ð\9eйÑ\8bÑ\80аш:",
        "powersearch-toggleall": "Чыла",
        "powersearch-togglenone": "Нимо",
        "preferences": "Келыштарымаш",
        "tag-filter": "[[Special:Tags|Метке]] фильтр:",
        "logentry-delete-delete": "$1 {{GENDER:$2|шӧрен|шӧрен}} лаштыкым $3",
        "logentry-newusers-create": "Пайдаланыше {{GENDER:$2}} $1 лаштыкым ыштен.",
-       "searchsuggest-search": "{{SITENAME}} сайтыште кычалаш",
+       "searchsuggest-search": "кычалаш",
        "expand_templates_ok": "Йӧра",
        "expand_templates_preview": "Ончылгоч ончымаш"
 }
index 42841f0..c6bb80a 100644 (file)
        "post-expand-template-argument-warning": "'''Предупредување:''' Оваа страница содржи најмалку еден шаблонски аргумент кој е со преголема должина.\nТаквите аргументи ќе бидат изземени при расчленувањето.",
        "post-expand-template-argument-category": "Страници кои содржат изземени аргументи на шаблони",
        "parser-template-loop-warning": "Пронајдена е јамка во шаблонот: [[$1]]",
+       "template-loop-category": "Страници со шаблонски јамки",
+       "template-loop-category-desc": "Страницава содржи шаблонска јамка, т.е. шаблон кој повторливо се самоповикува",
        "parser-template-recursion-depth-warning": "Пречекорена е границата на длабочината на рекурзијата во шаблонот ($1)",
        "language-converter-depth-warning": "Пречекорена е границата на длабочината на јазичниот претворач ($1)",
        "node-count-exceeded-category": "Страници каде е надминат бројот на јазли",
        "page_first": "прв",
        "page_last": "последен",
        "histlegend": "Разлика помеѓу преработките: Означете ги преработките што сакате да ги споредите и притиснете на Enter или копчето на дното од страницата.<br />\nЛегенда: '''({{int:cur}})''' = разлика со последна преработка, '''({{int:last}})''' = разлика со претходна преработка, '''{{int:minoreditletter}}''' = ситна промена.",
-       "history-fieldset-title": "Ð\9fÑ\80еглед Ð½Ð° Ð¸Ñ\81Ñ\82оÑ\80иÑ\98аÑ\82а",
-       "history-show-deleted": "Само избришани",
+       "history-fieldset-title": "Ð\9fÑ\80ебаÑ\80аÑ\98 Ð¿Ñ\80еÑ\80абоÑ\82ки",
+       "history-show-deleted": "Само избришани преработки",
        "histfirst": "најстари",
        "histlast": "најнови",
        "historysize": "({{PLURAL:$1|1 бајт|$1 бајти}})",
        "prefs-help-prefershttps": "Поставката ќе се примени следниот пат кога ќе се најавите.",
        "prefswarning-warning": "Направивте промени во нагодувањата, но не ги зачувавте.\nИзмената нема да се изврши ако ја напуштите страницава без да стиснете на „$1“.",
        "prefs-tabs-navigation-hint": "Совет: Можете да ги користите стрелките на тастатурата за да преоѓате од едно на друго јазиче во списокот на јазичиња.",
-       "userrights": "РаководеÑ\9aе Ñ\81о Ðºориснички права",
+       "userrights": "Ð\9aориснички права",
        "userrights-lookup-user": "Изберете корисник",
        "userrights-user-editname": "Внесете корисничко име:",
        "editusergroup": "Вчитај кориснички групи",
        "saveusergroups": "Зачувај ги {{GENDER:$1|корисничките}} групи",
        "userrights-groupsmember": "Член на:",
        "userrights-groupsmember-auto": "Подразбран член на:",
-       "userrights-groups-help": "Можете да измените на кои групи припаѓа корисник:\n* Штиклирано — корисникот е во таа група.\n* Нештиклирано — корисникот не припаѓа на групата.\n* Ѕвездичка (*) — не можете да ја отстраните групата откако сте ја додале (и обратно).\n* Тараба (#) — можете само да го вратите истекот на групава, но не можете да го поместите нанапред.",
+       "userrights-groups-help": "Можете да измените на кои групи припаѓа корисник:\n* Штиклирано — корисникот е во таа група.\n* Нештиклирано — корисникот не припаѓа на групата.\n* Ѕвездичка (*) — не можете да ја отстраните групата откако сте ја додале (и обратно).\n* Тараба (#) — можете само да го вратите истекот на членството во групава, но не можете да го поместите нанапред.",
        "userrights-reason": "Причина:",
        "userrights-no-interwiki": "Немате дозвола за уредување на кориснички права на други викија.",
        "userrights-nodatabase": "Базата на податоци $1 не постои или не е месна.",
        "userrights-expiry-options": "1 ден:1 day,1 недела:1 week,1 месец:1 month,3 месеци:3 months,6 месеци:6 months,1 година:1 year",
        "userrights-invalid-expiry": "Истекот за групата „$1“ е неважечки.",
        "userrights-expiry-in-past": "Истекот за групата „$1“ е во минатото.",
-       "userrights-cannot-shorten-expiry": "Не можете да го поместити нанапред истекот на групата „$1“. Ова можат да го прават само корисници со дозвола за додавање или одземање на оваа група.",
+       "userrights-cannot-shorten-expiry": "Не можете да го поместити нанапред истекот на членството во групата „$1“. Ова можат да го прават само корисници со дозвола за додавање или одземање на оваа група.",
        "userrights-conflict": "Спротиставеност во измените на корисничките права. Прегледајте ги и потврдете ги.",
        "group": "Група:",
        "group-user": "Корисници",
        "rcfilters-invalid-filter": "Неважечки филтер",
        "rcfilters-empty-filter": "Нема активни филтри. Прикажани се сите придонеси.",
        "rcfilters-filterlist-title": "Филтри",
+       "rcfilters-filterlist-whatsthis": "Што е ова?",
        "rcfilters-filterlist-feedbacklink": "Дајте мислење за новите (бета) филтри",
        "rcfilters-highlightbutton-title": "Истакнување на исход",
        "rcfilters-highlightmenu-title": "Изберете боја",
        "rcfilters-highlightmenu-help": "Изберете боја за да го истакнете ова својство",
        "rcfilters-filterlist-noresults": "Не пронајдов ниеден филтер",
+       "rcfilters-noresults-conflict": "Не пронајдов ништо бидејќи критериумите на барање се спротиставени.",
+       "rcfilters-state-message-subset": "Филтерот не делува бидејќи неговиот исход веќе се содржи во {{PLURAL:$2|следниов поопфатен филтер|следниве поопфатни филтри}} (истакнете го за да го издвоите): $1",
+       "rcfilters-state-message-fullcoverage": "Избирањето на сите филтри во групата е исто како да не сте избрале ниеден, така што овој филтер не делува. Во групата се опфатени: $1",
        "rcfilters-filtergroup-registration": "Регистрација на корисници",
        "rcfilters-filter-registered-label": "Регистрирани",
        "rcfilters-filter-registered-description": "Најавени уредници.",
        "rcfilters-filter-unregistered-label": "Нерегистрирани",
        "rcfilters-filter-unregistered-description": "Уредници кои не се најавени.",
-       "rcfilters-filter-unregistered-conflicts-user-experience-level": "ФилÑ\82еÑ\80оÑ\82 â\80\9eÐ\9dеÑ\80егиÑ\81Ñ\82Ñ\80иÑ\80аниâ\80\9c Ðµ Ð½ÐµÐ°ÐºÑ\82ивен Ð±Ð¸Ð´ÐµÑ\98Ñ\9cи Ð½ÐµÐ³Ð¾Ð²Ð°Ñ\82а Ñ\80абоÑ\82а Ñ\81е Ð¿Ð¾Ð½Ð¸Ñ\88Ñ\82Ñ\83ва Ð¾Ð´ {{PLURAL:$2|следниов филтер|следниве филтри}} за искуство, {{PLURAL:$2|кој наоѓа|кои наоѓаат}} само регистрирани корисници: $1",
+       "rcfilters-filter-unregistered-conflicts-user-experience-level": "Ð\9eвоÑ\98 Ñ\84илÑ\82еÑ\80 Ðµ Ð¿Ñ\80оÑ\82иÑ\81Ñ\82авен Ñ\81о {{PLURAL:$2|следниов филтер|следниве филтри}} за искуство, {{PLURAL:$2|кој наоѓа|кои наоѓаат}} само регистрирани корисници: $1",
        "rcfilters-filtergroup-authorship": "Уреди авторство",
        "rcfilters-filter-editsbyself-label": "Ваши сопствени уредувања",
        "rcfilters-filter-editsbyself-description": "Ваши уредувања.",
        "rcfilters-filter-editsbyother-label": "Туѓи уредувања",
        "rcfilters-filter-editsbyother-description": "Уредувања направени од други корисници (не од вас).",
        "rcfilters-filtergroup-userExpLevel": "Корисничка искусност (само за регистрирани)",
-       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "Филтерот е неактивен бидејќи наоѓа само регистрирани корисници, па филтерот „Нерегистрирани“ му ја поништува работата.",
-       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "Филтерот „Нерегистрирани“ е во спротиставеност со еден или повеќе од филтрите за искуство. Тие филтри наоѓаат само регистрирани корисници. Спротиставените филтри погоре се означени како неактивни.",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "Филтрите за искуство пронаоѓаат само регистрирани корисници, така што овој филтер е простиставен со филтерот „Нерегистрирани“.",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "Филтерот „Нерегистрирани“ е спротиставен на еден или повеќе од филтрите за искуство. Тие филтри наоѓаат само регистрирани корисници. Спротиставените филтри погоре се означени во одделот Активни филтри.",
        "rcfilters-filter-user-experience-level-newcomer-label": "Новодојденци",
        "rcfilters-filter-user-experience-level-newcomer-description": "Помалку од 10 уредувања и 4 дена активност.",
        "rcfilters-filter-user-experience-level-learner-label": "Ученици",
        "rcfilters-filter-categorization-description": "Записи од ставање на страници во категории или нивно отстранување од нив.",
        "rcfilters-filter-logactions-label": "Заведени дејства",
        "rcfilters-filter-logactions-description": "Административни постапки, создавања на сметки, бришења на страници, подигања...",
+       "rcfilters-hideminor-conflicts-typeofchange-global": "Филтерот „Ситни уредувања“ е спротиставен на еден или повеќе од филтрите за видови измена, бидејќи извеси видови не можат да се означат како ситни. Спротиставените филтри се означени во делот Неактивни филтри погоре.",
+       "rcfilters-hideminor-conflicts-typeofchange": "Извезни видови промени не можат да се означат како „ситни“, па затоа овој филтер е во спротиставеност со следниве филтри за видови промени: $1",
+       "rcfilters-typeofchange-conflicts-hideminor": "Овој филтер за видови промени е во спротиставеност со филтерот „Ситни уредувања“. Извсни видови промени не можат да се означат како „ситни“.",
        "rcnotefrom": "Подолу {{PLURAL:$5|е прикажана промената|се прикажани промените}} почнувајќи од <strong>$3, $4</strong>  (се прикажуваат до <b>$1</b>).",
+       "rclistfromreset": "Нов избор на датуми",
        "rclistfrom": "Прикажи нови промени почнувајќи од $3 $2",
        "rcshowhideminor": "$1 ситни промени",
        "rcshowhideminor-show": "Прикажи",
        "php-uploaddisabledtext": "Подигањето на податотеки е оневозможено во PHP. \nПроверете го нагодувањето file_uploads.",
        "uploadscripted": "Податотеката содржи HTML-код или сценарио што може погрешно да се протолкува во прелистувачот.",
        "upload-scripted-pi-callback": "Не можам да подигнам податотека што содржи напатствие за обработка на XML-стилска страница.",
+       "upload-scripted-dtd": "Не можам да подигнам SVG-податотеки што содржат нестандардна DTD-изјава.",
        "uploaded-script-svg": "Пронајдов скриптен елемент „$1“ во подигнатата SVG-податотека.",
        "uploaded-hostile-svg": "Пронајдов небезбеден CSS во стилскиот елемент на подигнатата SVG-податотека.",
        "uploaded-event-handler-on-svg": "Задавањето на атрибути <code>$1=\"$2\"</code> за работа со настани не е дозволено за SVG-податотеки.",
        "undeleteviewlink": "преглед",
        "undeleteinvert": "Обратен избор",
        "undeletecomment": "Причина:",
-       "undeletedrevisions": "{{PLURAL:$1|1 измена е обновена|$1 измени се обновени}}",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 измена|$1 измени}} и {{PLURAL:$2|1 податотека|$2 податотеки}} се вратени",
-       "undeletedfiles": "{{PLURAL:$1|1 податотека е вратена|$1 податотеки се вратени}}",
        "cannotundelete": "Враќањето не успеа делумно или целосно:\n$1",
        "undeletedpage": "'''$1 беше обновена'''\n\nПогледнете го [[Special:Log/delete|дневникот на бришења]] за попис на претходни бришења и обновувања.",
        "undelete-header": "Списокот на неодамна избришани страници ќе го најдете на [[Special:Log/delete|дневникот на бришења]].",
        "newimages-summary": "Оваа службена страница ги покажува скоро подигнатите податотеки.",
        "newimages-legend": "Филтрирај",
        "newimages-label": "Име на податотека (или дел од името):",
+       "newimages-user": "IP-адреса или корисничко име",
        "newimages-showbots": "Прикажувај подигања од ботови",
        "newimages-hidepatrolled": "Сокриј испатролриани подигања",
        "noimages": "Нема ништо.",
        "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-restore": "$1 {{GENDER:$2|ја возобнови}} страницата $3 ($4)",
+       "logentry-delete-restore-nocount": "$1 {{GENDER:$2|ја поврати}} страницата $3",
+       "restore-count-revisions": "{{PLURAL:$1|1 преработка|$1 преработки}}",
+       "restore-count-files": "{{PLURAL:$1|1 податотека|$1 податотеки}}",
        "logentry-delete-event": "$1 {{GENDER:$2|ја измени}} видливоста на {{PLURAL:$5|настан во дневникот|$5 настани во дневникот}} на $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|ја измени}} видливоста на {{PLURAL:$5|преработка|$5 преработки}} на страницата $3: $4",
        "logentry-delete-event-legacy": "$1 {{GENDER:$2|ја измени}} видливоста на настаните во дневникот на $3",
        "special-characters-group-thai": "Тајландски",
        "special-characters-group-lao": "Лаошки",
        "special-characters-group-khmer": "Кмерски",
+       "special-characters-group-canadianaboriginal": "канадски домородни",
        "special-characters-title-endash": "цртичка",
        "special-characters-title-emdash": "тире",
        "special-characters-title-minus": "минус",
        "restrictionsfield-label": "Допуштени IP-опсези:",
        "restrictionsfield-help": "Една IP-адреса или CIDR-опсег по ред. За да овозможите сè, користете<br /><code>0.0.0.0/0</code><br /><code>::/0</code>",
        "revid": "преработка $1",
-       "pageid": "назнака на страницата $1"
+       "pageid": "назнака на страницата $1",
+       "rawhtml-notallowed": "&lt;html&gt;-ознаките не може да се користат вон нормалните страници.",
+       "gotointerwiki": "Го напуштате {{SITENAME}}",
+       "gotointerwiki-invalid": "Укажаниот наслов беше неважечки.",
+       "gotointerwiki-external": "Го напуштате {{SITENAME}} упатени кон [[$2]], кое е посебно мрежно место.\n\n[$1 Тука продолжете кон $1].",
+       "undelete-cantedit": "Не можете да ја вратите избришаната страница бидејќи уредувањето на страницава не ви е дозволено.",
+       "undelete-cantcreate": "Не можете да ја вратите страницава бидејќи не постои страница со таков назив и не ви е дозволено да ја создадете."
 }
index 864bdeb..a6ac26c 100644 (file)
        "login": "सनोंद-प्रवेश(लॉग-ईन)",
        "login-security": "तुमची ओळख पटवा",
        "nav-login-createaccount": "सनोंद-प्रवेश / सदस्यखाते उघडा",
-       "userlogin": "सनोंद-प्रवेश करा /सदस्यखाते उघडा",
-       "userloginnocreate": "सनोंद-प्रवेश",
        "logout": "सनोंद-निर्गम",
        "userlogout": "सनोंद-निर्गम",
        "notloggedin": "आपण सनोंद-प्रवेशित नाहीत",
        "userlogin-noaccount": "आपले खाते नाही?",
        "userlogin-joinproject": "{{SITENAME}}मध्ये सहभागी व्हा",
-       "nologin": "आपले सदस्यखाते नाही काय? $1.",
-       "nologinlink": "सदस्यखाते तयार करा",
        "createaccount": "नवीन खाते तयार करा",
-       "gotaccount": "पूर्वीचे खाते आहे? $1.",
-       "gotaccountlink": "सनोंद-प्रवेश करा",
-       "userlogin-resetlink": "सनोंद-प्रवेश तपशील विसरला असाल तर येथे टिचकी मारा.",
        "userlogin-resetpassword-link": "आपला परवलीचा शब्द विसरलात?",
        "userlogin-helplink2": "सनोंद प्रवेशासंबंधी साहाय्य",
        "userlogin-loggedin": "आपण पुर्वीच {{GENDER:$1|$1}} म्हणून सनोंद प्रवेशित आहात.वेगळ्या सदस्यनावाने सनोंद प्रवेशासाठी खालील आवेदन वापरा.",
        "createacct-another-email-ph": "आपला विपत्रपत्ता (ई-मेल) टाका",
        "createaccountmail": "तात्पुरता अनियत (रॅन्डम) परवलीचा शब्द तयार करून तो खाली नमूद विपत्रपत्त्यावर पाठवा",
        "createacct-realname": "खरे नाव (ऐच्छिक)",
-       "createaccountreason": "कारण:",
        "createacct-reason": "कारण",
        "createacct-reason-ph": "आपण दुसरे खाते कां बनवीत आहात",
        "createacct-submit": "आपले खाते निर्माण करा",
        "rcfilters-filter-editsbyother-label": "इतरांची संपादने",
        "rcfilters-filter-editsbyother-description": "इतर सदस्यांनी तयार केलेली संपादने (आपण नाही).",
        "rcfilters-filtergroup-userExpLevel": "अनुभवाचा स्तर (फक्त नोंदणीकृत सदस्यांसाठीच)",
-       "rcfilters-filter-userExpLevel-newcomer-label": "नवागत",
-       "rcfilters-filter-userExpLevel-newcomer-description": "१० संपादनांपेक्षा कमी व ४ दिवसांची सक्रियता.",
-       "rcfilters-filter-userExpLevel-learner-label": "शिकाऊ",
+       "rcfilters-filter-user-experience-level-newcomer-label": "नवागत",
+       "rcfilters-filter-user-experience-level-newcomer-description": "१० संपादनांपेक्षा कमी व ४ दिवसांची सक्रियता.",
+       "rcfilters-filter-user-experience-level-learner-label": "शिकाऊ",
        "rcnotefrom": "खाली {{PLURAL:$5|हा बदल आहे|हे बदल आहेत}} <strong>$3, $4</strong>पासून ते(<strong>$1</strong>पर्यंतचे  बदल दाखविले आहेत).",
        "rclistfrom": "$2,$3 पासून सुरुवात करुन, नविन केल्या गेलेले बदल दाखवा.",
        "rcshowhideminor": "छोटे बदल $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 ने $3 हे पुनर्निर्देशन उपरीलेखन(ओव्हररायटिंग) करून {{GENDER:$2|वगळले}}",
        "logentry-delete-restore": "$1 {{GENDER:$2|पुनर्स्थापित पृष्ठ}} $3",
        "logentry-delete-event": "$1 ने $3 वर{{PLURAL:$5|नोंद-प्रसंग|$5 नोंद प्रसंगांची}} दृष्यता{{GENDER:$2|बदलली}}:$4",
        "logentry-delete-revision": "$1 ने $3 पानावर{{PLURAL:$5|आवृत्ती|$5 आवृत्यांची}} दृष्यता{{GENDER:$2|बदलली}}:$4",
        "logentry-managetags-deactivate": "$1 ने  \"$4\" ही खूणपताका, सदस्यांसाठी व सांगकाम्यांसाठी {{GENDER:$2|अक्रिय केली}}",
        "log-name-tag": "खूणपताका नोंदी",
        "rightsnone": "(काहीही नाही)",
-       "revdelete-summary": "संपादन माहिती",
        "feedback-adding": "आपला पश्चप्रदाय (फिडबॅक)  जोडत आहोत या पानास.......",
        "feedback-back": "परत",
        "feedback-bugcheck": "उत्तम! फक्त एकदा खात्री करा की हा [$1 अगोदरच माहिती असलेला बग] तर नाहीये.",
index 865fa33..f386599 100644 (file)
        "login": "Log masuk",
        "login-security": "Mengesahkan identiti anda",
        "nav-login-createaccount": "Log masuk / buka akaun",
-       "userlogin": "Log masuk / buka akaun",
-       "userloginnocreate": "Log masuk",
        "logout": "Log keluar",
        "userlogout": "Log keluar",
        "notloggedin": "Belum log masuk",
        "userlogin-noaccount": "Tidak mempunyai akaun?",
        "userlogin-joinproject": "Sertai {{SITENAME}}",
-       "nologin": "Belum mempunyai akaun? '''$1'''.",
-       "nologinlink": "Buka akaun baru",
        "createaccount": "Buka akaun",
-       "gotaccount": "Sudah mempunyai akaun? '''$1'''.",
-       "gotaccountlink": "Log masuk",
-       "userlogin-resetlink": "Lupa nama pengguna/kata laluan anda?",
        "userlogin-resetpassword-link": "Lupa kata laluan anda?",
        "userlogin-helplink2": "Bantuan untuk log masuk",
        "userlogin-loggedin": "Anda sudah log masuk sebagai {{GENDER:$1|$1}}. Gunakan borang di bawah untuk log masuk sebagai pengguna lain.",
        "createaccountmail": "Gunakan kata laluan rawak yang sementara dan hantarnya ke alamat e-mel yang dinyatakan",
        "createaccountmail-help": "Boleh digunakan untuk membuat akaun untuk orang lain tanpa mengetahui kata laluan.",
        "createacct-realname": "Nama sebenar (pilihan)",
-       "createaccountreason": "Sebab:",
        "createacct-reason": "Sebab",
        "createacct-reason-ph": "Mengapa anda membuka satu lagi akaun",
        "createacct-reason-help": "Mesej yang ditunjukkan dalam log penciptaan akaun",
        "botpasswords-label-delete": "Hapuskan",
        "botpasswords-label-resetpassword": "Set semula kata laluan",
        "botpasswords-label-grants": "Pemberian berkenaan:",
+       "botpasswords-help-grants": "Membenarkan pemberian akses kepada hak-hak yang telah dipegang oleh akaun pengguna anda. Membolehkan pemberian di sini tidak menyediakan akses kepada mana-mana hak yang akaun pengguna anda tidak sepatutnya ada. Lihat [[Special:ListGrants|jadual pemberian]] untuk maklumat lanjut.",
+       "botpasswords-label-grants-column": "Diberikan",
+       "botpasswords-bad-appid": "Nama bot \"$1\" adalah tidak sah.",
+       "botpasswords-insert-failed": "Gagal untuk menambah nama bot \"$1\". Adakah ia telah digunakan?",
+       "botpasswords-update-failed": "Gagal untuk mengemas kini nama bot \"$1\". Adakah ia telah dipadam?",
+       "botpasswords-created-title": "Kata laluan bot telah dicipta",
+       "botpasswords-created-body": "Kata laluan bot untuk nama bot \"$1\" bagi pengguna \"$2\" telah dicipta.",
+       "botpasswords-updated-title": "Kata laluan bot telah dikemaskinikan",
+       "botpasswords-updated-body": "Kata laluan bot untuk nama bot \"$1\" bagi pengguna \"$2\" telah dikemaskini.",
+       "botpasswords-deleted-title": "Kata laluan bot telah dipadam",
+       "botpasswords-deleted-body": "Kata laluan bot untuk nama bot \"$1\" bagi pengguna \"$2\" telah dipadam.",
+       "botpasswords-newpassword": "Kata laluan baru untuk log masuk dengan <strong>$1</strong> adalah <strong>$2</strong>. <em>Sila catatkan ini untuk rujukan masa depan.</em> <br> (Untuk bots lama yang memerlukan nama log masuk untuk menjadi sama dengan nama pengguna akhirnya, anda juga boleh menggunakan <strong>$3</strong> sebagai nama pengguna dan <strong>$4</strong> sebagai kata laluan.)",
+       "botpasswords-no-provider": "BotPasswordsSessionProvider tidak tersedia.",
+       "botpasswords-restriction-failed": "Bot sekatan kata laluan menghalang log masuk ini.",
+       "botpasswords-invalid-name": "Nama pengguna yang dinyatakan tidak mengandungi pemisah kata laluan bot (\"$1\").",
        "resetpass_forbidden": "Kata laluan tidak boleh ditukar",
        "resetpass-no-info": "Anda hendaklah log masuk terlebih dahulu untuk mencapai laman ini secara terus.",
        "resetpass-submit-loggedin": "Tukar kata laluan",
        "undeleteviewlink": "papar",
        "undeleteinvert": "Kecualikan pilihan",
        "undeletecomment": "Sebab:",
-       "undeletedrevisions": "$1 semakan dipulihkan",
-       "undeletedrevisions-files": "$1 semakan dan $2 fail dipulihkan",
-       "undeletedfiles": "$1 fail dipulihkan",
        "cannotundelete": "Penyahhapusan gagal: $1",
        "undeletedpage": "'''$1 telah dipulihkan'''\n\nSila rujuk [[Special:Log/delete|log penghapusan]] untuk rekod penghapusan terkini.",
        "undelete-header": "Lihat [[Special:Log/delete|log penghapusan]] untuk laman-laman yang baru dihapuskan.",
        "logentry-tag-update-revision": "$1 telah {{GENDER:$2|mengemaskinikan}} teg-teg pada semakan $4 pada $3 ({{PLURAL:$7|menambahkan}} $6; {{PLURAL:$9|menggugurkan}} $8)",
        "logentry-tag-update-logentry": "$1 telah {{GENDER:$2|mengemaskinikan}} teg-teg pada entri log $5 bagi laman $3 ({{PLURAL:$7|menambahkan}} $6; {{PLURAL:$9|menggugurkan}} $8)",
        "rightsnone": "(tiada)",
-       "revdelete-summary": "ringkasan",
        "feedback-adding": "Maklum balas sedang diisikan ke dalam laman...",
        "feedback-back": "Kembali",
        "feedback-bugcheck": "Bagus! Cuma pastikan itu bukan salah satu [$1 pepijat] yang sedia diketahui.",
index 1555a31..39bacff 100644 (file)
        "view": "ကြည့်ရန်",
        "view-foreign": "$1 တွင် ကြည့်ရန်",
        "edit": "ပြင်ဆင်ရန်",
+       "edit-local": "ဒေသတွင်း ဖော်ပြချက် ပြင်ဆင်ရန်",
        "create": "စတင်ရေးသားရန်",
        "create-local": "ဒေသတွင်း ဖော်ပြချက် ထည့်ရန်",
        "editthispage": "ဤစာမျက်နှာကို ပြင်ရန်",
        "protectedpagetext": "ဤစာမျက်နှာအား တည်းဖြတ်ခြင်းနှင့် အခြားလုပ်ဆောင်မှုများ မလုပ်ဆောင်နိုင်အောင် ကာကွယ်ထားသည်။",
        "viewsourcetext": "ဤစာမျက်နှာ၏ ရင်းမြစ်ကို ကြည့်ရှု၍ ကူးယူနိုင်သည်။",
        "viewyourtext": "ဤစာမျက်နှာရှိ <strong>သင့်တည်းဖြတ်မှုများ</strong>၏ ရင်းမြစ်ကို ကြည့်ရှုပြီး ကူးယူနိုင်သည်။",
+       "editinginterface": "<strong>သတိပေးချက်။</strong> သင်သည် ဆော့ဖ်ဝဲလ်၏ အသွင်အပြင်စာသားများကို အထောက်အကူပြုရာတွင် သုံးသော စာမျက်နှာအား တည်းဖြတ်နေသည်။\nဤစာမျက်နှာတွင် ပြောင်းလဲမှုများသည် ဤဝီကီရှိ အခြားအသုံးပြုသူများ၏ အသုံးပြုသူ အသွင်အပြင်များအပေါ် အကျိုးသက်ရောက်ပါလိမ့်မည်။",
        "namespaceprotected": "'''$1''' စာညွှန်းဖြင့် စာမျက်နှာကို တည်းဖြတ်ရန် ခွင့်ပြုချက် မရှိပါ။",
        "mycustomcssprotected": "ဤ CSS စာမျက်နှာကို သင်တည်းဖြတ်ပြင်ဆင်ခွင့် မရှိပါ။",
        "mycustomjsprotected": "ဤ JavaScript စာမျက်နှာကို သင်တည်းဖြတ်ပြင်ဆင်ခွင့် မရှိပါ။",
        "password-change-forbidden": "ဤဝီကီတွင် စကားဝှက်များကို ပြောင်းလဲ၍ မရပါ။",
        "login": "Log in ဝင်ရန်",
        "nav-login-createaccount": "Log in ဝင်ရန်/ အကောင့် ဖန်တီးရန်",
-       "userlogin": "Log in ဝင်ရန်/ အကောင့် ဖန်တီးရန်",
-       "userloginnocreate": "Log in ဝင်ရန်",
        "logout": "ထွက်ရန်",
        "userlogout": "ထွက်ရန်",
        "notloggedin": "log in ဝင်မထားပါ",
        "userlogin-noaccount": "အကောင့် မရှိဘူးလား?",
        "userlogin-joinproject": "{{SITENAME}} ကို ချိတ်ဆက်ရန်",
-       "nologin": "အကောင့်မရှိဘဲ ဖြစ်နေပါသလား။ $1။",
-       "nologinlink": "အကောင့်တစ်ခု ဖန်တီးရန်",
        "createaccount": "အကောင့် ဖန်တီးရန်",
-       "gotaccount": "အကောင့်ရှိပြီးသားလား။ $1။",
-       "gotaccountlink": "Log in ဝင်ရန်",
-       "userlogin-resetlink": "Login ဝင်သည့် အသေးစိတ်တို့ကို မေ့သွားပါသလား?",
        "userlogin-resetpassword-link": "စကားဝှက် မေ့နေသလား?",
        "userlogin-helplink2": "log in အကူအညီ",
        "userlogin-loggedin": "သင်သည် {{GENDER:$1|$1}} အနေဖြင့် လော့အင်ဝင်ထားပြီး ဖြစ်သည်။ အခြားအသုံးပြုသူ အနေဖြင့် ဝင်ရောက်ရန် အောက်ပါပုံစံကို အသုံးပြုပါ။",
        "createacct-another-email-ph": "အီးမေး လိပ်စာ ရိုက်ထည့်ပါ",
        "createaccountmail": "ယာယီ ကျပန်းစကားဝှက်ကို သီးသန့် အီးမေးလ်လိပ်စာသို့ ပေးပို့အသုံးပြုရန်",
        "createacct-realname": "နာမည်ရင်း (ဖြည့်လိုက)",
-       "createaccountreason": "အ​ကြောင်း​ပြ​ချက် -",
        "createacct-reason": "အကြောင်းပြချက်",
        "createacct-reason-ph": "သင်ဘာကြောင့် အခြားအကောင့် ဖန်တီးချင်တာလဲ",
        "createacct-submit": "သင့်အကောင့်ကို ဖန်တီးရန်",
        "undeleteviewlink": "ကြည့်ရန်",
        "undeleteinvert": "ရွေးချယ်ထားခြင်းကို ပြောင်းပြန်လှန်ရန်",
        "undeletecomment": "အ​ကြောင်း​ပြ​ချက် -",
-       "undeletedrevisions": "{{PLURAL:$1|မူတစ်ခု|မူ $1 ခု}} ကိုပြန်လည် ထိန်းသိမ်းပြီး",
        "undelete-search-box": "ဖျက်ပစ်သည့် စာမျက်နှာများမှ ရှာရန်",
        "undelete-search-submit": "ရှာဖွေရန်",
        "undelete-show-file-submit": "မှန်",
        "logentry-move-move": "$3 စာမျက်နှာကို $4 သို့ $1က {{GENDER:$2|ရွှေ့ခဲ့သည်}}",
        "logentry-move-move-noredirect": "$3 မှ $4 သို့ စာမျက်နှာကို ပြန်ညွှန်းချန်မထားဘဲ $1 {{GENDER:$2|က ရွှေ့ခဲ့သည်}}",
        "logentry-move-move_redir": "$3 စာမျက်နှာကို $4 သို့ ပြန်ညွှန်းပေါ်ထပ်၍ $1 က {{GENDER:$2|ရွှေ့ခဲ့သည်}}",
-       "logentry-move-move_redir-noredirect": "$3 မှ $4 သို့ ပြန်ညွှန်ပေါ်ထပ်အုပ်ကာ ပြန်ညွှန်းချန်မထားဘဲ $1 က {{GENDER:$2|ရွှေ့ခဲ့သည်}}",
+       "logentry-move-move_redir-noredirect": "$3 á\80\99á\80¾ $4 á\80\9eá\80­á\80¯á\80· á\80\95á\80¼á\80\94á\80ºá\80\8aá\80½á\80¾á\80\94á\80ºá\80¸á\80\95á\80±á\80«á\80ºá\80\91á\80\95á\80ºá\80¡á\80¯á\80\95á\80ºá\80\80á\80¬ á\80\95á\80¼á\80\94á\80ºá\80\8aá\80½á\80¾á\80\94á\80ºá\80¸á\80\81á\80»á\80\94á\80ºá\80\99á\80\91á\80¬á\80¸á\80\98á\80² $1 á\80\80 {{GENDER:$2|á\80\9bá\80½á\80¾á\80±á\80·á\80\81á\80²á\80·á\80\9eá\80\8aá\80º}}",
        "logentry-newusers-create": "အသုံးပြုသူအကောင့် $1 ကို {{GENDER:$2|ဖန်တီးခဲ့သည်}}",
        "logentry-newusers-autocreate": "အသုံးပြုသူအကောင့် $1 ကို အလိုအလျောက် {{GENDER:$2|ဖန်တီးခဲ့သည်}}",
        "logentry-upload-upload": "$1 သည် $3 ကို {{GENDER:$2|upload တင်ခဲ့သည်}}",
        "logentry-upload-overwrite": "$3 ၏ ဗားရှင်းအသစ်ကို $1 {{GENDER:$2|upload တင်ခဲ့သည်}}",
        "rightsnone": "(ဘာမှမရှိ)",
-       "revdelete-summary": "အကျဉ်းချုပ်ကို တည်းဖြတ်ရန်",
        "searchsuggest-search": "{{SITENAME}} တွင် ရှာဖွေရန်",
        "api-error-unknown-warning": "အမည်မသိ သတိပေးချက် - $1",
        "pagelanguage": "စာမျက်နှာ ဘာသာစကား ပြောင်းလဲရန်",
index 4da94e4..f3ed5cb 100644 (file)
@@ -8,7 +8,8 @@
                        "唐吉訶德的侍從",
                        "Luuva",
                        "Macofe",
-                       "進也"
+                       "進也",
+                       "Liuxinyu970226"
                ]
        },
        "tog-underline": "Liân-kiat oē té-sûn:",
        "title-invalid-empty": "Só͘ iau-kiû ê ia̍h-bīn tê-bo̍k sī khang--ê he̍k-chiá kaⁿ-taⁿ hâm liáu miâ-khong-kan.",
        "title-invalid-utf8": "Só͘ iau-kiû ê ia̍h-bīn tê-bo̍k hâm liáu bô chiàⁿ-khak ê 1 lia̍t UTF-8 ê jī.",
        "title-invalid-interwiki": "Só͘ iau-kiû ê ia̍h-bīn tê-bo̍k pau-hâm liáu 1-ê bē-tàng ēng ùi tê-bo̍k ê interwiki liân-kiat.",
+       "title-invalid-talk-namespace": "Chhéng-kiû ê ia̍h-bīn tê-bo̍k chí-tēng liáu chi̍t phiⁿ bô hoat-tō͘ chûn-chāi ê thó-lūn-ia̍h.",
+       "title-invalid-characters": "Chhéng-kiû ê ia̍h-bīn tê-bo̍k hâm hâm bû-hāu ê bûn-jī: \"$1\".",
+       "title-invalid-relative": "Tê-bo̍k ū siong-tùi lō͘-kèng. Siong-tùi-sek ê ia̍h-bīn tê-bo̍k (./, ../) sī bû-hāu--ê, in-ūi iōng-chiá ê liû-lám-khì tiāⁿ thàng in bē kàu.",
+       "title-invalid-magic-tilde": "Chhéng-kiû ê ia̍h-bīn tê-bo̍k hâm bû-hāu ê mô͘-hoat tilde bûn-jī-lia̍t (<nowiki>~~~</nowiki>).",
+       "title-invalid-too-long": "Chhéng-kiû ia̍h-bīn ê tê-bo̍k siuⁿ tn̂g. I ê UTF-8 pian-bé it-tēng bē-tàng tn̂g kòe $1 {{PLURAL:$1|byte}}.",
+       "title-invalid-leading-colon": "Chhéng-kiû ia̍h-bīn tê-bo̍k thâu hâm bû-hāu ê tōa-kù-tiám (:)",
        "perfcached": "Ē-kha ê chu-liāu tùi lâi--ê, só·-í bô it-tēng sī siōng sin ê. Tī khoài-chhûn-khu siōng chē ē-tàng khǹg{{PLURAL:$1| pit|$1 pit}} chu-liāu.",
        "perfcachedts": "Ē-kha ê chu-liāu tùi lâi--ê, tī $1 keng-sin--koè. Tī khoài-chûn-khu siōng chē ē-tàng khǹg {{PLURAL:$4|pit|$4 pit}} chu-liāu.",
        "querypage-no-updates": "Chit-má bē-sái kái chit ia̍h.\nChia ê chu-liāu bē-tàng sui tiông-sin chéng-lí.",
        "viewsource": "Khoàⁿ goân-sú lōe-iông",
        "viewsource-title": "Khoàⁿ \"$1\"--ê goân-sú lōe-iông",
        "actionthrottled": "Tōng-chok hông tóng leh.",
-       "actionthrottledtext": "Ūi-tio̍h thê-hông lah-sap ê chhú-tì,  lí ū hông hān-chè tī té sî-kan lāi chò siuⁿ chē pái chit ê tōng-chok,  taⁿ lí í-keng chhiau-koè hān-chè.\nChhiáⁿ tī kúi hun-cheng hāu chiah koh chhì.",
+       "actionthrottledtext": "Ūi tio̍h thê-hông lām-iōng, lí hông hān-chè tī té sî-kan lāi chò siuⁿ chē pái pún khoán tōng-chok, taⁿ lí í-keng chhiau-koè hān-chè.\nChhiáⁿ tī kúi hun-cheng āu chiah koh chhì.",
        "protectedpagetext": "Chit ia̍h hông só tiâu leh, bē pian-chi̍p tit, mā bē-tàng chò kî-thaⁿ oa̍h-tāng.",
        "viewsourcetext": "Lí ē-sái khoàⁿ ia̍h khó͘-pih chit ia̍h ê goân-sú loē-iông:",
        "viewyourtext": "你會使看<strong>你改的</strong>原始碼,並且khop去這頁:",
        "password-change-forbidden": "Tī chit--ê wiki, lí boē-tàng kái bi̍t-bé.",
        "externaldberror": "這可能是資料庫驗證錯誤,抑是無允准你改外部的口座。",
        "login": "Teng-ji̍p",
+       "login-security": "Khak-jīn lí ê sin-hūn",
        "nav-login-createaccount": "Teng-ji̍p / khui sin kháu-chō",
        "logout": "Teng-chhut",
        "userlogout": "Teng-chhut",
        "createacct-reason": "理由:",
        "createacct-reason-ph": "為啥物你欲開一另外一个口座?",
        "createacct-submit": "Khui lí--ê kháu-chō",
-       "createacct-another-submit": "開另外一个口座",
+       "createacct-another-submit": "Chhòng-kiàn kháu-chō",
+       "createacct-continue-submit": "Kè-sio̍k kháu-chō chhòng-kiàn",
+       "createacct-another-continue-submit": "Kè-sio̍k kháu-chō chhòng-kiàn",
        "createacct-benefit-heading": "{{SITENAME}} sī uī tio̍h chhin-chhiūⁿ lí--ê lâng chiah lâi kiàn-li̍p--ê.",
-       "createacct-benefit-body1": "kái {{PLURAL:$1|pái|pái}}",
-       "createacct-benefit-body2": "{{PLURAL:$1|ia̍h|ia̍h}}",
+       "createacct-benefit-body1": "{{PLURAL:$1|pian-chi̍p}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|ia̍h}}",
        "createacct-benefit-body3": "choè-kīn {{PLURAL:$1|ê lâng ū kòng-hiàn|ê lâng ū kòng-hiàn}}",
        "badretype": "Lí su-ji̍p ê 2-cho· bi̍t-bé bô tùi.",
        "userexists": "Lí phah ê iōng-chiá miâ-chheng í-keng ū lâng iōng. Chhiáⁿ lí iōng pa̍t-ê miâ.",
        "emailnotauthenticated": "Lí ê e-mail chū-chí iáu-bōe khak-jīn ū-hāu, só·-í ē--kha ê e-mail kong-lêng bē-ēng-tit.",
        "noemailprefs": "Tī lí ê siat-piān chí-tēng chi̍t ê tiān-chú-phoe tē-chí thang hō͘ chia ê kong-lêng ē-tàng ēng.",
        "emailconfirmlink": "Chhiáⁿ khak-jīn lí ê e-mail chū-chí ū-hāu",
+       "accountcreated": "Kháu-chō chhòng-kiàn goân-sêng",
+       "createaccount-title": "Ūi {{SITENAME}} khui kháu-chō",
        "loginlanguagelabel": "Gí-giân: $1",
        "pt-login": "Teng-ji̍p",
        "pt-login-button": "Teng-ji̍p",
        "oldpassword": "Kū bi̍t-bé:",
        "newpassword": "Sin bi̍t-bé:",
        "retypenew": "Têng phah sin bi̍t-bé:",
+       "botpasswords-label-appid": "Bot miâ-hō:",
+       "botpasswords-label-create": "Chhòng-kiàn",
+       "botpasswords-label-update": "Kái-sin",
+       "botpasswords-label-cancel": "Chhú-siau",
+       "botpasswords-label-delete": "Thâi-tiāu",
        "resetpass_forbidden": "Bi̍t-bé bē-sái piàn.",
        "resetpass-submit-loggedin": "Kái bi̍t-bé",
        "resetpass-submit-cancel": "Chhú-siau",
        "sig_tip": "Lí ê chhiam-miâ kap sî-kan ìn-á",
        "hr_tip": "Thán-pîⁿ-chōa (hàn leh ēng)",
        "summary": "Khài-iàu:",
-       "subject": "Tê-bo̍k/piau-tê:",
+       "subject": "Tê-bo̍k:",
        "minoredit": "Che sī sió siu-kái",
        "watchthis": "Kàm-sī chit ia̍h",
        "savearticle": "Pó-chûn chit ia̍h",
        "previewnote": "'''Thê-chhéⁿ lí che sī 1 bīn kiám-cha chho͘-phe ēng--ê \"seng-khoàⁿ-ia̍h\", iáu-bōe pó-chûn--khí-lâi!'''",
        "session_fail_preview": "'''Pháiⁿ-sè! Gún chiām-sî bô hoat-tō͘ chhú-lí lí ê pian-chi̍p (goân-in: \"phàng-kiàn sú-iōng kî-kan ê chu-liāu\"). Lô-hoân têng chhì khoàⁿ-māi. Ká-sú iû-goân bô-hāu, ē-sái teng-chhut koh-chài teng-ji̍p hoān-sè tō ē-tit kái-koat.'''",
        "editing": "Siu-kái $1",
+       "creating": "Chhòng-kiàn $1",
        "editingsection": "Pian-chi̍p $1 (section)",
        "editingcomment": "Teh pian-chi̍p $1 (lâu-oē)",
        "editconflict": "Siu-kái sio-chhiong: $1",
        "search-nonefound": "Chhoē m̄ tio̍h",
        "powersearch-legend": "Kiám-sek",
        "preferences": "Siat-tēng",
-       "mypreferences": "Góa ê siat-tēng",
+       "mypreferences": "Siat-tēng",
        "prefs-skin": "Phôe",
        "skin-preview": "Chhì khoàⁿ",
        "datedefault": "Chhìn-chhái",
        "emailsent": "E-mail sàng chhut-khì ah",
        "emailsenttext": "Lí ê e-mail í-keng sàng chhut-khì ah.",
        "watchlist": "Góa ê kàm-sī-toaⁿ",
-       "mywatchlist": "Góa ê kàm-sī-toaⁿ",
+       "mywatchlist": "Kam-sī-toaⁿ",
        "watchlistfor2": "予$1 $2",
        "nowatchlist": "Lí ê kàm-sī-toaⁿ bô pòaⁿ hāng.",
        "watchnologin": "Bô teng-ji̍p",
        "blanknamespace": "(Chú-ia̍h)",
        "contributions": "{{GENDER:$1|Iōng-chiá}} ê kòng-hiàn",
        "contributions-title": "Iōng-chiá $1--ê kòng-hiàn",
-       "mycontris": "Góa ê kòng-hiàn",
+       "mycontris": "Kòng-hiàn",
        "anoncontribs": "Kòng-hiān",
        "nocontribs": "Chhōe bô tiâu-kiāⁿ ū-tùi ê hāng-bo̍k.",
        "uctop": "(siōng téng ê)",
        "sp-contributions-newbies": "Kan-taⁿ hián-sī sin kháu-chō ê kòng-kiàn",
        "sp-contributions-newbies-sub": "Sin lâi--ê",
        "sp-contributions-deleted": "Hō͘ lâng thâi tiāu ê kòng-hiàn",
+       "sp-contributions-uploads": "Ap-ló͘",
        "sp-contributions-talk": "thó-lūn",
        "sp-contributions-search": "Chhoē chhut kòng-kiàn",
        "sp-contributions-username": "IP Chū-chí a̍h iōng-chiá miâ:",
        "confirmemail_body_changed": "Ū lâng (IP $1, tāi-khài sī lí pún-lâng) tī {{SITENAME}} ēng chit-ê e-mail chū-chí chù-chheh 1 ê kháu-chō \"$2\".\n\nChhiáⁿ khui ē-kha chit-ê liân-kiat, thang khak-jīn chit-ê kháu-chō si̍t-chāi sī lí ê:\n\n$3\n\nNā-chún *m̄-sī* lí, chhiáⁿ khui ē-kha chit-ê liân-kiat,  chhú-siau khak-jīn ê e-mail.\n\n$5\n\nChit tiuⁿ phoe ê khak-jīn-bé ē chū-tōng tī $4 kòe-kî.",
        "confirmemail_body_set": "Ū lâng (IP $1, tāi-khài sī lí pún-lâng) tī {{SITENAME}} ēng chit-ê e-mail chū-chí chù-chheh 1 ê kháu-chō \"$2\".\n\nChhiáⁿ khui ē-kha chit-ê liân-kiat, thang khak-jīn chit-ê kháu-chō si̍t-chāi sī lí ê:\n\n$3\n\nNā-chún *m̄-sī* lí, chhiáⁿ khui ē-kha chit-ê liân-kiat,  chhú-siau khak-jīn ê e-mail.\n\n$5\n\nChit tiuⁿ phoe ê khak-jīn-bé ē chū-tōng tī $4 kòe-kî.",
        "confirm-purge-top": "Kā chit ia̍h ê cache piàⁿ tiāu?",
+       "colon-separator": ":&#32;",
        "table_pager_next": "Aū-chi̍t-ia̍h",
        "table_pager_prev": "Téng-chi̍t-ia̍h",
        "table_pager_first": "Thâu-chi̍t-ia̍h",
index 0f7cdb2..46ecd0e 100644 (file)
        "savearticle": "Lagre siden",
        "savechanges": "Lagre endringer",
        "publishpage": "Publiser siden",
-       "publishchanges": "Publiser endringer",
+       "publishchanges": "Publiser endringene",
        "preview": "Forhåndsvisning",
        "showpreview": "Forhåndsvisning",
        "showdiff": "Vis endringer",
        "post-expand-template-argument-warning": "Advarsel: Siden inneholder ett eller flere malparametere som blir for lange når de utvides.\nDisse parameterne har blitt utelatt.",
        "post-expand-template-argument-category": "Sider med utelatte malparametere",
        "parser-template-loop-warning": "Mal-loop oppdaget: [[$1]]",
+       "template-loop-category": "Sider med malsløyfer",
+       "template-loop-category-desc": "Siden inneholder en malløkke, altså en mal som kaller seg selv rekursivt.",
        "parser-template-recursion-depth-warning": "Mal er brukt for mange ganger ($1)",
        "language-converter-depth-warning": "Dybdegrense for språkkonvertering overskredet ($1)",
        "node-count-exceeded-category": "Sider hvor antallet noder er overskredet",
        "page_first": "første",
        "page_last": "siste",
        "histlegend": "Valg av diff: merk i radioboksene de revisjonene du ønsker å sammenligne og trykk enter eller knappen nederst på siden.<br />\nForklaring: '''({{int:cur}})''' = forskjell fra nåværende revisjon, '''({{int:last}})''' = forskjell fra foregående revisjon, '''{{int:minoreditletter}}''' = mindre endring.",
-       "history-fieldset-title": "Bla i historikken",
-       "history-show-deleted": "Kun slettede",
+       "history-fieldset-title": "Søk etter revisjoner",
+       "history-show-deleted": "Kun slettede revisjoner",
        "histfirst": "eldste",
        "histlast": "nyeste",
        "historysize": "({{PLURAL:$1|1 byte|$1 byte}})",
        "prefs-help-prefershttps": "Denne preferansen vil virke etter neste innlogging.",
        "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": "Bruker&shy;rettigheter",
        "userrights-lookup-user": "Velg en bruker",
        "userrights-user-editname": "Fyll inn et brukernavn:",
        "editusergroup": "Last brukergrupper",
        "saveusergroups": "Lagre {{GENDER:$1|brukergrupper}}",
        "userrights-groupsmember": "Medlem av:",
        "userrights-groupsmember-auto": "Implisitt medlem av:",
-       "userrights-groups-help": "Du kan endre hvilke grupper denne brukeren er medlem av.\n* En avkrysset boks betyr at brukeren er medlem av gruppen.\n* En uavkrysset boks betyr at brukeren ikke er medlem av gruppen.\n* En * betyr at du ikke kan fjerne gruppemedlemskapet når du har lagt det til, eller vice versa.\n* En # betyr at du kun kan forkorte utløpstiden til denne gruppen, du kan ikke forlenge den.",
+       "userrights-groups-help": "Du kan endre hvilke grupper denne brukeren er medlem av.\n* En avkrysset boks betyr at brukeren er medlem av gruppen.\n* En uavkrysset boks betyr at brukeren ikke er medlem av gruppen.\n* En * betyr at du ikke kan fjerne gruppemedlemskapet når du har lagt det til, eller vice versa.\n* En # betyr at du kun kan forkorte utløpstiden til dette gruppemedlemskapet, du kan ikke forlenge den.",
        "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-expiry-options": "1 dag:1 day,1 uke:1 week,1 måned:1 month,3 måneder:3 months,6 måneder:6 months,1 år:1 year",
        "userrights-invalid-expiry": "Utløpstiden for gruppa «$1» er ugyldig.",
        "userrights-expiry-in-past": "Utløpstiden for gruppa «$1» har vært.",
-       "userrights-cannot-shorten-expiry": "Du kan ikke forlenge utløpstiden til gruppa «$1». Bare brukere med tillatelse til å legge til eller fjerne denne gruppa kan forlenge utløpstider.",
+       "userrights-cannot-shorten-expiry": "Du kan ikke forlenge utløpstiden til gruppemedlemskapet i «$1». Bare brukere med tillatelse til å legge til eller fjerne denne gruppa kan forlenge utløpstider.",
        "userrights-conflict": "En konflikt med endringen av brukerrettigheter! Vær vennlig å sjekke og på nytt bekrefte endringene dine.",
        "group": "Gruppe:",
        "group-user": "Brukere",
        "rcfilters-invalid-filter": "Ugyldig filter",
        "rcfilters-empty-filter": "Ingen aktive filtre. Alle bidrag vises.",
        "rcfilters-filterlist-title": "Filtre",
+       "rcfilters-filterlist-whatsthis": "Hva er dette?",
        "rcfilters-filterlist-feedbacklink": "Gi tilbakemelding på de nye (beta)filtrene",
        "rcfilters-highlightbutton-title": "Marker resultater",
        "rcfilters-highlightmenu-title": "Velg en farge",
+       "rcfilters-highlightmenu-help": "Velg en farge for å merke denne egenskapen",
        "rcfilters-filterlist-noresults": "Ingen filtre funnet",
+       "rcfilters-noresults-conflict": "Ingen resultater funnet fordi søkekriteriene konflikterer",
+       "rcfilters-state-message-subset": "Dette filteret har ingen effekt fordi resultatene dens inkluderes i følgende, bredere {{PLURAL:$2|filter|filtre}} (prøv å merke for å skille det ut): $1",
+       "rcfilters-state-message-fullcoverage": "Å velge alle filtre i en gruppe er det samme som å velge ingen, så dette filteret har ingen effekt. Gruppa inkluderer: $1",
        "rcfilters-filtergroup-registration": "Brukerregistrering",
        "rcfilters-filter-registered-label": "Registrerte",
        "rcfilters-filter-registered-description": "Innloggede brukere.",
        "rcfilters-filter-unregistered-label": "Uregistrerte",
        "rcfilters-filter-unregistered-description": "Brukere som ikke er logget inn.",
+       "rcfilters-filter-unregistered-conflicts-user-experience-level": "Dette filteret konflikterer med følgende {{PLURAL:$2|erfaringsfilter|erfaringsfiltre}}, som finner kun registrerte brukere: $1",
        "rcfilters-filtergroup-authorship": "Redigeringens forfatter",
        "rcfilters-filter-editsbyself-label": "Dine egne redigeringer",
        "rcfilters-filter-editsbyself-description": "Redigeringer gjort av deg.",
        "rcfilters-filter-editsbyother-label": "Redigeringer av andre",
        "rcfilters-filter-editsbyother-description": "Redigeringer som er gjort av andre brukere enn deg.",
        "rcfilters-filtergroup-userExpLevel": "Erfaringsnivå (kun for registrerte brukere)",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "Erfaringsfiltre finner kun registrerte brukere, så dette filteret konflikterer med filteret «Uregistrerte».",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "Filteret «Uregistrerte» konflikterer med ett eller flere erfaringsfiltre, som kun finner registrerte brukere. De konflikterende filtrene merkes i området for aktive filtre ovenfor.",
        "rcfilters-filter-user-experience-level-newcomer-label": "Nykommere",
        "rcfilters-filter-user-experience-level-newcomer-description": "Færre enn 10 redigeringer og 4 dagers aktivitet.",
        "rcfilters-filter-user-experience-level-learner-label": "Nybegynnere",
        "rcfilters-filter-bots-description": "Redigeringer gjort med automatiske verktøy.",
        "rcfilters-filter-humans-label": "Menneske (ikke bot)",
        "rcfilters-filter-humans-description": "Redigeringer gjort av menneskelige brukere.",
+       "rcfilters-filtergroup-reviewstatus": "Gjennomgangsstatus",
+       "rcfilters-filter-patrolled-label": "Patruljert",
+       "rcfilters-filter-patrolled-description": "Redigeringer merket som patruljert.",
+       "rcfilters-filter-unpatrolled-label": "Upatruljert",
+       "rcfilters-filter-unpatrolled-description": "Redigeringer som ikke er merket som patruljert.",
        "rcfilters-filtergroup-significance": "Betydning",
        "rcfilters-filter-minor-label": "Mindre endringer",
        "rcfilters-filter-minor-description": "Redigeringer merket som mindre av brukeren.",
        "rcfilters-filter-categorization-description": "Sporer sider som legges til i eller fjernes fra kategorier.",
        "rcfilters-filter-logactions-label": "Loggførte handlinger",
        "rcfilters-filter-logactions-description": "Administrative handlinger, kontoopprettelser, sideslettinger, opplastinger ...",
+       "rcfilters-hideminor-conflicts-typeofchange-global": "Filteret for «Mindre endringer» konflikterer med ett eller flere endringstypefiltre, fordi visse endringstyper ikke kan merkes som «mindre». De konflikterende fultrene merkes i området for aktive filtre ovenfor.",
+       "rcfilters-hideminor-conflicts-typeofchange": "Visse endringstyper kan ikke merkes som «mindre», så dette filteret konflikterer med følgende endringstypefiltre: $1",
+       "rcfilters-typeofchange-conflicts-hideminor": "Dette endringstypefilteret konflikterer med filteret for «Mindre endringer». Visse endringstyper kan ikke merkes som «mindre».",
        "rcnotefrom": "Nedenfor er vist {{PLURAL:$5|endringen|endringene}} som er gjort siden <strong>$3, $4</strong> (frem til <strong>$1</strong>).",
+       "rclistfromreset": "Nullstill datovalg",
        "rclistfrom": "Vis nye endringer fra og med $3 $2",
        "rcshowhideminor": "$1 mindre endringer",
        "rcshowhideminor-show": "Vis",
        "php-uploaddisabledtext": "PHP-filopplasting er deaktivert. Sjekk innstillingen for file_uploads.",
        "uploadscripted": "Denne filen inneholder HTML eller skripting som kan feiltolkes av en nettleser.",
        "upload-scripted-pi-callback": "Det er ikke tillatt å laste opp en fil som inneholder et kjørbart XML-stilark.",
+       "upload-scripted-dtd": "Kan ikke laste opp SVG-filer som har en ikke-standard DTD-erklæring.",
        "uploaded-script-svg": "Fant et skriptelement \"$1\" i den opplastede SVG-koden.",
        "uploaded-hostile-svg": "Fant usikker CSS i stilelementet til opplastet SVG-fil",
        "uploaded-event-handler-on-svg": "Å sette event-handler-attributtene <code>$1=\"$2\"</code> tillates ikke i SVG-filer.",
        "undeleteviewlink": "vis",
        "undeleteinvert": "Inverter valg",
        "undeletecomment": "Årsak:",
-       "undeletedrevisions": "{{PLURAL:$1|Én revisjon|$1 revisjoner}} gjenopprettet",
-       "undeletedrevisions-files": "{{PLURAL:$1|Én revisjon|$1 revisjoner}} og {{PLURAL:$2|én fil|$2 filer}} gjenopprettet",
-       "undeletedfiles": "{{PLURAL:$1|Én fil|$1 filer}} gjenopprettet",
        "cannotundelete": "Deler av eller hele gjennopprettingen feilet:\n$1",
        "undeletedpage": "'''$1 ble gjenopprettet'''\n\nSjekk [[Special:Log/delete|slettingsloggen]] for en liste over nylige slettinger og gjenopprettelser.",
        "undelete-header": "Se [[Special:Log/delete|slettingsloggen]] for nylig slettede sider.",
        "newimages-summary": "Denne spesialsiden viser de sist opplastede filene.",
        "newimages-legend": "Filnavn",
        "newimages-label": "Filnavn (helt eller delvis):",
+       "newimages-user": "IP-adresse eller brukernavn",
        "newimages-showbots": "Vis opplastinger av botter",
        "newimages-hidepatrolled": "Skjul patruljerte opplastinger",
        "noimages": "Ingenting å se.",
        "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-restore": "$1 {{GENDER:$2|gjenopprettet}} siden $3 ($4)",
+       "logentry-delete-restore-nocount": "$1 {{GENDER:$2|gjenopprettet}} siden $3",
+       "restore-count-revisions": "{{PLURAL:$1|Én revisjon|$1 revisjoner}}",
+       "restore-count-files": "{{PLURAL:$1|Én fil|$1 filer}}",
        "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",
        "logentry-delete-event-legacy": "$1 {{GENDER:$2|endret}} synligheten av logghendelser på $3",
        "special-characters-group-thai": "Thai",
        "special-characters-group-lao": "Laotisk",
        "special-characters-group-khmer": "Khmer",
+       "special-characters-group-canadianaboriginal": "Kanadisk stavelsesskrift",
        "special-characters-title-endash": "tankestrek",
        "special-characters-title-emdash": "lang tankestrek",
        "special-characters-title-minus": "minustegn",
        "restrictionsfield-label": "Tillatte IP-intervaller:",
        "restrictionsfield-help": "Én IP-adresse eller CIDR-intervall per linje. For å slå på alt, bruk: <pre>0.0.0.0/0\n::/0</pre>",
        "revid": "revisjon $1",
-       "pageid": "side-ID $1"
+       "pageid": "side-ID $1",
+       "rawhtml-notallowed": "&lt;html&gt;-tagger kan ikke brukes utenfor normale sider.",
+       "gotointerwiki": "Forlater {{SITENAME}}",
+       "gotointerwiki-invalid": "Den gitte tittelen var ugyldig.",
+       "gotointerwiki-external": "Du er i ferd med å forlate {{SITENAME}} for å besøke [[$2]], som er et annet nettsted.\n\n[$1 Klikk her for å fortsette til $1].",
+       "undelete-cantedit": "Du kan ikke gjenopprette denne siden fordi du ikke har tillatelse til å redigere den.",
+       "undelete-cantcreate": "Du kan ikke gjenopprette denne siden fordi det ikke er noen eksisterende side med dette navnet, og du ikke har tillatelse til å opprette siden."
 }
index c6cbc54..7f7b847 100644 (file)
@@ -84,7 +84,8 @@
                        "Xxmarijnw",
                        "Mainframe98",
                        "QZanden",
-                       "Huhbakker"
+                       "Huhbakker",
+                       "Jos1950"
                ]
        },
        "tog-underline": "Verwijzingen onderstrepen:",
        "login-migrated-generic": "Uw gebruikersnaam is hernoemd, en uw gebruikersnaam bestaat niet langer op deze wiki.",
        "loginlanguagelabel": "Taal: $1",
        "suspicious-userlogout": "Uw verzoek om af te melden is genegeerd, omdat het lijkt alsof het verzoek is verzonden door een browser of cacheproxy die stuk is.",
-       "createacct-another-realname-tip": "Echte naam is optioneel.\nAls u deze opgeeft, wordt deze naam gebruikt worden om u erkenning te geven voor uw werk.",
+       "createacct-another-realname-tip": "Een echte naam is optioneel.\nAls u deze opgeeft, wordt deze naam gebruikt ter erkenning voor uw werk.",
        "pt-login": "Aanmelden",
        "pt-login-button": "Aanmelden",
        "pt-login-continue-button": "Doorgaan met aanmelden",
        "page_first": "eerste",
        "page_last": "laatste",
        "histlegend": "Selectie voor verschillen: selecteer de te vergelijken versies en toets ENTER of de knop onderaan.<br />\nVerklaring afkortingen: '''({{int:cur}})''' = verschil met huidige versie, '''({{int:last}})''' = verschil met voorgaande versie, '''{{int:minoreditletter}}''' = kleine wijziging",
-       "history-fieldset-title": "Door geschiedenis bladeren",
+       "history-fieldset-title": "Naar versies zoeken",
        "history-show-deleted": "Alleen verwijderde versies",
        "histfirst": "oudste",
        "histlast": "nieuwste",
        "saveusergroups": "{{GENDER:$1|Gebruikersgroepen}} opslaan",
        "userrights-groupsmember": "Lid van:",
        "userrights-groupsmember-auto": "Impliciet lid van:",
-       "userrights-groups-help": "U kunt de groepen wijzigen waar deze gebruiker lid van is.\n* Een aangekruist vakje betekent dat de gebruiker lid is van de groep.\n* Een niet aangekruist vakje betekent dat de gebruiker geen lid is van de groep.\n* Een \"*\" betekent dat u een gebruiker niet uit een groep kunt verwijderen nadat u die hebt toegevoegd of vice versa.\n* Een \"#\" betekent dat u de verlooptijd van deze groep alleen kunt verkorten. U kunt deze niet verlengen.",
+       "userrights-groups-help": "U kunt de groepen wijzigen waar deze gebruiker lid van is.\n* Een aangekruist vakje betekent dat de gebruiker lid is van de groep.\n* Een niet aangekruist vakje betekent dat de gebruiker geen lid is van de groep.\n* Een \"*\" betekent dat u een gebruiker niet uit een groep kunt verwijderen nadat u die hebt toegevoegd of vice versa.\n* Een \"#\" betekent dat u dit groepslidmaatschap alleen kunt verlengen. U kunt het niet verkorten.",
        "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-expiry-options": "1 dag:1 day,1 week:1 week,1 maand:1 month,3 maanden:3 months,6 maanden:6 months,1 jaar:1 year",
        "userrights-invalid-expiry": "De vervaltijd voor de groep \"$1\" is ongeldig.",
        "userrights-expiry-in-past": "De vervaltijd voor de groep \"$1\" is in het verleden.",
-       "userrights-cannot-shorten-expiry": "Kunt de verlooptijd van de groep \"$1\" niet verkorten. Alleen gebruiker met het recht om deze groep toe te voegen of te verwijderen kunnen de verlooptijd verkorten.",
+       "userrights-cannot-shorten-expiry": "U kunt de verlooptijd van het groepslidmaatschip van groep \"$1\" niet verkorten. Alleen gebruikers met het recht om deze groep toe te voegen of te verwijderen kunnen de verlooptijd verkorten.",
        "userrights-conflict": "Er is een probleem opgetreden tijdens het instellen van de gebruikersrechten! Controleer en bevestig uw wijzigingen.",
        "group": "Groep:",
        "group-user": "gebruikers",
        "rcfilters-invalid-filter": "Ongeldig filter",
        "rcfilters-empty-filter": "Geen actieve filters. Alle bijdragen worden weergeven.",
        "rcfilters-filterlist-title": "Filters",
+       "rcfilters-filterlist-whatsthis": "Wat is dit?",
        "rcfilters-filterlist-feedbacklink": "Geef feedback op de nieuwe (beta) filters",
        "rcfilters-highlightbutton-title": "Resultaten markeren",
        "rcfilters-highlightmenu-title": "Kies een kleur",
        "rcfilters-highlightmenu-help": "Selecteer een kleur om deze eigenschap uit te lichten",
        "rcfilters-filterlist-noresults": "Geen filters gevonden",
+       "rcfilters-noresults-conflict": "Geen resultaten gevonden omdat de zoekcriteria met elkaar conflicteren",
        "rcfilters-filtergroup-registration": "Gebruikers-registratie",
        "rcfilters-filter-registered-label": "Geregistreerd",
        "rcfilters-filter-registered-description": "Ingelogde gebruikers.",
        "rcfilters-filter-logactions-label": "Geregistreerde acties",
        "rcfilters-filter-logactions-description": "Administratieve handelingen, account creaties, pagina verwijderingen, uploads....",
        "rcnotefrom": "Wijzigingen sinds <strong>$3 om $4</strong> (maximaal <strong>$1</strong> {{PLURAL:$1|wijziging|wijzigingen}}).",
+       "rclistfromreset": "Datum selectie opnieuw instellen",
        "rclistfrom": "Wijzigingen bekijken vanaf $3 $2",
        "rcshowhideminor": "Kleine bewerkingen $1",
        "rcshowhideminor-show": "weergeven",
        "php-uploaddisabledtext": "Het uploaden van bestanden is uitgeschakeld in PHP.\nControleer de instelling \"file_uploads\".",
        "uploadscripted": "Dit bestand bevat HTML- of scriptcode die foutief door uw browser kan worden weergegeven.",
        "upload-scripted-pi-callback": "Het uploaden van een bestand met instructies voor de verwerking van XML-stylesheets is niet mogelijk.",
+       "upload-scripted-dtd": "Kan geen SVG bestanden uploaden die een DTD declaratie bevatten dat niet aan de standaard voldoet.",
        "uploaded-script-svg": "Scriptbaar element \"$1\" in het geüploade SVG-bestand gevonden.",
        "uploaded-hostile-svg": "Onveilige CSS in het \"style\"-element van het geüploade SVG-bestand gevonden.",
        "uploaded-event-handler-on-svg": "Het instellen van de event-handlereigenschappen <code>$1=\"$2\"</code> is niet toegestaan in SVG-bestanden.",
        "undeleteviewlink": "bekijken",
        "undeleteinvert": "Selectie omkeren",
        "undeletecomment": "Reden:",
-       "undeletedrevisions": "$1 {{PLURAL:$1|versie|versies}} teruggeplaatst",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 versie|$1 versies}} en {{PLURAL:$2|1 bestand|$2 bestanden}} teruggeplaatst",
-       "undeletedfiles": "{{PLURAL:$1|1 bestand|$1 bestanden}} teruggeplaatst",
        "cannotundelete": "Het terugplaatsen is (gedeeltelijk) mislukt:\n$1",
        "undeletedpage": "'''$1 is teruggeplaatst'''\n\nIn het [[Special:Log/delete|verwijderingslogboek]] staan recente verwijderingen en herstelhandelingen.",
        "undelete-header": "Zie het [[Special:Log/delete|verwijderingslogboek]] voor recent verwijderde pagina's.",
        "newimages-summary": "Op deze speciale pagina worden de meest recent toegevoegde bestanden weergegeven.",
        "newimages-legend": "Bestandsnaam",
        "newimages-label": "Bestandsnaam (of deel daarvan):",
+       "newimages-user": "IP-adres of gebruikersnaam",
        "newimages-showbots": "Uploads door bots weergeven",
        "newimages-hidepatrolled": "Gecontroleerde uploads verbergen",
        "noimages": "Er is niets te zien.",
        "htmlform-user-not-valid": "<strong>$1</strong> is geen geldige gebruikersnaam.",
        "logentry-delete-delete": "$1 {{GENDER:$2|heeft}} de pagina $3 verwijderd",
        "logentry-delete-delete_redir": "$1 heeft de doorverwijzing $3 {{GENDER:$2|verwijderd}} door deze te overschrijven",
-       "logentry-delete-restore": "$1 {{GENDER:$2|heeft}} de pagina $3 teruggeplaatst",
+       "logentry-delete-restore": "$1 {{GENDER:$2|heeft}} de pagina $3 ($4) teruggeplaatst",
+       "logentry-delete-restore-nocount": "$1 {{GENDER:$2|heeft}} de pagina $3 teruggeplaatst",
+       "restore-count-revisions": "{{PLURAL:$1|1 versie|$1 versies}}",
+       "restore-count-files": "{{PLURAL:$1|1 bestand|$1 bestanden}}",
        "logentry-delete-event": "$1 {{GENDER:$2|heeft}} de zichtbaarheid van {{PLURAL:$5|een logboekregel|$5 logboekregels}} van $3 gewijzigd: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|heeft}} de zichtbaarheid van {{PLURAL:$5|een versie|$5 versies}} van de pagina $3 gewijzigd: $4",
        "logentry-delete-event-legacy": "$1 {{GENDER:$2|heeft}} de zichtbaarheid van logboekregels van $3 gewijzigd",
        "special-characters-group-thai": "Thai",
        "special-characters-group-lao": "Laotiaans",
        "special-characters-group-khmer": "Khmer",
+       "special-characters-group-canadianaboriginal": "Canadees Aboriginal",
        "special-characters-title-endash": "liggend streepje",
        "special-characters-title-emdash": "gedachtenstreepje",
        "special-characters-title-minus": "minteken",
        "restrictionsfield-label": "Toegestane IP-ranges:",
        "restrictionsfield-help": "Een IP-adres of CIDR bereik per lijn. Om alles toe te staan, gebruik:<pre>0.0.0.0/0\n::/0</pre>",
        "revid": "versie $1",
-       "pageid": "Pagina-ID $1"
+       "pageid": "Pagina-ID $1",
+       "rawhtml-notallowed": "&lt;html&gt; tags kunnen alleen op normale pagina's geplaatst worden.",
+       "gotointerwiki": "{{SITENAME}} verlaten",
+       "gotointerwiki-invalid": "De opgegeven titel is ongeldig.",
+       "gotointerwiki-external": "U staat op het punt om {{SITENAME}} te verlaten en [[$2]] te bezoeken. [[$2]] is een aparte website.\n\n[$1 Klik hier om door te gaan naar $1].",
+       "undelete-cantedit": "U kunt deze pagina niet terug plaatsen omdat u niet het recht hebt om deze pagina te bewerken.",
+       "undelete-cantcreate": "U kunt deze pagina niet terugplaatsen omdat er geen bestaande pagina met deze naam is en u geen toestemming hebt om deze pagina aan te maken."
 }
index 34c9782..38debcb 100644 (file)
        "cantcreateaccount-text": "Kontooppretting frå denne IP-adressa ('''$1''') er blokkert av [[User:$3|$3]].\n\nGrunnen som vart gjeven av $3 er ''$2''",
        "viewpagelogs": "Vis loggane for sida",
        "nohistory": "Det finst ikkje nokon historikk for denne sida.",
-       "currentrev": "Versjonen no",
-       "currentrev-asof": "Versjonen no frå $1",
+       "currentrev": "Siste versjonen",
+       "currentrev-asof": "Siste versjonen frå $1",
        "revisionasof": "Versjonen frå $1",
        "revision-info": "Versjonen frå $1 av {{GENDER:$6|$2}}$7",
        "previousrevision": "← Eldre versjon",
        "nextrevision": "Nyare versjon →",
-       "currentrevisionlink": "Versjonen no",
+       "currentrevisionlink": "Siste versjonen",
        "cur": "no",
        "next": "neste",
        "last": "førre",
index 4ffdd93..5c04f76 100644 (file)
        "missingsummary": "'''Atencion :''' avètz pas modificat lo resumit de vòstra modificacion. Se clicatz tornarmai sul boton « Salvar », lo salvament serà fait sens avertiment mai.",
        "missingcommenttext": "Mercé de metre un comentari çaijós.",
        "missingcommentheader": "<strong>Rapèl :</strong> Avètz pas provesit cap de subjècte per aqueste comentari.\nSe clicatz tornamai sus « {{int:Savearticle}} », vòstra modificacion serà enregistrada sens subjècte.",
-       "summary-preview": "Previsualizacion del resumit :",
-       "subject-preview": "Previsualizacion del subjècte",
+       "summary-preview": "Apercebut del resumit de modificacion :",
+       "subject-preview": "Apercebut del subjècte :",
        "blockedtitle": "L'utilizaire es blocat",
        "blockedtext": "'''Vòstre compte d'utilizaire o vòstra adreça IP es estat blocat'''\n\nLo blocatge es estat efectuat per $1.\nLa rason invocada es la seguenta : ''$2''.\n\n* Començament del blocatge : $8\n* Expiracion del blocatge : $6\n* Compte blocat : $7.\n\nPodètz contactar $1 o un autre [[{{MediaWiki:Grouppage-sysop}}|administrator]] per ne discutir.\nPodètz pas utilizar la foncion « Mandar un corrièr electronic a aqueste utilizaire » que se una adreça de corrièr valida es especificada dins vòstras [[Special:Preferences|preferéncias]].\nVòstra adreça IP actuala es $3 e vòstre identificant de blocatge es #$5.\nIncluissètz aquesta adreça dins tota requèsta.",
        "autoblockedtext": "Vòstra adreça IP es estada blocada automaticament perque es estada utilizada per un autre utilizaire, ele-meteis blocat per $1.\nLa rason invocadaa es :\n\n:''$2''\n\n* Començament del blocatge : $8\n* Expiracion del blocatge : $6\n* Compte blocat : $7\n\nPodètz contactar $1 o un dels autres [[{{MediaWiki:Grouppage-sysop}}|administrators]] per discutir d'aqueste blocatge.\n\nNotatz que podètz pas utilizar la foncionalitat \"Mandar un messatge a aqueste utilizaire\" tant qu'auretz pas  una adreça e-mail enregistrada dins vòstras [[Special:Preferences|preferéncias]] e tant que seretz pas blocat per son utilizacion.\n\nVòstra adreça IP actuala es $3, e lo numèro de blocatge es $5.\nPrecisatz aquestas indicacions dins totas las requèstas que faretz.",
        "page_first": "primièra",
        "page_last": "darrièra",
        "histlegend": "Legenda : ({{MediaWiki:Cur}}) = diferéncia amb la version actuala ,\n({{MediaWiki:Last}}) = diferéncia amb la version precedenta, <b>m</b> = cambiament menor",
-       "history-fieldset-title": "Percórrer l'istoric",
-       "history-show-deleted": "Suprimits solament",
+       "history-fieldset-title": "Recercar de revisions",
+       "history-show-deleted": "Revision suprimida unicament",
        "histfirst": "Las mai ancianas",
        "histlast": "Las mai recentas",
        "historysize": "({{PLURAL:$1|1 octet|$1 octets}})",
        "prefs-diffs": "Diferéncias",
        "prefs-help-prefershttps": "Aquesta preferéncia serà efectiva al moment de vòstra connexion que ven.",
        "prefs-tabs-navigation-hint": "Astúcia : Podètz utilizar las sagetas d'esquèrra e de dreita per navigar entre los onglets.",
-       "userrights": "Gestion dels dreits d'utilizaire",
+       "userrights": "Dreits dels utilizaires",
        "userrights-lookup-user": "Seleccionar un utilizaire",
        "userrights-user-editname": "Entrar un nom d’utilizaire :",
        "editusergroup": "Cargar de gropes d’utilizaires",
        "rcfilters-filter-editsbyself-label": "Vòstras pròprias modificacions",
        "rcfilters-filter-editsbyself-description": "Vòstras modificacions.",
        "rcfilters-filter-editsbyother-label": "Modificacions per d’autres.",
-       "rcfilters-filter-userExpLevel-newcomer-label": "Novèls arribants",
-       "rcfilters-filter-userExpLevel-learner-label": "Aprenents",
-       "rcfilters-filter-userExpLevel-experienced-label": "Utilizaires experimentats",
+       "rcfilters-filter-user-experience-level-newcomer-label": "Novèls arribants",
+       "rcfilters-filter-user-experience-level-learner-label": "Aprenents",
+       "rcfilters-filter-user-experience-level-experienced-label": "Utilizaires experimentats",
        "rcfilters-filtergroup-automated": "Contribucions automatizadas",
        "rcfilters-filter-bots-label": "Robòt",
        "rcfilters-filter-humans-label": "Èsser uman (pas robòt)",
        "protect-expiry-options": "1 ora:1 hour,1 jorn:1 day,1 setmana:1 week,2 setmanas:2 weeks,1 mes:1 month,3 meses:3 months,6 meses:6 months,1 an:1 year,indefinidament:infinite",
        "restriction-type": "Permission :",
        "restriction-level": "Nivèl de restriccion :",
-       "minimum-size": "Talha minimoma",
+       "minimum-size": "Talha minimala",
        "maximum-size": "Talha maximala :",
        "pagesize": "(octets)",
        "restriction-edit": "Modificacion",
index b77db9d..e195566 100644 (file)
        "editlink": "kohendele",
        "viewsourcelink": "Kačo algukoodu",
        "editsectionhint": "Kohendele tädä kohtua: $1",
-       "toc": "Sizäldö",
+       "toc": "Syväindö",
        "showtoc": "ozuttua",
-       "hidetoc": "peittiä",
+       "hidetoc": "peitä",
        "collapsible-collapse": "Peitä",
        "collapsible-expand": "Levitä",
        "confirmable-confirm": "{{GENDER:$1|Oletgo}} varmu?",
        "password-change-forbidden": "Et voi vaihtua peittosanoi täs wikis.",
        "login": "Kirjuttai",
        "nav-login-createaccount": "Kirjuttai libo registriiruiččei",
-       "userlogin": "Kirjuttai libo registriiruiččei",
-       "userloginnocreate": "Kirjuttai",
        "logout": "Kirjuttai ullos",
        "userlogout": "Kirjuttai ullos",
        "notloggedin": "Ei kirjutannuhes",
        "userlogin-noaccount": "Ei ole tilii?",
        "userlogin-joinproject": "Yhty {{SITENAME}}",
-       "nologin": "Ei ole tilii? $1",
-       "nologinlink": "Luaji tili",
        "createaccount": "Registriiruiččei",
-       "gotaccount": "Ollou sinul jo tunnus? $1",
-       "gotaccountlink": "Kirjuttai",
-       "userlogin-resetlink": "Unohtitgo sinun käyttäinimen/peittosanan?",
        "userlogin-resetpassword-link": "Unohtitgo sinun peittosanan?",
        "userlogin-helplink2": "Abuu kirjuttamizeh",
        "userlogin-loggedin": "Olet jo kirjutannuhes nimel {{GENDER:$1|$1}}.\nKäytä al olijua ankiettua ku kirjuttuakseh eri käyttäjänny.",
        "createacct-email-ph": "Kirjuta sinun sähköpoštuadressu",
        "createacct-another-email-ph": "Kirjuta sinun sähköpoštuadressu",
        "createacct-realname": "Tovelline nimi (omatahtoine tiedo)",
-       "createaccountreason": "Syy:",
        "createacct-reason": "Syy",
        "createacct-reason-ph": "Mindäh olet luadimas tostu käyttäitilii",
        "createacct-submit": "Luaji tili",
        "prefs-changeemail": "Vaihta libo ota iäre sähköpoštuadressu",
        "prefs-setemail": "Kirjuta sähköpoštuadressu",
        "saveprefs": "Tallenda",
-       "rows": "Riädyy:",
        "searchresultshead": "Eččie",
        "timezoneregion-africa": "Afriekku",
        "timezoneregion-america": "Ameriekku",
        "rcshowhideanons-show": "Ozuta",
        "rcshowhideanons-hide": "Peitä",
        "rcshowhidepatr-show": "Ozuttua",
-       "rcshowhidepatr-hide": "Peittiä",
+       "rcshowhidepatr-hide": "Peitä",
        "rcshowhidemine": "$1 minun kohendukset",
        "rcshowhidemine-show": "Ozuta",
        "rcshowhidemine-hide": "Peitä",
index 19e7e17..5efeb94 100644 (file)
        "login": "ଲଗ-ଇନ (Log in)",
        "login-security": "ଆପଣଙ୍କ ପରିଚୟ ଯାଞ୍ଚ କରନ୍ତୁ",
        "nav-login-createaccount": "ଲଗ ଇନ /ନୂଆ ଖାତା ଖୋଲନ୍ତୁ",
-       "userlogin": "ଲଗ ଇନ /ନୂଆ ଖାତା ଖୋଲନ୍ତୁ",
-       "userloginnocreate": "ଲଗ-ଇନ (Log in)",
        "logout": "ଲଗଆଉଟ",
        "userlogout": "ଲଗ ଆଉଟ",
        "notloggedin": "ଲଗ‌‌ ଇନ କରିନାହାନ୍ତି",
        "userlogin-noaccount": "ଖାତାଟିଏ ନାହିଁ?",
        "userlogin-joinproject": "{{SITENAME}}ରେ ଯୋଗଦିଅନ୍ତୁ",
-       "nologin": "ଖାତାଟିଏ ନାହିଁ? $1।",
-       "nologinlink": "ନୂଆ ଖାତାଟିଏ ଖୋଲନ୍ତୁ",
        "createaccount": "ନୂଆ ଖାତାଟିଏ ଖୋଲନ୍ତୁ",
-       "gotaccount": "ଆଗରୁ ଖାତାଟିଏ ଅଛି କି? $1.",
-       "gotaccountlink": "ଲଗ ଇନ (Log in)",
-       "userlogin-resetlink": "ଲଗଇନ ତଥ୍ୟ ସବୁ ଭୁଲିଗେଲେକି?",
        "userlogin-resetpassword-link": "ପାସୱାର୍ଡ଼ ମନେପଡୁନାହିଁ?",
        "userlogin-helplink2": "ଲଗ ଇନ ପାଇଁ ସହଯୋଗ କରନ୍ତୁ",
        "userlogin-loggedin": "ଆପଣ {{GENDER:$1|$1}} ନାମରେ ଲଗ ଇନ କରିଛନ୍ତି । ତଳ ଫର୍ମଟି ବ୍ୟବହାର କରି ଆଉ ଜଣେ ସଭ୍ୟ ଭାବେ ଲଗ ଇନ କରନ୍ତୁ ।",
        "createaccountmail": "ଏକ ଅସ୍ଥାୟୀ ପାସୱାର୍ଡ଼ ବ୍ୟବହାର କରନ୍ତୁ ଏବଂ ଏହାକୁ ତଳେ ଦିଆଯାଇଥିବା ଇ-ମେଲ ଠିକଣାକୁ ପଠାଇଦିଅନ୍ତୁ",
        "createaccountmail-help": "ପାସୱାର୍ଡ ନ ଜାଣି ମଧ୍ୟ ଆଉ ଜଣେ ବ୍ୟକ୍ତି ଙ୍କ ପାଇଁ ଖାତା ଖୋଲିବାକୁ ବ୍ୟବହାର କରାଯାଇପାରିବ।",
        "createacct-realname": "ପ୍ରକୃତ ନାମ (ଇଚ୍ଛାଧୀନ)",
-       "createaccountreason": "କାରଣ:",
        "createacct-reason": "କାରଣ",
        "createacct-reason-ph": "ଆପଣ ଅନ୍ୟଏକ ଖାତା କାହିଁକି ତିଆରି କରୁଛନ୍ତି",
        "createacct-reason-help": "ଖାତା ଖୋଲିବା ଲଗ ରେ ବାର୍ତା ଦେଖାଯାଇଛି",
        "nimagelinks": "$1 ଟି {{PLURAL:$1|ପୃଷ୍ଠା|ପୃଷ୍ଠା}}ରେ ବ୍ୟବହାର କରାଯାଇଅଛି",
        "ntransclusions": "$1ଟି {{PLURAL:$1|ପୃଷ୍ଠା|ପୃଷ୍ଠା}}ରେ ବ୍ୟବହାର କରାଯାଇଅଛି",
        "specialpage-empty": "ଏହି ଅନୁରୋଧ ପାଇଁ କିଛି ଫଳାଫଳ ମିଳିଲା ନାହିଁ ।",
-       "lonelypages": "à¬\85ନାଥ ପୃଷ୍ଠା ସବୁ",
+       "lonelypages": "à¬\8fà¬\95ାà¬\95à­\80 ପୃଷ୍ଠା ସବୁ",
        "lonelypagestext": "ତଲାଲିଖିତ ପୃଷ୍ଠାମାନ {{SITENAME}}ରେ ଥିବା ବାକି ପୃଷ୍ଠାମାନଙ୍କ ସହ ଯୋଡ଼ାଯାଇନାହିଁ ବା କେବଳ ସେଥିରେ ବ୍ୟବହାର କରାଯାଇନାହିଁ ।",
        "uncategorizedpages": "ଶ୍ରେଣୀହୀନ ପୃଷ୍ଠାସମୂହ",
        "uncategorizedcategories": "ଶ୍ରେଣୀହୀନ ଶ୍ରେଣୀସମୂହ",
        "prefixindex-strip": "ତାଲିକାରୁ ନାମ ଆଗରୁ ଲାଗୁଥିବା ଶବ୍ଦ ହଟାନ୍ତୁ",
        "shortpages": "ଛୋଟ ପୃଷ୍ଠାସମୂହ",
        "longpages": "ଲମ୍ବା ପୃଷ୍ଠା",
-       "deadendpages": "à¬\86à¬\97à¬\95à­\81 à¬¯à¬¾à¬\87ପାରà­\81ନଥିବା ପୃଷ୍ଠା",
+       "deadendpages": "à¬\85ନà­\8dà­\9f à¬ªà­\83ଷà­\8dଠା à¬¸à¬\99à­\8dà¬\97à­\87 à¬¯à­\8bଡ଼ା à¬¹à­\87à¬\87ନଥିବା ପୃଷ୍ଠା",
        "deadendpagestext": "ଏହି ପୃଷ୍ଠାସବୁ {{SITENAME}}ର ବାକି ପୃଷ୍ଠାମାନଙ୍କ ସଙ୍ଗେ ଯୋଡ଼ା ହୋଇ ନାହାନ୍ତି ।",
        "protectedpages": "କିଳାଯାଇଥିବା ପୃଷ୍ଠାମାନ",
        "protectedpages-indef": "କେବଳ ଆସିମୀତ କାଳ ପାଇଁ କିଳିବା",
        "undeleteviewlink": "ଦେଖଣା",
        "undeleteinvert": "ବଛାଯାଇଥିବା ଲେଖାକୁ ଓଲଟେଇଦେବେ",
        "undeletecomment": "କାରଣ:",
-       "undeletedrevisions": "{{PLURAL:$1|ଗୋଟିଏ ସଂକଳନ|$1 ଗୋଟି ସଂକଳନ}} ପୁନସ୍ଥାପନ କରାଗଲା",
-       "undeletedrevisions-files": "{{PLURAL:$1|ଗୋଟିଏ ସଂସ୍କରଣ|$1 ଗୋଟି ସଂସ୍କରଣ}} ଓ {{PLURAL:$2|ଗୋଟିଏ ଫାଇଲ|$2 ଗୋଟି ଫାଇଲ}} ପୁନସ୍ଥାପନ କରାଗଲା",
-       "undeletedfiles": "{{PLURAL:$1|ଗୋଟିଏ ଫାଇଲ|$1 ଗୋଟି ଫାଇଲ}} ପୁନସ୍ଥାପନ କରାଗଲା",
        "cannotundelete": "ଲିଭାଇବାରୁ ରୋକିବା ବିଫଳ ହେଲା;\n$1",
        "undeletedpage": "'''$1ର ପୁନସ୍ଥାପନ କରାଗଲା'''\n\nନଗଦ ଲିଭାଇବା ଓ ପୁନସ୍ଥାପନ ପାଇଁ [[Special:Log/delete|ଲିଭାଇବା ଇତିହାସ]] ଦେଖନ୍ତୁ ।",
        "undelete-header": "ନଗଦ ଲିଭାଯାଇଥିବା ପୃଷ୍ଠାସବୁ ପାଇଁ [[Special:Log/delete|ଲିଭାଇବା ଇତିହାସ]] ଦେଖନ୍ତୁ ।",
        "logentry-upload-revert": "$1, $3 {{GENDER:$2|ଅପଲୋଡ଼ କଲେ}}",
        "log-name-tag": "ଟାଗ ଲଗ",
        "rightsnone": "(କିଛି ନାହିଁ)",
-       "revdelete-summary": "ସାରକଥା ସମ୍ପାଦନା",
        "feedback-adding": "ପୃଷ୍ଠାରେ ମତାମତ ଦେଉଛି...",
        "feedback-back": "ପଛକୁ ଯିବେ",
        "feedback-bugcheck": "ବହୁତ ଭଲ ! ଖାଲି ଦେଖିଦିଅନ୍ତୁ ଯେ ଏହା ଆଗରୁ ଥିବା [$1 known bugs] ମଧ୍ୟରୁ ନୁହେଁ ତ ।",
index 9554d79..1659f65 100644 (file)
@@ -86,7 +86,8 @@
                        "Sethakill",
                        "Mateon1",
                        "Jdx",
-                       "Kirsan"
+                       "Kirsan",
+                       "Krottyianock"
                ]
        },
        "tog-underline": "Podkreślenie linków:",
        "aboutsite": "O {{GRAMMAR:MS.lp|{{SITENAME}}}}",
        "aboutpage": "Project:O {{GRAMMAR:MS.lp|{{SITENAME}}}}",
        "copyright": "Treść udostępniana na licencji $1, jeśli nie podano inaczej.",
-       "copyrightpage": "{{ns:project}}:Prawa_autorskie",
+       "copyrightpage": "{{ns:project}}:Prawa autorskie",
        "currentevents": "Bieżące wydarzenia",
        "currentevents-url": "Project:Aktualności",
        "disclaimers": "Informacje prawne",
        "post-expand-template-argument-warning": "Uwaga – strona zawiera co najmniej jeden argument szablonu, który po rozwinięciu jest zbyt duży.\nArgument ten będzie pominięty.",
        "post-expand-template-argument-category": "Strony, w których użyto szablon z pominięciem argumentów",
        "parser-template-loop-warning": "Wykryto pętlę w szablonie [[$1]]",
+       "template-loop-category": "Strony z pętlami szablonów",
+       "template-loop-category-desc": "Strona zawiera pętlę szablonów, czyli szablon, który wywołuje sam siebie rekursywnie.",
        "parser-template-recursion-depth-warning": "Przekroczno limit głębokości rekurencji szablonu ($1)",
        "language-converter-depth-warning": "Przekroczono ograniczenie ($1) głębokości zagnieżdżenia konwersji językowej",
        "node-count-exceeded-category": "Strony, gdzie przekroczono liczbę węzłów",
        "page_first": "początek",
        "page_last": "koniec",
        "histlegend": "Wybór porównania – zaznacz kropeczkami dwie wersje do porównania i wciśnij enter lub przycisk ''Porównaj wybrane wersje''.<br />\nLegenda: (bież.) – pokaż zmiany od tej wersji do bieżącej,\n(poprz.) – pokaż zmiany od wersji poprzedzającej, m – mała (drobna) zmiana",
-       "history-fieldset-title": "Przeglądaj historię",
-       "history-show-deleted": "Tylko usunięte",
+       "history-fieldset-title": "Szukaj wersji",
+       "history-show-deleted": "Tylko usunięte edycje",
        "histfirst": "od najstarszych",
        "histlast": "od najświeższych",
        "historysize": "({{PLURAL:$1|1 bajt|$1 bajty|$1 bajtów}})",
        "recentchanges-legend-plusminus": "(''±123'')",
        "recentchanges-submit": "Pokaż",
        "rcfilters-activefilters": "Aktywne filtry",
-       "rcfilters-restore-default-filters": "Przywrócić domyślne filtry",
+       "rcfilters-restore-default-filters": "Przywróć domyślne filtry",
        "rcfilters-clear-all-filters": "Wyczyść filtry",
        "rcfilters-search-placeholder": "Filtruj ostatnie zmiany (przeglądaj lub zacznij wpisywać)",
        "rcfilters-invalid-filter": "Nieprawidłowy filtr",
        "rcfilters-empty-filter": "Brak aktywnych filtrów. Wyświetlane są wszystkie zmiany.",
        "rcfilters-filterlist-title": "Filtry",
+       "rcfilters-filterlist-whatsthis": "Co to jest?",
        "rcfilters-filterlist-feedbacklink": "Podziel się swoją opinią na temat tych nowych (beta) filtrów",
        "rcfilters-highlightbutton-title": "Podświetl wyniki",
        "rcfilters-highlightmenu-title": "Wybierz kolor",
        "rcfilters-highlightmenu-help": "Wybierz kolor, aby podświetlić tę właściwość",
        "rcfilters-filterlist-noresults": "Nie znaleziono filtrów",
+       "rcfilters-noresults-conflict": "Nie znaleziono wyników z powodu konfliktu kryteriów wyszukiwania",
+       "rcfilters-state-message-subset": "Ten filtr nie wywoła efektu, ponieważ pasujące do niego wyniki są zawarte w bardziej {{PLURAL:$2|szczegółowym filtrze|szczegółowych filtrach}} (spróbuj podświetlić, aby je rozróżnić): $1",
+       "rcfilters-state-message-fullcoverage": "Wybranie wszystkich filtrów w grupie działa tak samo jak niewybranie żadnego, więc taki filtr nie da żadnego efektu. W grupie zawarto też: $1",
        "rcfilters-filtergroup-registration": "Rejestracja użytkownika",
        "rcfilters-filter-registered-label": "Zarejestrowani",
        "rcfilters-filter-registered-description": "Zalogowani edytorzy.",
        "rcfilters-filter-unregistered-label": "Niezarejestrowani",
        "rcfilters-filter-unregistered-description": "Niezalogowani",
+       "rcfilters-filter-unregistered-conflicts-user-experience-level": "Ten filtr koliduje z {{PLURAL:$2|poniższym filtrem|poniższymi filtrami}} doświadczenia, {{PLURAL:$2|który wyszukuje|które wyszukują}} tylko zarejestrowanych użytkowników: $1",
        "rcfilters-filtergroup-authorship": "Autorstwo edycji",
        "rcfilters-filter-editsbyself-label": "Moje edycje",
        "rcfilters-filter-editsbyself-description": "Edycje dokonane przez Ciebie.",
        "rcfilters-filter-editsbyother-label": "Edycje inne niż Twoje",
        "rcfilters-filter-editsbyother-description": "Edycje wykonane przez innych (nie Twoje).",
-       "rcfilters-filtergroup-userExpLevel": "Poziom doświadczenia (tylko dla zarejestrowanych użytkowników)",
+       "rcfilters-filtergroup-userExpLevel": "Poziom doświadczenia (tylko o zarejestrowanych użytkownikach)",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "Filtry doświadczenia wyszukują tylko edycje zarejestrowanych użytkowników, więc ten filtr koliduje z filtrem „Niezarejestrowani”.",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "Filtr \"Niezarejestrowani\" koliduje z jednym lub więcej filtrów z filtrów poziomu doświadczenia, które służą do wyszukiwania wkładu tylko zarejestrowanych użytkowników. Kolidujące filtry zostały odpowiednio oznaczone na pasku Aktywnych filtrów.",
        "rcfilters-filter-user-experience-level-newcomer-label": "Początkujący",
        "rcfilters-filter-user-experience-level-newcomer-description": "Mniej niż 10 edycji i 4 dni aktywności.",
        "rcfilters-filter-user-experience-level-learner-label": "Uczący się",
        "rcfilters-filter-bots-description": "Zmiany wykonane z użyciem zautomatyzowanych narzędzi.",
        "rcfilters-filter-humans-label": "Człowiek (nie bot)",
        "rcfilters-filter-humans-description": "Zmiany wprowadzone przez ludzi.",
+       "rcfilters-filtergroup-reviewstatus": "Status przejrzenia",
+       "rcfilters-filter-patrolled-label": "Sprawdzone",
+       "rcfilters-filter-patrolled-description": "Edycje oznaczone jako sprawdzone.",
+       "rcfilters-filter-unpatrolled-label": "Niesprawdzone",
+       "rcfilters-filter-unpatrolled-description": "Edycje nie oznaczone jako sprawdzone.",
        "rcfilters-filtergroup-significance": "Znaczenie",
        "rcfilters-filter-minor-label": "Drobne zmiany",
        "rcfilters-filter-minor-description": "Zmiany, które autor oznaczył jako drobne.",
        "rcfilters-filter-categorization-description": "Dodanie lub usunięcie strony z kategorii",
        "rcfilters-filter-logactions-label": "Działania rejestrowane",
        "rcfilters-filter-logactions-description": "Działania administracyjne, tworzenie kont, usuwanie stron, przesyłanie plików...",
+       "rcfilters-hideminor-conflicts-typeofchange-global": "Filtr „Drobne zmiany” koliduje z jednym lub wieloma filtrami Rodzaju zmian, ponieważ niektóre rodzaje zmian nie mogą być uznawane za  „drobne”. Kolidujące filtry zostały powyżej odpowiednio zaznaczone na pasku aktywnych filtrów.",
+       "rcfilters-hideminor-conflicts-typeofchange": "Niektóre rodzaje zmian nie mogą być uznawane za „drobne”, dlatego ten filtr koliduje z następującymi filtrami Rodzaju zmian: $1",
+       "rcfilters-typeofchange-conflicts-hideminor": "Ten filtr Rodzaju zmian koliduje z filtrem „Drobne zmiany”. Nie wszystkie zmiany mogą być uznawane za „drobne”.",
        "rcnotefrom": "Poniżej {{PLURAL:$5|pokazano zmianę|pokazano zmiany}} {{PLURAL:$5|wykonaną|wykonane}} po <strong>$3, $4</strong> (nie więcej niż '''$1''' pozycji).",
+       "rclistfromreset": "Zresetuj wybór danych",
        "rclistfrom": "Pokaż nowe zmiany od $3 $2",
        "rcshowhideminor": "$1 drobne edycje",
        "rcshowhideminor-show": "Pokaż",
        "php-uploaddisabledtext": "Przesyłanie plików PHP zostało zablokowane. Sprawdź ustawienie „file_uploads”.",
        "uploadscripted": "Plik zawiera kod HTML lub skrypt, który może zostać błędnie zinterpretowany przez przeglądarkę internetową.",
        "upload-scripted-pi-callback": "Nie można przesłać pliku, zawierającego instrukcję obsługi arkusza stylów XML.",
+       "upload-scripted-dtd": "Nie można przesyłać plików SVG zawierających niestandardową deklarację DTD.",
        "uploaded-script-svg": "Znaleziono element skryptowy „$1” we przesyłanym pliku SVG.",
        "uploaded-hostile-svg": "Znaleziono niebezpieczny kod CSS w przesyłanym pliku SVG.",
        "uploaded-event-handler-on-svg": "Ustawianie atrybutów obsługi zdarzeń <code>$1=\"$2\"</code> jest niedozwolone w plikach SVG.",
        "undeleteviewlink": "pokaż",
        "undeleteinvert": "Odwróć zaznaczenie",
        "undeletecomment": "Powód:",
-       "undeletedrevisions": "odtworzono {{PLURAL:$1|1 wersję|$1 wersje|$1 wersji}}",
-       "undeletedrevisions-files": "odtworzono $1 {{PLURAL:$1|wersję|wersje|wersji}} i $2 {{PLURAL:$2|plik|pliki|plików}}",
-       "undeletedfiles": "odtworzył $1 {{PLURAL:$1|plik|pliki|plików}}",
        "cannotundelete": "Niektóre lub wszystkie odtworzenia nie powiodły się:\n$1",
        "undeletedpage": "'''Odtworzono stronę $1.'''\n\nZobacz [[Special:Log/delete|rejestr usunięć]], jeśli chcesz przejrzeć ostatnie operacje usuwania i odtwarzania stron.",
        "undelete-header": "Zobacz [[Special:Log/delete|rejestr usunięć]], aby sprawdzić ostatnio usunięte strony.",
        "newimages-summary": "Na tej stronie specjalnej prezentowane są ostatnio przesłane pliki.",
        "newimages-legend": "Filtruj",
        "newimages-label": "Nazwa pliku (lub jej fragment):",
+       "newimages-user": "Adres IP lub nazwa użytkownika",
        "newimages-showbots": "Pokaż pliki przesłane przez boty",
        "newimages-hidepatrolled": "Ukryj sprawdzone pliki",
        "noimages": "Brak plików do pokazania.",
        "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-restore-nocount": "$1 {{GENDER:$2|odtworzył|odtworzyła}} stronę $3",
+       "restore-count-revisions": "odtworzono {{PLURAL:$1|1 wersja|$1 wersji}}",
+       "restore-count-files": "{{PLURAL: $1|1 Plik|$1 plików}}",
        "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",
        "logentry-delete-event-legacy": "$1 {{GENDER:$2|zmienił|zmieniła}} widoczność zdarzeń w rejestrze strony $3",
        "special-characters-group-thai": "Tajskie",
        "special-characters-group-lao": "Laotańskie",
        "special-characters-group-khmer": "Khmerskie",
+       "special-characters-group-canadianaboriginal": "Kanadyjski Aborygen",
        "special-characters-title-endash": "półpauza",
        "special-characters-title-emdash": "pauza",
        "special-characters-title-minus": "minus",
        "log-action-filter-suppress-reblock": "Ukrycie użytkownika poprzez ponowną blokadę",
        "log-action-filter-upload-upload": "Nowe przesłane",
        "log-action-filter-upload-overwrite": "Przesłane ponownie",
+       "authmanager-authn-no-primary": "Podane dane nie mogą być użyte do kontroli poświadczeń.",
+       "authmanager-authn-no-local-user": "Żaden użytkownik nie korzysta z tych danych.",
        "authmanager-authn-autocreate-failed": "Automatyczne tworzenie lokalnego konta nie powiodło się: $1",
        "authmanager-create-disabled": "Utworzenie konta jest wyłączone.",
        "authmanager-create-from-login": "Aby utworzyć konto, wypełnij odpowiednie pola.",
        "authmanager-autocreate-noperm": "Automatyczne tworzenie konta jest niedozwolone.",
        "authmanager-autocreate-exception": "Automatyczne tworzenie konta tymczasowo wyłączone z powodu wcześniejszych błędów.",
        "authmanager-userdoesnotexist": "Konto użytkownika „$1” nie jest zarejestrowane.",
+       "authmanager-userlogin-remembermypassword-help": "Czy hasło powinno być zapamiętane dłużej niż długość sesji.",
        "authmanager-username-help": "Nazwa użytkownika dla uwierzytelniania.",
        "authmanager-password-help": "Hasło do uwierzytelniania.",
        "authmanager-domain-help": "Domena uwierzytelniania zewnętrznego.",
        "restrictionsfield-label": "Dozwolone zakresy adresów IP:",
        "restrictionsfield-help": "Jeden adres IP lub zakres CIDR w wierszu. Aby zaznaczyć wszystkie, użyj:<pre>0.0.0.0/0\n::/0</pre>",
        "revid": "wersja $1",
-       "pageid": "ID strony: $1"
+       "pageid": "ID strony: $1",
+       "rawhtml-notallowed": "Znaczniki &lt;html&gt; nie mogą być stosowane poza zwykłymi stronami.",
+       "gotointerwiki": "Opuszczasz {{SITENAME}}",
+       "gotointerwiki-invalid": "Podany tytuł jest nieprawidłowy.",
+       "gotointerwiki-external": "Zamierzasz przejść z witryny {{SITENAME}} do innej witryny:\n [[$2]].\n\n[$1 Kliknij, aby przejść do: $1]."
 }
index 2250b88..5f0d19d 100644 (file)
                        "!Silent",
                        "Joao Xavier",
                        "Nahime2015",
-                       "Alex Great"
+                       "Alex Great",
+                       "EVinente",
+                       "Felipe L. Ewald"
                ]
        },
        "tog-underline": "Sublinhar links:",
        "login": "Autenticar-se",
        "login-security": "Verificar sua identidade",
        "nav-login-createaccount": "Entrar / criar conta",
-       "userlogin": "Entrar / criar conta",
-       "userloginnocreate": "Entrar",
        "logout": "Sair",
        "userlogout": "Sair",
        "notloggedin": "Não autenticado(a)",
        "userlogin-noaccount": "Não possui uma conta?",
        "userlogin-joinproject": "Junte-se ao projeto {{SITENAME}}",
-       "nologin": "Não possui uma conta? $1.",
-       "nologinlink": "Criar uma conta",
        "createaccount": "Criar conta",
-       "gotaccount": "Já possui uma conta? '''$1'''.",
-       "gotaccountlink": "Autenticar-se",
-       "userlogin-resetlink": "Esqueceu-se do seu nome de usuário ou da senha?",
        "userlogin-resetpassword-link": "Esqueceu sua senha?",
        "userlogin-helplink2": "Ajuda com o login",
        "userlogin-loggedin": "Você já está conectado como {{GENDER:$1|$1}}.\nUse o formulário abaixo para iniciar sessão como outro usuário.",
        "createaccountmail": "Usar uma senha aleatória e temporária que será enviada ao endereço de e-mail especificado a seguir",
        "createaccountmail-help": "Pode ser utilizado para criar uma conta para outra pessoa sem saber a senha.",
        "createacct-realname": "Nome real (opcional)",
-       "createaccountreason": "Motivo:",
        "createacct-reason": "Motivo",
        "createacct-reason-ph": "Por que você está criando outra conta",
        "createacct-reason-help": "Mensagem mostrada no registro de criação de conta",
        "post-expand-template-argument-warning": "Aviso: Esta página contém pelo menos um argumento de predefinição com um tamanho muito grande.\nEstes argumentos foram omitidos.",
        "post-expand-template-argument-category": "Páginas com argumentos de predefinições descartados",
        "parser-template-loop-warning": "Ciclo de predefinições detectado: [[$1]]",
+       "template-loop-category": "Páginas com loops de predefinição",
+       "template-loop-category-desc": "A página contém um loop de predefinição, ou seja, uma predefinição que se chama recursivamente.",
        "parser-template-recursion-depth-warning": "O limite de profundidade de recursividade de predefinição foi ultrapassado ($1)",
        "language-converter-depth-warning": "O limite de profundidade do conversor de línguas excedeu a ($1)",
        "node-count-exceeded-category": "Páginas em que o total de nós é excedido",
        "rcfilters-activefilters": "Filtros ativos",
        "rcfilters-restore-default-filters": "Restaurar filtros padrão",
        "rcfilters-clear-all-filters": "Limpar todos os filtros",
-       "rcfilters-search-placeholder": "Filtrar alterações recentes (procurar ou começar a digitar)",
+       "rcfilters-search-placeholder": "Filtrar mudanças recentes (procurar ou começar a digitar)",
        "rcfilters-invalid-filter": "Filtro inválido",
        "rcfilters-empty-filter": "Nenhum filtro ativo. Todas as contribuições são mostradas.",
        "rcfilters-filterlist-title": "Filtros",
+       "rcfilters-filterlist-whatsthis": "O que é isso?",
        "rcfilters-filterlist-feedbacklink": "Forneça feedback sobre os novos filtros (beta)",
        "rcfilters-highlightbutton-title": "Realçar os resultados",
        "rcfilters-highlightmenu-title": "Selecione uma cor",
        "rcfilters-filterlist-noresults": "Nenhum filtro encontrado",
+       "rcfilters-noresults-conflict": "Nenhum resultado encontrado porque os critérios de pesquisa estão em conflito",
        "rcfilters-filtergroup-registration": "Registro de usuário",
        "rcfilters-filter-registered-label": "Registrado",
        "rcfilters-filter-registered-description": "Editores conectados.",
        "rcfilters-filter-editsbyother-label": "Edições de outros",
        "rcfilters-filter-editsbyother-description": "Edições criadas por outros usuários (não você.)",
        "rcfilters-filtergroup-userExpLevel": "Nível de experiência (apenas para usuário registados)",
-       "rcfilters-filter-userExpLevel-newcomer-label": "Recém-chegados",
-       "rcfilters-filter-userExpLevel-newcomer-description": "Menos de 10 edições e 4 dias de atividade.",
-       "rcfilters-filter-userExpLevel-learner-label": "Aprendizes",
-       "rcfilters-filter-userExpLevel-learner-description": "Mais dias de atividade e edições do que \"Novatos\", mas menos do que \"Usuários experientes\".",
-       "rcfilters-filter-userExpLevel-experienced-label": "Usuários experientes",
-       "rcfilters-filter-userExpLevel-experienced-description": "Mais de 30 dias de atividade e 500 edições.",
+       "rcfilters-filter-user-experience-level-newcomer-label": "Recém-chegados",
+       "rcfilters-filter-user-experience-level-newcomer-description": "Menos de 10 edições e 4 dias de atividade.",
+       "rcfilters-filter-user-experience-level-learner-label": "Aprendizes",
+       "rcfilters-filter-user-experience-level-learner-description": "Mais dias de atividade e edições do que \"Novatos\", mas menos do que \"Usuários experientes\".",
+       "rcfilters-filter-user-experience-level-experienced-label": "Usuários experientes",
+       "rcfilters-filter-user-experience-level-experienced-description": "Mais de 30 dias de atividade e 500 edições.",
        "rcfilters-filtergroup-automated": "Contribuições automatizadas",
        "rcfilters-filter-bots-label": "Robô",
        "rcfilters-filter-bots-description": "Edições feitas por ferramentas automatizadas.",
        "rcfilters-filter-humans-label": "Humano (não bot)",
        "rcfilters-filter-humans-description": "Edições feitas por editores humanos.",
+       "rcfilters-filter-unpatrolled-label": "Não patrulhadas",
+       "rcfilters-filter-unpatrolled-description": "Edições não marcadas como patrulhadas.",
        "rcfilters-filtergroup-significance": "Significado",
        "rcfilters-filter-minor-label": "Edições menores",
        "rcfilters-filter-minor-description": "Edita o autor rotulado como menor.",
        "rcshowhidecategorization": "$1 categorização de páginas",
        "rcshowhidecategorization-show": "Exibir",
        "rcshowhidecategorization-hide": "Esconder",
-       "rclinks": "Exibir as $1 alterações recentes feitas nos últimos $2 dias<br />$3",
+       "rclinks": "Exibir as $1 mudanças recentes feitas nos últimos $2 dias<br />$3",
        "diff": "dif",
        "hist": "his",
        "hide": "Ocultar",
        "undeleteviewlink": "visualizar",
        "undeleteinvert": "Inverter seleção",
        "undeletecomment": "Motivo:",
-       "undeletedrevisions": "$1 {{PLURAL:$1|edição restaurada|edições restauradas}}",
-       "undeletedrevisions-files": "$1 {{PLURAL:$1|edição restaurada|edições restauradas}} e $2 {{PLURAL:$2|arquivo restaurado|arquivos restaurados}}",
-       "undeletedfiles": "{{PLURAL:$1|arquivo restaurado|$1 arquivos restaurados}}",
        "cannotundelete": "Algumas ou todas as restaurações falharam:\n$1",
        "undeletedpage": "'''$1 foi restaurada'''\n\nConsulte o [[Special:Log/delete|registro de eliminações]] para um registro das eliminações e restaurações mais recentes.",
        "undelete-header": "Veja o [[Special:Log/delete|registro de deleções]] para as páginas recentemente eliminadas.",
        "newimages-summary": "Esta página especial mostra os arquivos mais recentemente enviados",
        "newimages-legend": "Filtrar",
        "newimages-label": "Nome de arquivo (ou parte dele):",
+       "newimages-user": "Endereço IP ou nome do usuário:",
        "newimages-showbots": "Mostrar uploads realizados por robôs",
        "newimages-hidepatrolled": "Ocultar os carregamentos patrulhados.",
        "noimages": "Nada para ver.",
        "autosumm-newblank": "Criar página em branco",
        "size-kilobytes": "$1 kB",
        "bitrate-kilobits": "$1&nbsp;kb/s",
-       "lag-warn-normal": "É possível que as alterações que sejam mais recentes do que $1 {{PLURAL:$1|segundo|segundos}} não sejam exibidas nesta lista.",
-       "lag-warn-high": "Devido a sérios problemas de latência no servidor do banco de dados, as alterações mais recentes que $1 {{PLURAL:$1|segundo|segundos}} poderão não ser exibidas nesta lista.",
+       "lag-warn-normal": "É possível que as mudanças que sejam mais recentes do que $1 {{PLURAL:$1|segundo|segundos}} não sejam exibidas nesta lista.",
+       "lag-warn-high": "Devido a sérios problemas de latência no servidor do banco de dados, as mudanças mais recentes que $1 {{PLURAL:$1|segundo|segundos}} poderão não ser exibidas nesta lista.",
        "watchlistedit-normal-title": "Editar lista de páginas vigiadas",
        "watchlistedit-normal-legend": "Remover títulos da lista de páginas vigiadas",
        "watchlistedit-normal-explain": "Os títulos das páginas de sua lista de vigiadas são exibidos abaixo.\nPara remover um título, marque a caixa ao lado do mesmo e clique \"{{int:Watchlistedit-normal-submit}}\".\nVocê pode também [[Special:EditWatchlist/raw|editar a lista de páginas vigiadas em forma de texto]].",
        "logentry-tag-update-revision": "$1 {{GENDER:$2|atualizou}} etiquetas em revisão $4 da página $3 ({{PLURAL:$7|adicionou}} $6; {{PLURAL:$9|removeu}} $8)",
        "logentry-tag-update-logentry": "$1 {{GENDER:$2|atualizou}} etiquetas na entrada de registro $5 da página $3 ({{PLURAL:$7|adicionou}} $6; {{PLURAL:$9|removeu}} $8)",
        "rightsnone": "(nenhum)",
-       "revdelete-summary": "resumo da edição",
        "rightslogentry-temporary-group": "$1 (temporário, até $2)",
        "feedback-adding": "Adicionando os comentários na página...",
        "feedback-back": "Voltar",
index 5749871..8905262 100644 (file)
        "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",
+       "copyrightpage": "{{ns:project}}:Direitos de autor",
        "currentevents": "Notícias",
        "currentevents-url": "Project:Notícias",
        "disclaimers": "Exoneração de responsabilidade",
        "page_first": "primeira",
        "page_last": "última",
        "histlegend": "Seleção de diferenças: use os botões de opção para marcar as versões que deseja comparar.\nPressione 'Enter' ou clique o botão \"{{int:compareselectedversions}}\".<br />\nLegenda: '''({{int:cur}})''' = diferenças para a versão atual,\n'''({{int:last}})''' = diferenças para a versão anterior,\n'''{{int:minoreditletter}}''' = edição menor",
-       "history-fieldset-title": "Navegar pelo histórico",
-       "history-show-deleted": "Somente eliminadas",
+       "history-fieldset-title": "Pesquisar revisões",
+       "history-show-deleted": "Somente revisões eliminadas",
        "histfirst": "Mais antigas",
        "histlast": "Mais novas",
        "historysize": "({{PLURAL:$1|1 byte|$1 bytes}})",
        "prefs-help-prefershttps": "Esta preferência terá efeito no seu próximo início de sessão.",
        "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": "Privilégios de utilizador",
        "userrights-lookup-user": "Selecionar um utilizador",
        "userrights-user-editname": "Introduza um nome de utilizador(a):",
        "editusergroup": "Carregar grupos do utilizador",
        "rcfilters-invalid-filter": "Filtro inválido",
        "rcfilters-empty-filter": "Não há filtros ativos. São mostradas todas as contribuições.",
        "rcfilters-filterlist-title": "Filtros",
+       "rcfilters-filterlist-whatsthis": "O que é isto?",
        "rcfilters-filterlist-feedbacklink": "Dê-nos a sua opinião sobre os novos filtros (beta)",
        "rcfilters-highlightbutton-title": "Realçar resultados",
        "rcfilters-highlightmenu-title": "Selecionar uma cor",
+       "rcfilters-highlightmenu-help": "Selecione uma cor para realçar esta propriedade",
        "rcfilters-filterlist-noresults": "Não foram encontrados filtros",
+       "rcfilters-noresults-conflict": "Não foram encontrados resultados porque os critérios de pesquisa estão em conflito",
        "rcfilters-filtergroup-registration": "Registo de utilizador",
        "rcfilters-filter-registered-label": "Registado",
        "rcfilters-filter-registered-description": "Editores autenticados.",
        "rcfilters-filter-editsbyother-label": "Edições de outros",
        "rcfilters-filter-editsbyother-description": "Edições criadas por outros utilizadores (não por si).",
        "rcfilters-filtergroup-userExpLevel": "Nível de experiência (apenas para utilizadores registados)",
-       "rcfilters-filter-userExpLevel-newcomer-label": "Novatos",
-       "rcfilters-filter-userExpLevel-newcomer-description": "Menos de 10 edições e 4 dias de atividade.",
-       "rcfilters-filter-userExpLevel-learner-label": "Aprendizes",
-       "rcfilters-filter-userExpLevel-learner-description": "Mais dias de atividade e edições do que \"Novatos\", mas menos do que \"Utilizadores experientes\".",
-       "rcfilters-filter-userExpLevel-experienced-label": "Utilizadores experientes",
-       "rcfilters-filter-userExpLevel-experienced-description": "Mais de 30 dias de atividade e 500 edições.",
+       "rcfilters-filter-user-experience-level-newcomer-label": "Novatos",
+       "rcfilters-filter-user-experience-level-newcomer-description": "Menos de 10 edições e 4 dias de atividade.",
+       "rcfilters-filter-user-experience-level-learner-label": "Aprendizes",
+       "rcfilters-filter-user-experience-level-learner-description": "Mais dias de atividade e edições do que \"Novatos\", mas menos do que \"Utilizadores experientes\".",
+       "rcfilters-filter-user-experience-level-experienced-label": "Utilizadores experientes",
+       "rcfilters-filter-user-experience-level-experienced-description": "Mais de 30 dias de atividade e 500 edições.",
        "rcfilters-filtergroup-automated": "Contribuições automatizadas",
        "rcfilters-filter-bots-label": "Robô",
        "rcfilters-filter-bots-description": "Edições efectuadas por ferramentas automatizadas.",
        "rcfilters-filter-humans-label": "Ser humano (não robô)",
        "rcfilters-filter-humans-description": "Edições efectuadas por editores humanos.",
+       "rcfilters-filtergroup-reviewstatus": "Estado da revisão",
+       "rcfilters-filter-patrolled-label": "Patrulhadas",
+       "rcfilters-filter-patrolled-description": "Edições marcadas como patrulhadas.",
+       "rcfilters-filter-unpatrolled-label": "Não patrulhadas",
+       "rcfilters-filter-unpatrolled-description": "Edições não marcadas como patrulhadas.",
        "rcfilters-filtergroup-significance": "Significado",
        "rcfilters-filter-minor-label": "Edições menores",
        "rcfilters-filter-minor-description": "Edições marcadas pelo autor como menores.",
        "newimages-summary": "Esta página especial mostra os ficheiros mais recentemente enviados.",
        "newimages-legend": "Filtrar",
        "newimages-label": "Nome de ficheiro (ou parte dele):",
+       "newimages-user": "Endereço IP ou nome do utilizador",
        "newimages-showbots": "Mostrar carregamentos feitos por robôs",
        "newimages-hidepatrolled": "Ocultar carregamentos patrulhados",
        "noimages": "Nada para ver.",
index c3a871f..3dfb736 100644 (file)
        "post-expand-template-argument-warning": "Used as warning in parser limitation.\n\nSee also:\n* {{msg-mw|Post-expand-template-argument-category}}",
        "post-expand-template-argument-category": "This message is used as a category name for a [[mw:Special:MyLanguage/Help:Tracking categories|tracking category]] where pages are placed automatically if they contain omitted template arguments.\n\nSee also:\n* {{msg-mw|Post-expand-template-argument-category-desc}}\n* {{msg-mw|Post-expand-template-argument-warning}}",
        "parser-template-loop-warning": "Parameters:\n* $1 - page title",
+       "template-loop-category": "This message is used as a category name for a [[mw:Special:MyLanguage/Help:Tracking categories|tracking category]] where pages with template loops will be listed.",
+       "template-loop-category-desc": "Pages with template loops category description. Shown on [[Special:TrackingCategories]].\n\nSee also:\n* {{msg-mw|Template-loop-category}}",
        "parser-template-recursion-depth-warning": "Parameters:\n* $1 - limit value of recursion depth",
        "language-converter-depth-warning": "Error message shown when a page uses too deeply nested language conversion syntax. Parameters:\n* $1 - the value of the depth limit",
        "node-count-exceeded-category": "This message is used as a category name for a [[mw:Help:Tracking categories|tracking category]] where pages are placed automatically if the node-count of the preprocessor exceeds the limit.\n\nSee also:\n* {{msg-mw|Node-count-exceeded-warning}}",
        "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-groupsmember-type": "{{optional}}\nParameters:\n* $1 - list of group names\n* $2 - list of group member names. Used with labels {{msg-mw|Userrights-groupsmember}} and {{msg-mw|Userrights-groupsmember-auto}}",
-       "userrights-groups-help": "Instructions displayed on [[Special:UserRights]]. Parameters:\n* $1 - (Optional) a username, can be used for GENDER",
+       "userrights-groups-help": "Instructions displayed on [[Special:UserRights]].  \"Bring forward\" is a phrasal verb meaning \"move to an earlier time\". \"Put back\" means the opposite. Parameters:\n* $1 - (Optional) a username, can be used 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",
        "rcfilters-invalid-filter": "A label for an invalid filter.",
        "rcfilters-empty-filter": "Placeholder for the filter list when no filters were chosen.",
        "rcfilters-filterlist-title": "Title for the filters list.\n{{Identical|Filter}}",
+       "rcfilters-filterlist-whatsthis": "Caption for the link that opens a popup with explanations about this filter group.",
        "rcfilters-filterlist-feedbacklink": "Caption for the link to the feedback page about the filters beta feature.",
        "rcfilters-highlightbutton-title": "Title for the highlight button used to toggle the highlight feature on and off.",
        "rcfilters-highlightmenu-title": "Title for the highlight menu used to select the highlight color for an individual filter.",
        "rcfilters-highlightmenu-help": "Tooltip for the highlight menu for individual filters.",
        "rcfilters-filterlist-noresults": "Message showing no results found for searching a filter.",
+       "rcfilters-noresults-conflict": "A message displayed in the results area when no results found because there are filters in conflict with one another.",
+       "rcfilters-state-message-subset": "Tooltip shown when hovering over a filter tag when one or more broader filters that contain the hovered filter are also selected. This indicates that the hovered filter has no effect because all the results it matches are also matched by the broader filter(s).  Parameters:\n* $1 - Comma-separated string of selected broader filters that this filter is a subset of\n* $2 - Count of filters in $1, for PLURAL",
+       "rcfilters-state-message-fullcoverage": "Tooltip shown when hovering over a filter tag when all the filters in its group are selected. This indicates that the hovered filter has no effect because the selected filters in the group cover all changes. Parameters:\n* $1 - Comma-separated string of selected filters in the group\n* $2 - Count of filters in $1, for PLURAL",
        "rcfilters-filtergroup-registration": "Title for the filter group for editor registration type.",
        "rcfilters-filter-registered-label": "Label for the filter for showing edits made by logged-in users.\n{{Identical|Registered}}",
        "rcfilters-filter-registered-description": "Description for the filter for showing edits made by logged-in users.",
        "rcfilters-filter-categorization-description": "Description for the filter for showing edits adding or removing pages to categories.",
        "rcfilters-filter-logactions-label": "Label for the filter for showing logged actions.",
        "rcfilters-filter-logactions-description": "Description for the filter for showing logged actions.",
+       "rcfilters-hideminor-conflicts-typeofchange-global": "The \"Minor edits\" filter is conflicting with one or more Type of Change filters, because certain types of change cannot be designated as \"minor.\" The conflicting filters are marked in the Active Filters area, above.\n\n\"Type of Change\" is {{msg-mw|Rcfilters-filtergroup-changetype}}.",
+       "rcfilters-hideminor-conflicts-typeofchange": "Tooltip shown when hovering over the Minor edits tag, when a Type of Change filter is also selected.\n\n\"Minor edits\" is {{msg-mw|rcfilters-filter-minor-label}}.\n\n\"Type of change\" is {{msg-mw|rcfilters-filtergroup-changetype}}.\n\nThis indicates that no results will be shown.  Parameters:\n* $1 - Comma-separated string of selected Type of Change filters, e.g. \"Category, Logged Actions\"\n* $2 - Count of selected User Experience Level filters, for PLURAL",
+       "rcfilters-typeofchange-conflicts-hideminor": "Tooltip shown when hovering over a Type of change filter tag, when the Minor edits filter is also selected.\n\n\"Minor edits\" is {{msg-mw|rcfilters-filter-minor-label}}.\n\n\"Type of change\" is {{msg-mw|rcfilters-filtergroup-changetype}}.\n\nThis indicates that no results will be shown.",
        "rcnotefrom": "This message is displayed at [[Special:RecentChanges]] when viewing recentchanges from some specific time.\n\nThe corresponding message is {{msg-mw|Rclistfrom}}.\n\nParameters:\n* $1 - the maximum number of changes that are displayed\n* $2 - (Optional) a date and time\n* $3 - a date\n* $4 - a time\n* $5 - Number of changes are displayed, for use with PLURAL",
+       "rclistfromreset": "Used on [[Special:RecentChanges]] to reset a selection of a certain date range.",
        "rclistfrom": "Used on [[Special:RecentChanges]]. Parameters:\n* $1 - (Currently not use) date and time. The date and the time adds to the rclistfrom description.\n* $2 - time. The time adds to the rclistfrom link description (with split of date and time).\n* $3 - date. The date adds to the rclistfrom link description (with split of date and time).\n\nThe corresponding message is {{msg-mw|Rcnotefrom}}.",
        "rcshowhideminor": "Option text in [[Special:RecentChanges]]. Parameters:\n* $1 - the \"show/hide\" command, with the text taken from either {{msg-mw|rcshowhideminor-show}} or {{msg-mw|rcshowhideminor-hide}}\n{{Identical|Minor edit}}",
        "rcshowhideminor-show": "{{doc-actionlink}}\nOption text in [[Special:RecentChanges]] in conjunction with {{msg-mw|rcshowhideminor}}.\n\nSee also:\n* {{msg-mw|rcshowhideminor-hide}}\n{{Identical|Show}}",
        "php-uploaddisabledtext": "This means that file uploading is disabled in PHP, not upload of PHP-files.",
        "uploadscripted": "Used as error message when uploading a file.\n\nSee also:\n* {{msg-mw|zip-wrong-format}}\n* {{msg-mw|uploadjava}}\n* {{msg-mw|uploadvirus}}",
        "upload-scripted-pi-callback": "Used as error message when uploading an SVG file that contains xml-stylesheet processing instruction.",
+       "upload-scripted-dtd": "Used as an error message when uploading an svg file that contains a DTD declaration where the system identifier of the DTD is for something other than the standard SVG DTDS, or it is a SYSTEM DTD, or the public identifier does not start with -//W3C//. Note that errors related to the internal dtd subset do not use this error message.",
        "uploaded-script-svg": "Used as error message when uploading an SVG file that contains scriptable tags (script, handler, stylesheet, iframe).\n\nParameters:\n* $1 - The scriptable tag that blocked the SVG file from uploading.",
        "uploaded-hostile-svg": "Used as error message when uploading an SVG file that contains unsafe CSS.",
        "uploaded-event-handler-on-svg": "Used as error message when uploading an SVG file that contains event-handler attributes.\n\nParameters:\n* $1 - The event-handler attribute that is being modified in the SVG file.\n* $2 - The value that is given to the event-handler attribute.",
        "undeleteviewlink": "First part of {{msg-mw|undeletelink}}.\nDisplay name of link to view a deleted page used on [[Special:Log/delete]].\n{{Identical|View}}",
        "undeleteinvert": "{{Identical|Invert selection}}",
        "undeletecomment": "{{Identical|Reason}}",
-       "undeletedrevisions": "Used as reason in the log entry. Parameters:\n* $1 - number of revisions\nSee also:\n* {{msg-mw|Undeletedrevisions-files}}\n* {{msg-mw|Undeletedfiles}}",
-       "undeletedrevisions-files": "Used as reason in the log entry. Parameters:\n* $1 - number of revisions\n* $2 - number of files\nSee also:\n* {{msg-mw|Undeletedrevisions}}\n* {{msg-mw|Undeletedfiles}}",
-       "undeletedfiles": "Used as reason in the log entry. Parameters:\n* $1 - number of files\nSee also:\n* {{msg-mw|Undeletedrevisions-files}}\n* {{msg-mw|Undeletedrevisions}}",
        "cannotundelete": "Message shown when undeletion failed for some reason. Parameters:\n* $1 - the combined wikitext of messages for all errors that caused the failure",
        "undeletedpage": "Used as success message. Parameters:\n* $1 - page title, with link",
        "undelete-header": "Used in [[Special:Undelete]].",
        "unblocked-id": "Used in [[Special:Unblock]]. Parameters:\n* $1 - autoblock ID\nSee also:\n* {{msg-mw|Unblocked}}\n* {{msg-mw|Unblocked-range}}",
        "unblocked-ip": "{{doc-important|Do not translate the title \"Special:Contributions\".}}\nParameters:\n* $1 - the IP address that was unblocked\nSee also:\n* {{msg-mw|Unblocked-range}}\n* {{msg-mw|Unblocked-id}}\n*{{msg-mw|Unblocked}}",
        "blocklist": "{{doc-special|BlockList}}",
+       "autoblocklist": "Title of [[Special:AutoblockList]].",
+       "autoblocklist-submit": "Used as Submit button text in the form on [[Special:AutoblockList]].\n\nSee also:\n* {{msg-mw|Ipblocklist-legend}}\n* {{msg-mw|Autoblocklist-submit}}\n{{Identical|Search}}",
+       "autoblocklist-legend": "Used as legend of the form in [[Special:AutoblockList]].\n\nSee also:\n* {{msg-mw|Autoblocklist-legend}}\n* {{msg-mw|Autoblocklist-submit}}",
+       "autoblocklist-localblocks": "[[File:Special AutoBlockList new.png|thumb|Example]]\nUsed on [[Special:AutoblockList]] as header when global autoblocks exists too.",
+       "autoblocklist-empty": "Used in [[Special:AutoblockList]].",
+       "autoblocklist-otherblocks": "[[File:Special AutoBlockList new.png|thumb|Example]]\nUsed on [[Special:AutoblockList]] as header for other blocks, i.e. from GlobalBlocking or TorBlocks.\n\nParameters:\n* $1 - number of blocks",
        "ipblocklist": "Title of [[Special:Ipblocklist]].",
        "ipblocklist-legend": "Used as legend of the form in [[Special:BlockList]].\n\nSee also:\n* {{msg-mw|Ipblocklist-legend}}\n* {{msg-mw|Ipblocklist-submit}}",
        "blocklist-userblocks": "Used as the label for the multi-select checkbox in the form on [[Special:BlockList]].\n{{Related|Blocklist-blocks}}",
        "newimages-summary": "This message is displayed at the top of [[Special:NewImages]] to explain what is shown on that special page.",
        "newimages-legend": "Caption of the fieldset for the filter on [[Special:NewImages]]\n\n{{Identical|Filter}}",
        "newimages-label": "Caption of the filter editbox on [[Special:NewImages]]",
+       "newimages-user": "Caption of the username/IP address editbox on [[Special:NewImages]]",
        "newimages-showbots": "Used as label for a checkbox. When checked, [[Special:NewImages]] will also display uploads by users in the bots group.",
        "newimages-hidepatrolled": "Used as label for a checkbox. When checked, [[Special:NewImages]] will not display patrolled uploads.\n\nCf. {{msg-mw|tog-hidepatrolled}} and {{msg-mw|apihelp-feedrecentchanges-param-hidepatrolled}}.",
        "noimages": "This is shown on the special page [[Special:NewImages]], when there aren't any recently uploaded files.",
        "exif-exposureprogram-6": "One of the exposure program types in the table of metadata on image description pages. See the Wikipedia article '[[w:Mode_dial|Mode dial]]' for an explanation.\n{{Related|Exif-exposureprogram}}",
        "exif-exposureprogram-7": "One of the exposure program types in the table of metadata on image description pages. See the Wikipedia article '[[w:Mode_dial|Mode dial]]' for an explanation.\n{{Related|Exif-exposureprogram}}",
        "exif-exposureprogram-8": "One of the exposure program types in the table of metadata on image description pages. See the Wikipedia article '[[w:Mode_dial|Mode dial]]' for an explanation.\n{{Related|Exif-exposureprogram}}",
-       "exif-subjectdistance-value": "Parameters:\n* $1 - a distance measured in meters. The value can, and usually does, include decimal places.",
+       "exif-subjectdistance-value": "Parameters:\n* $1 - a distance measured in meters. The value can, and usually does, include decimal places.\n{{Identical|Meter}}",
        "exif-meteringmode-0": "{{Related|Exif-meteringmode}}\n{{Identical|Unknown}}",
        "exif-meteringmode-1": "{{Related|Exif-meteringmode}}\n{{Identical|Average}}",
        "exif-meteringmode-2": "{{exif-qqq}}\n{{Related|Exif-meteringmode}}",
        "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-restore": "{{Logentry|[[Special:Log/delete]]}}\n* $4 - {{msg-mw|restore-count-revisions}} or/and {{msg-mw|restore-count-files}}",
+       "logentry-delete-restore-nocount": "{{Logentry|[[Special:Log/delete]]}}",
+       "restore-count-revisions": "Used as parameter in {{msg-mw|logentry-delete-restore}}\n{{Identical|Revision}}",
+       "restore-count-files": "Used as parameter in {{msg-mw|logentry-delete-restore}}\n{{Identical|File}}",
        "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",
        "logentry-delete-event-legacy": "{{Logentry|[[Special:Log/delete]]}}",
        "special-characters-group-thai": "The name of the [[w:Thai alphabet|Thai]] character set (alphabet).",
        "special-characters-group-lao": "{{Identical|Lao}}",
        "special-characters-group-khmer": "{{Identical|Khmer}}",
+       "special-characters-group-canadianaboriginal": "The name of the [[w:Canadian Aboriginal syllabics|Canadian Aboriginal]] character set (alphabet).",
        "special-characters-title-endash": "Title tooltip for the en dash character (–); See https://en.wikipedia.org/wiki/Dash",
        "special-characters-title-emdash": "Title tooltip for the em dash character (—); See https://en.wikipedia.org/wiki/Dash",
        "special-characters-title-minus": "Title tooltip for the minus sign character (−), not to be confused with a hyphen",
        "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).",
        "revid": "Used to format a revision ID number in text. Parameters:\n* $1 - Revision ID number.\n{{Identical|Revision}}",
-       "pageid": "Used to format a page ID number in text. Parameters:\n* $1 - Page ID number."
+       "pageid": "Used to format a page ID number in text. Parameters:\n* $1 - Page ID number.",
+       "rawhtml-notallowed": "Error message given when $wgRawHtml = true; is set and a user uses an &lt;html&gt; tag in a system message or somewhere other than a normal page.",
+       "gotointerwiki": "{{doc-special|GoToInterwiki}}\n\nSpecial:GoToInterwiki is a warning page displayed before redirecting users to external interwiki links. Its triggered by people going to something like [[Special:Search/google:foo]].",
+       "gotointerwiki-invalid": "Message shown on Special:GoToInterwiki if given an invalid title.",
+       "gotointerwiki-external": "Message shown on Special:GoToInterwiki if given a external interwiki link (e.g. [[Special:GoToInterwiki/Google:Foo]]). $1 is the full url the user is trying to get to. $2 is the text of the interwiki link (e.g. \"Google:foo\").",
+       "undelete-cantedit": "Shown if the user tries to undelete a page that they cannot edit",
+       "undelete-cantcreate": "Shown if the user tries to undelete a page which currently does not exist, and they are not allowed to create it. This could for example happen on a wiki with custom protection levels where the page name has been create-protected and the user has the right to undelete but not the right to edit protected pages."
 }
index c0192d2..e28b723 100644 (file)
        "externaldberror": "Hawa yaykuna pantasqam karqan, ichataq manam saqillasunkichu hawa rakiqunaykita musuqchayta.",
        "login": "Yaykuy",
        "nav-login-createaccount": "Yaykuy / rakiqunata kamariy",
-       "userlogin": "Yaykuy / rakiqunata kamariy",
-       "userloginnocreate": "Yaykuy",
        "logout": "Lluqsiy",
        "userlogout": "Lluqsiy",
        "notloggedin": "Manam yaykurqankichu",
        "userlogin-noaccount": "Rakiqunaykiri manachu kanchu?",
        "userlogin-joinproject": "{{SITENAME}}man yaykuy",
-       "nologin": "Manaraqchu rakiqunaykichu kachkan? '''$1'''.",
-       "nologinlink": "Kichariy",
        "createaccount": "Musuq rakiqunata kichariy",
-       "gotaccount": "Rakiqunaykiñachu kachkan? '''$1'''.",
-       "gotaccountlink": "Yaykuy",
-       "userlogin-resetlink": "Yaykuna willayniykikunatari qunqarqankichu?",
        "userlogin-resetpassword-link": "Yaykuna rimaykita qunqarqankichu?",
        "userlogin-helplink2": "Yaykuywan yanapay",
        "userlogin-loggedin": "{{GENDER:$1|$1}} sutiyuq kaspa yaykusqañam kachkanki.\nKay qatiq hunt'ana p'anqata llamk'achiy wakin sutiwan yaykunaykipaq.",
        "createacct-another-email-ph": "E-chaski imamaytata yaykuchiy",
        "createaccountmail": "Kikinmanta tukusqa mit'alla yaykuna rimata llamk'achispa akllasqa e-chaski imamaytaman kachay",
        "createacct-realname": "Chiqap suti (munaspayki)",
-       "createaccountreason": "Kayrayku:",
        "createacct-reason": "Kayrayku",
        "createacct-reason-ph": "Imaraykutaq huk rakiqunata kamarichkanki",
        "createacct-submit": "Rakiqunaykita kamariy",
        "watchthis": "Kay qillqata watiqay",
        "savearticle": "P'anqata waqaychay",
        "savechanges": "Hukchasqata waqaychay",
+       "publishpage": "P'anqata uyaychay",
+       "publishchanges": "Hukchasqakunata uyaychay",
        "preview": "Manaraq waqaychaspa qhawariy",
        "showpreview": "Ñawpaqta qhawallay",
        "showdiff": "Hukchasqakunata rikuchiy",
        "content-model-text": "qillqalla",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
-       "expensive-parserfunction-warning": "Paqtataq: Kay p'anqaqa nisyu achka qullqipaq t'ikrana rurana qayayniyuqmi.\n\n$2-manta aswan pisillam {{PLURAL:$2|qayayniyuq|qayayniyuq}} kanman, kunantaq {{PLURAL:$1|$1 qayayniyuqmi|$1 qayayniyuqmi}} kachkan.",
-       "expensive-parserfunction-category": "Nisyu achka qullqipaq t'ikrana rurana qayayniyuq p'anqakuna",
+       "expensive-parserfunction-warning": "Paqtataq: Kay p'anqaqa nisyu achka qullqipaq k'uskina rurana qayayniyuqmi.\n\n$2-manta aswan pisillam {{PLURAL:$2|qayayniyuq}} kanman, kunantaq {{PLURAL:$1|$1 qayayniyuqmi}} kachkan.",
+       "expensive-parserfunction-category": "Nisyu achka qullqipaq k'uskina rurana qayayniyuq p'anqakuna",
        "post-expand-template-inclusion-warning": "Paqtataq: Nisyum ch'aqtasqa plantillakuna.\nHuk plantillakunaqa manam ch'aqtasqachu kanqa.",
        "post-expand-template-inclusion-category": "Nisyu ch'aqtasqa plantillakunayuq p'anqakuna",
        "post-expand-template-argument-warning": "Paqtataq: Kay p'anqaqa huk icha aswan nisyu ch'aqtasqa plantilla niyniyuqmi.\nChay niykunaqa manam chaninchasqachu.",
        "undeleteviewlink": "qhaway",
        "undeleteinvert": "Akllasqantinta t'ikrachiy",
        "undeletecomment": "Kayrayku:",
-       "undeletedrevisions": "{{PLURAL:$1|Huk paqarichisqa llamk'apusqa|$1 paqarichisqa llamk'apusqakuna}}",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 llamk'apusqaqa|$1 llamk'apusqakunaqa}} {{PLURAL:$2|1 willañiqipas|$2 willañiqikunapas}} paqarichisqam",
-       "undeletedfiles": "{{PLURAL:$1|1 willañiqiqa|$1 willañiqikunaqa}} paqarichisqam",
        "cannotundelete": "Manam atinichu qullusqata paqarichiyta: $1",
        "undeletedpage": "'''$1 nisqaqa paqarichisqañam'''\n\n[[Special:Log/delete|Qulluy hallch'api]] qhaway ñaqha qullusqakunata paqarichisqakunatapas rikunaykipaq.",
        "undelete-header": "[[Special:Log/delete|Qulluy hallch'apiqa]] qullusqa p'anqakunap sutinkunatam rikunki.",
        "tooltip-ca-nstab-category": "Katiguriyamanta p'anqata qhaway",
        "tooltip-minoredit": "Kayta aslla hukchay nispa sananchay",
        "tooltip-save": "Hukchasqakunata waqaychay",
+       "tooltip-publish": "Hukchasqaykikunata uyaychay",
        "tooltip-preview": "Ñawpaqtaqa hukchasqaykikunata qhawarillay, manaraq waqaychaspa!",
        "tooltip-diff": "Qillqapi hukchasqaykikunata rikuchiy.",
        "tooltip-compareselectedversions": "P'anqap iskay akllasqa hukchasqanpura hukchasqa kayta qhaway.",
        "version-extensions": "Tiyachisqa mast'arinakuna",
        "version-skins": "Churasqa qarakuna",
        "version-specialpages": "Sapaq p'anqakuna",
-       "version-parserhooks": "T'ikrana ch'iwinakuna",
+       "version-parserhooks": "K'uskina ch'iwinakuna",
        "version-variables": "Hukchakuqkuna",
        "version-antispam": "Spam hark'ay",
        "version-other": "Wakin",
        "version-mediahandlers": "Midya llamk'apuq",
        "version-hooks": "Ch'iwinakuna",
-       "version-parser-extensiontags": "T'ikrana mast'arina ruranakuna",
-       "version-parser-function-hooks": "T'ikrana rurana ch'iwinakuna",
+       "version-parser-extensiontags": "K'uskina mast'arina ruranakuna",
+       "version-parser-function-hooks": "K'uskina rurana ch'iwinakuna",
        "version-hook-name": "Ch'iwinap sutin",
        "version-hook-subscribedby": "Kay runap mañaykusqan:",
        "version-version": "($1)",
        "logentry-rights-autopromote": "{{GENDER:$2|}}$1 sutiyuq ruraqqa kikinmantam ñawparikun $4-manta $5-man",
        "logentry-upload-upload": "$1 {{GENDER:$2|churkusqa}} $3",
        "rightsnone": "(-)",
-       "revdelete-summary": "yuyarinata llamk'apuy",
        "feedback-adding": "Willapuyniykita kay p'anqaman yapay: ...",
        "feedback-bugcheck": "Allillanmi! Llanchirillay [$1 riqsisqapura huk pantasqañachu] mana kanmanchu.",
        "feedback-bugnew": "Llanchisqañam. Musuq pantasqamanta willay",
        "duration-centuries": "{{PLURAL:$1|pachakwata|pachakwatakuna}}",
        "duration-millennia": "{{PLURAL:$1|waranqawata|waranqawatakuna}}",
        "rotate-comment": "Rikch'aqa pacha rikuchiqwan $1 {{PLURAL:$1|k'atma}} muyusqam",
+       "limitreport-title": "K'uskina k'utupanapaq qusqakuna:",
        "limitreport-cputime-value": "$1 {{PLURAL:$1|sikundu|sikundukuna}}",
        "limitreport-walltime-value": "$1 {{PLURAL:$1|sikundu|sikundukuna}}",
        "limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$2|byte}}",
index 6e54be3..36a1485 100644 (file)
        "aboutsite": "Davart {{SITENAME}}",
        "aboutpage": "Project:Davart",
        "copyright": "Il cuntegn è disponibel sut la licenza $1 sche betg inditgà autramain.",
-       "copyrightpage": "{{ns:project}}:Resguardar_dretgs_d_autur",
+       "copyrightpage": "{{ns:project}}:Resguardar dretgs d autur",
        "currentevents": "Events actuals",
        "currentevents-url": "Project:Events actuals",
        "disclaimers": "Impressum",
        "externaldberror": "U ch'i è capità ina errur cun l'autentificaziun externa u che ti na dastgas betg actualisar tes conto extern.",
        "login": "T'annunziar",
        "nav-login-createaccount": "T'annunziar / crear in conto",
-       "userlogin": "T'annunziar / crear in conto",
-       "userloginnocreate": "T'annunziar",
        "logout": "Sortir",
        "userlogout": "sortir",
        "notloggedin": "Betg s'annunzià",
        "userlogin-noaccount": "Anc nagin conto?",
        "userlogin-joinproject": "Far part da {{SITENAME}}",
-       "nologin": "Anc nagin conto? '''$1'''.",
-       "nologinlink": "Crear in conto d'utilisader",
        "createaccount": "Crear in conto d'utilisader",
-       "gotaccount": "Gia in conto d'utilisader? '''$1'''.",
-       "gotaccountlink": "T'annunziar",
-       "userlogin-resetlink": "Emblidà tias datas per s'annunziar?",
        "userlogin-resetpassword-link": "Has emblidà tes pled-clav?",
        "userlogin-loggedin": "Ti es gia t'annunzià sco {{GENDER:$1|$1}}.\nDovra il suandant formular per t'annunziar cun in auter conto.",
        "userlogin-createanother": "Crear in auter conto",
        "createacct-another-email-ph": "Endatescha in'adressa dad e-mail",
        "createaccountmail": "Dovrar per il mument in pled-clav casual ed inviar el a l'adressa d'e-mail inditgada.",
        "createacct-realname": "Num real (opziunal)",
-       "createaccountreason": "Motiv:",
        "createacct-reason": "Motiv",
        "createacct-reason-ph": "Tes motiv per crear in auter conto",
        "createacct-submit": "Crear tes conto",
        "passwordreset-disabled": "La pussaivladad da redefinir il pled-clav è vegnida deactivada sin questa wiki.",
        "passwordreset-username": "Num d'utilisader:",
        "passwordreset-domain": "Domain:",
-       "passwordreset-capture": "Mussar l'e-mail che resultescha?",
-       "passwordreset-capture-help": "Sche ti activeschas quest champ vegn l'e-mail (cun il pled-clav temporar) mussà a ti sco era tramess a l'utilisader.",
        "passwordreset-email": "Adressa dad e-mail:",
        "passwordreset-emailtitle": "Detagls davart il conto sn {{SITENAME}}",
        "passwordreset-emailtext-ip": "Insatgi (probablamain ti, da l'adressa IP $1) ha dumandà da redefinir il pled-clav per la pagina {{SITENAME}} ($4). \n{{PLURAL:$3|Il suandant conto d'utilisader è collià|Ils suandants contos d'utilisader èn colliads}} cun questa adressa d'e-mail:\n\n$2\n\n{{PLURAL:$3|Quest pled-clav temporar|Quests pleds-clav temporars}} èn valids {{PLURAL:$5|in di|$5 dis}}.\nTi duessas t'annunziar ussa e tscherner in nov pled-clav. Sch'enzatgi auter ha empustà quests novs pleds-clav u sche ti ta regordas puspè da tes pled-clav original e na vuls betg pli midar el, pos ti ignorar quest messadi e cuntinuar d'utilisar tes pled-clav original.",
        "saveprefs": "memorisar",
        "restoreprefs": "Restituir tut las preferenzas da standard (en tut las secziuns)",
        "prefs-editing": "Modifitgar",
-       "rows": "Lingias:",
-       "columns": "Colonnas:",
        "searchresultshead": "Tschertga",
        "stub-threshold": "Limita per la formataziun sco <a href=\"#\" class=\"stub\">colliaziun a stubs</a>, en bytes:",
        "stub-threshold-disabled": "Deactivà",
        "userrights-reason": "Motiv:",
        "userrights-no-interwiki": "Ti n'has betg la permissiun da midar dretgs d'utilisaders sin autras wikis.",
        "userrights-nodatabase": "La banca da datas $1 n'exista betg u n'è betg locala.",
-       "userrights-nologin": "Ti stos [[Special:UserLogin|t'annunziar]] cun in conto d'aministratur per modifitgar ils dretgs d'utilisader.",
-       "userrights-notallowed": "Ti n'has betg la permissiun d'agiuntar u allontanar dretgs d'utilisader.",
        "userrights-changeable-col": "Gruppas che ti pos modifitgar",
        "userrights-unchangeable-col": "Gruppas che ti nas pos betg modifitgar",
        "group": "Gruppa:",
        "right-siteadmin": "Bloccar u debloccar la banca da datas",
        "right-override-export-depth": "Exportar paginas inclusivamain paginas colliadas fin ad ina profunditad da 5",
        "right-sendemail": "Trametter e-mails ad auters utilisaders",
-       "right-passwordreset": "Vesair l'e-mail per redefinir pleds-clav",
        "newuserlogpage": "Protocol d'utilisaders creads",
        "newuserlogpagetext": "Quai è il protocol dals contos d'utilisader ch'èn vegnids creads.",
        "rightslog": "Protocol dals dretgs d'utilisader",
        "logentry-rights-rights-legacy": "$1 ha {{GENDER:$2|midà}} la commembranza da gruppas per $3",
        "logentry-rights-autopromote": "$1 è vegnì {{GENDER:$2|promovì|promovida}} automaticamain da $4 a $5",
        "rightsnone": "(nagins)",
-       "revdelete-summary": "resumaziun da la midada",
        "feedback-adding": "Agiuntar il resun a la pagina…",
        "feedback-bugcheck": "Grondius! Controllescha simplamain che quai n'è betg gia in da las [$1 errurs enconuschentas].",
        "feedback-bugnew": "Jau hai controllà. Rapportar ina nova errur.",
        "feedback-thanks": "Grazia! Tes resun è vegnì publitgà sin la pagina \"[$2 $1]\".",
        "searchsuggest-search": "Tschertgar",
        "searchsuggest-containing": "cuntegna…",
-       "api-error-badaccess-groups": "Ti na dastgas betg chargiar datotecas en quest wiki.",
        "api-error-badtoken": "Errur interna: Token fauss.",
-       "api-error-copyuploaddisabled": "La funcziun da transferir dad ina URL è deactivada sin quest server.",
-       "api-error-duplicate": "I dat gia {{PLURAL:$1|ina autra datoteca|autras datotecas}} cun il medem cuntegn.",
-       "api-error-duplicate-archive": "I deva gia {{PLURAL:$1|ina autra datoteca|autras datotecas}} cun il medem cuntegn, {{PLURAL:$1|quella è dentant vegnida stizzada|quellas èn dentant vegnidas stizzadas}}.",
-       "api-error-empty-file": "La datoteca tramessa è vida.",
        "api-error-emptypage": "Crear paginas novas e vidas n'è betg lubì.",
-       "api-error-fetchfileerror": "Errur interna: Insatge n'ha betg funcziunà durant retschaiver la datoteca.",
-       "api-error-fileexists-forbidden": "Ina datoteca cun il num \"$1\" exista gia e na po betg vegnir remplazzada.",
-       "api-error-fileexists-shared-forbidden": "Ina datoteca cun il num \"$1\" exista gia en il repository communabel e na po betg vegnir remplazzada.",
-       "api-error-file-too-large": "La datoteca che ti has tramess era memia gronda.",
-       "api-error-filename-tooshort": "Il num da datoteca è memia curt.",
-       "api-error-filetype-banned": "Quest tip da datoteca è scumandà.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|n'è betg in tip da datoteca lubì|n'èn betg tips da datoteca lubids}}. Lubidas èn datotecas {{PLURAL:$3|dal tip|dals tips}} $2.",
-       "api-error-filetype-missing": "Il num da datoteca n'ha betg ina finiziun da datoteca.",
-       "api-error-hookaborted": "La midada che ti has empruvà da far è vegnida interrutta dad ina extensiun.",
-       "api-error-http": "Errur interna: Impussibel da connectar cun il server.",
-       "api-error-illegal-filename": "Il num da datoteca n'è betg lubì.",
-       "api-error-internal-error": "Errur interna: Insatge n'ha betg funcziunà durant transmetter tia datoteca en la vichi.",
-       "api-error-invalid-file-key": "Errur interna: La datoteca n'è betg vegnida chattada en la memoria temporara.",
-       "api-error-missingparam": "Errur interna: Parameters da la dumonda manchants.",
-       "api-error-missingresult": "Errur interna: I na pudeva betg vegnir constatà sch'il process da copiar è reussì.",
-       "api-error-mustbeloggedin": "Ti stos esser t'annunzià per pudair transferir datotecas.",
-       "api-error-mustbeposted": "Errur interna: La dumonda basegna HTTP POST.",
-       "api-error-noimageinfo": "La datoteca è vegnida transferida cun success, ma il server n'ha returnà naginas infurmaziuns davart la datoteca.",
-       "api-error-nomodule": "Errur interna: Nagin modul per chargiar si è definì.",
-       "api-error-ok-but-empty": "Errur interna: Nagina resposta dal server.",
-       "api-error-overwrite": "Recuvrir (surscriver) ina daoteca existenta n'è betg lubì.",
        "api-error-stashfailed": "Errur interna: Errur cun memorisar la datoteca temporara.",
-       "api-error-timeout": "Il server n'ha betg respundì entaifer il temp spetgà.",
-       "api-error-unclassified": "Ina errur nunenconuschenta è capitada.",
-       "api-error-unknown-code": "Errur nunenconuschenta: \"$1\"",
-       "api-error-unknown-error": "Errur interna: Insatge n'ha betg funcziunà durant transferir tia datoteca.",
        "api-error-unknown-warning": "Avertiment nunenconuschent: \"$1\".",
        "api-error-unknownerror": "Errur nunenconuschenta: \"$1\".",
-       "api-error-uploaddisabled": "La funcziun da chargiar datotecas sin quest vichi è deactivada.",
-       "api-error-verification-error": "Questa datoteca pudess esser corrupta ni avair ina extensiun faussa.",
        "duration-seconds": "$1 {{PLURAL:$1|secunda|secundas}}",
        "duration-minutes": "$1 {{PLURAL:$1|minuta|minutas}}",
        "duration-hours": "$1 {{PLURAL:$1|ura|uras}}",
index 4279d24..3f8d740 100644 (file)
        "recentchanges-legend-plusminus": "(''±123'')",
        "recentchanges-submit": "Afișează",
        "rcnotefrom": "Dedesubt {{PLURAL:$5|se află o modificare|sunt modificările}} începând cu <b>$3, $4</b> (maximum <b>$1</b> afișate).",
-       "rclistfrom": "Se afișează modificările începând cu $3, $2",
+       "rclistfrom": "Afișează modificările începând cu $3, ora $2",
        "rcshowhideminor": "$1 modificările minore",
        "rcshowhideminor-show": "Arată",
        "rcshowhideminor-hide": "Ascunde",
index a58a9db..b5fed9f 100644 (file)
        "searcharticle": "Véje",
        "history": "Storie d'a pàgene",
        "history_short": "Cunde",
+       "history_small": "cunde",
        "updatedmarker": "aggiornate da l'urtema visita meje",
        "printableversion": "Versione ca se stambe",
        "permalink": "Collegamende ca remane pe sembre",
        "virus-scanfailed": "condrolle fallite (codece $1)",
        "virus-unknownscanner": "antivirus scanusciute:",
        "logouttext": "'''Tu tè scollegate.'''\n\nNote Bbuene ca certe pàggene ponne condinuà a essere viste cumme ce tu ste angore collegate, fine a quanne a cache d'u browser no se sdevache.",
+       "cannotlogoutnow-title": "Non ge puè assè mò",
+       "cannotlogoutnow-text": "Non ge puè assè quanne ste ause $1.",
        "welcomeuser": "Bovègne, $1!",
        "welcomecreation-msg": "'U cunde tue ha state ccrejete.\nNo te sce scurdanne de cangià le [[Special:Preferences|{{SITENAME}} preferenze tue]].",
        "yourname": "Nome utende:",
        "userlogin-remembermypassword": "Arrecuèrdeme",
        "userlogin-signwithsecure": "Ause 'na connessione secure",
        "cannotlogin-title": "Non ge puè trasé",
+       "cannotlogin-text": "Non ge puè trasè.",
+       "cannotloginnow-title": "Non ge puè trasè mò",
        "cannotcreateaccount-title": "Non ge pué ccrejà le cunde utinde",
        "yourdomainname": "'U nome d'u dominie tue:",
        "password-change-forbidden": "Non ge puè cangià le passuord sus a sta uicchi.",
        "externaldberror": "Vide bbuene, o stè 'n'errore de autendicazione a 'u database oppure tu non ge puè aggiorna 'u cunde tue esterne.",
        "login": "Tràse",
+       "login-security": "Verifiche l'idendità toje",
        "nav-login-createaccount": "Tràse / Reggistrete",
-       "userlogin": "Tràse / Reggistrete",
-       "userloginnocreate": "Tràse",
        "logout": "Isse",
        "userlogout": "Isse",
        "notloggedin": "Non ge sì colleghete",
        "userlogin-noaccount": "Non ge tìne 'nu cunde?",
        "userlogin-joinproject": "Tràse jndr'à {{SITENAME}}",
-       "nologin": "Non ge tine n'utenze? '''$1'''.",
-       "nologinlink": "Ccreje 'nu cunde utende",
        "createaccount": "Ccreje 'nu cunde",
-       "gotaccount": "Tine già 'nu cunde? '''$1'''.",
-       "gotaccountlink": "Tràse",
-       "userlogin-resetlink": "T'è scurdate le dettaglie pe trasè?",
        "userlogin-resetpassword-link": "T'è scurdate 'a passuord toje?",
        "userlogin-helplink2": "Aijute cu 'a trasute",
        "userlogin-loggedin": "Tu ste jndre ggià cumme a {{GENDER:$1|$1}}.\nAuse 'u module aqquà sotte pe trasè cumme a 'n'otre utende.",
        "createacct-another-email-ph": "Mitte l'indirizze email",
        "createaccountmail": "Ause 'na passuord temboranèe a uecchije e mannale a l'indirizze email specificate",
        "createacct-realname": "Nome vere (opzionale)",
-       "createaccountreason": "Mutive:",
        "createacct-reason": "Mutive",
        "createacct-reason-ph": "Purcé tu ste ccreje 'n'otre cunde utende?",
        "createacct-submit": "Ccreje 'u cunde utende tune",
        "createacct-another-submit": "Ccreje 'nu cunde utende",
+       "createacct-continue-submit": "Condinue 'a ccrejazzione de l'utende",
+       "createacct-another-continue-submit": "Condinue 'a ccrejazzione de l'utende",
        "createacct-benefit-heading": "{{SITENAME}} jè fatte da crestiane cumme a te.",
        "createacct-benefit-body1": "{{PLURAL:$1|cangiamende|cangiaminde}}",
        "createacct-benefit-body2": "{{PLURAL:$1|pàgene|pàggene}}",
        "botpasswords-label-cancel": "Annulle",
        "botpasswords-label-delete": "Scangìlle",
        "botpasswords-label-resetpassword": "Azzere 'a passuord",
+       "botpasswords-label-grants-column": "Assegnazziune",
+       "botpasswords-created-title": "Passuord d'u bot ccrejate",
+       "botpasswords-updated-title": "Passuord d'u bot cangiate",
+       "botpasswords-deleted-title": "Passuord d'u bot scangellate",
        "resetpass_forbidden": "Le Password non ge ponne cangià",
        "resetpass-no-info": "Tu a essere colleghete pe accedere a sta pàgene direttamende.",
        "resetpass-submit-loggedin": "Cange 'a password",
        "passwordreset-emailtext-user": "L'utende $1 sus a {{SITENAME}} ave richieste 'na mail pe arrecurdarse le dettaglie d'u cunde sue pe {{SITENAME}}\n($4). {{PLURAL:$3|'U cunde utende seguende jè|le cunde utinde seguende sonde}} associate cu st'indirizze e-mail:\n\n$2\n\n{{PLURAL:$3|Sta passuord temboranèe scade|Ste passuord temboranèe scadene}}  'mbrà {{PLURAL:$5|'nu sciurne|$5 sciurne}}.\nTu avissa trasè e scacchià 'na passuord nova. Ce quacchedun'otre ha fatte sta richieste, o ce tu t'è arrecurdate 'a passuord origgenale toje, e non g'a vuè ccu cange cchiù, tu puè ignorà stu messagge e condinuà ausanne 'a passuord vecchie.",
        "passwordreset-emailelement": "Nome utende: \n$1\n\nPassuord temboranèe: \n$2",
        "passwordreset-emailsentemail": "Ce queste éte 'n'e-mail pu cunde tune, allore 'na password azzerate ha state mannate addà.",
+       "passwordreset-nocaller": "'Nu chiamande adda essere mise",
+       "passwordreset-nosuchcaller": "'U chiamande nnon g'esiste: $1",
        "changeemail": "Cange o live 'u 'ndirizze e-mail",
        "changeemail-header": "Comblete stu module pe cangià 'u 'ndirizze email. Ce tu vuè ccu live l'associazione cu ogne indirizze email da 'u cunde tune, lasse 'u 'ndirizze email vacande quanne conferme 'u module.",
        "changeemail-no-info": "Tu a essere collegate pe accedere a sta pàgene direttamende.",
        "selfredirect": "<strong>Attenziò:</strong> Tu ste redirezione sta pàgene da sule.\nTu puè avè specificate 'a destinazione sbagliate pe stu redirezionamende, o tu ste cange 'a pàgena sbagliate.\nCe tu cazze \"{{int:savearticle}}\" arrete, 'u redirezionamende avène ccrejate 'u stesse.",
        "missingcommenttext": "Pe piacere mitte 'nu commende aqquà sotte.",
        "missingcommentheader": "<strong>Arrecuèrdete:</strong> Tu non g'è provvedute a 'nu soggette pe stu commende.\nCe tu cazze \"{{int:savearticle}}\" 'n'otra vote, 'u cangiamende tune avène memorizzate senze jidde.",
-       "summary-preview": "Andeprime d'u riepileghe:",
-       "subject-preview": "Andeprime de l'Oggette:",
+       "summary-preview": "Andeprime d'u riepileghe d'u cangiamende:",
+       "subject-preview": "Andeprime de l'oggette:",
        "previewerrortext": "'N'errore ha assute quanne ste facive l'andeprime de le cangiaminde.",
        "blockedtitle": "L'utende è blocchete",
        "blockedtext": "''''U nome de l'utende o l'indirizze IP ha state bloccate.'''\n\n'U blocche ha state fatte da $1.\n'U mutive date jè ''$2''.\n\n* 'U Blocche accumenze: $8\n* 'U Blocche spicce: $6\n* Tipe de blocche: $7\n\nTu puè condatta $1 o n'otre [[{{MediaWiki:Grouppage-sysop}}|amministratore]] pe 'ngazzarte sus a 'u blocche.\nTu non ge puè ausà 'u strumende 'manne 'na mail a stu utende' senza ca mitte n'indirizze e-mail valide jndr'à le\n[[Special:Preferences|preferenze tue]] e ce è state blocchete sus 'a l'use sue.\nL'IP ca tine mò jè $3 e 'u codece d'u blocche jè #$5.\nPe piacere mitte ste doje 'mbormaziune ce manne 'na richieste de sblocche.",
        "previewnote": "'''Arrecuerdete queste è sole 'n'andeprime.'''\nle cangiaminde non g'onne state angore reggistrate!",
        "continue-editing": "Veje jndr'à l'arèe de le cangiaminde",
        "previewconflict": "Sta andeprime fece vedè 'u teste ca ste jndr'à 'u teste de l'area de sus cumme avène fore ce tu decide cu reggistre.",
-       "session_fail_preview": "'''Ne dispiace! Non ge putime processà 'u cangiamende tue purcè s'a perse 'a sessione de le date.\nPe piacere pruève 'n'otra vote.\nCe angore non ge funzione ninde, [[Special:UserLogout|isse]] e tràse 'n'otre vote.'''",
-       "session_fail_preview_html": "'''Ne dispiace! nuje non ge putime processà 'u cangiamende tue purcè è perse 'a sessione de le date.'''\n\n''Purcè {{SITENAME}} tène abbilitate l'HTML grezze, l'andeprime è scunnute cumme precauzione condre a l'attacche cu 'u JavaScript.''\n\n'''Ce quiste jè 'nu tendative corrette de cangiamende, pe piacere prueve 'n'otra vote.'''\nCe angore tìne probbleme, prueve a [[Special:UserLogout|assè]] e te recolleghe 'n'otra vote.",
+       "session_fail_preview": "Ne dispiace! Non ge putime processà 'u cangiamende tue purcè s'a perse 'a sessione de le date.\n\nPò essere ca tu è assute. <strong>Pe piacere condrolle ce tu ste angore jndre e pruève arrete</strong>.\nCe angore non ge funzione ninde, [[Special:UserLogout|isse]] e tràse 'n'otra vote e condrolle ca 'u browser tune pò ausà le cookie sus a stu site.",
+       "session_fail_preview_html": "Ne dispiace! nuje non ge putime processà 'u cangiamende tue purcè è perse 'a sessione de le date.\n\n<em>Purcè {{SITENAME}} tène abbilitate l'HTML grezze, l'andeprime è scunnute cumme precauzione condre a l'attacche cu 'u JavaScript.</em>\n\n<strong>Ce quiste jè 'nu tendative corrette de cangiamende, pe piacere prueve 'n'otra vote.</strong>\nCe angore tìne probbleme, prueve a [[Special:UserLogout|assè]] e te recolleghe 'n'otra vote e condrolle ca 'u browser tune pò ausà le cookie sus a stu site.",
        "token_suffix_mismatch": "''''U cangiamende tue ha state scettate purcè 'u ''client'' tue non ge tène le carattere de le punde jndr'à 'u gettone de cangiamende.'''\n'U cangiamende ha state scettate pe prevenì corruzione d'u teste d'a pàgene.\nCerte vote, stu fatte succede quanne tu ste ause 'nu servizie proxy cu le bochere e anonime.",
        "edit_form_incomplete": "'''Quacche stuèzze d'u module de le cangiaminde non g'ha state ricevute da 'u server; verifeche arrete ca le cangiaminde tune sonde apposte e pruève arrete.'''",
        "editing": "Cangiaminde de $1",
        "copyrightwarning2": "Pe piacere vide ca tutte le condrebbute de {{SITENAME}} ponne essere cangete, alterate o luvete da otre condrebbutore.\nCe tu non ge vuè ca quidde ca scrive avène cangete da tre, allore non scè scrivenne proprie aqquà.<br />\nTu ne stè promitte ca quidde ca scrive tu, o lè scritte cu 'u penziere tue o lè cupiate da risorse de pubbliche dominie o sembre robba libbere (vide $1 pe cchiù dettaglie).\n'''NO REGGISTRA' FATIJE CUPERTE DA 'U COPYRIGHT SENZA PERMESSE! NO FA STUDECARIE!'''",
        "editpage-cannot-use-custom-model": "'U modelle de condenute de sta pàgene non ge pò essere cangiate.",
        "longpageerror": "'''ERRORE: 'U teste ca tu vuè ccu reggistre è luenghe {{PLURAL:$1|'nu kilobyte|$1 kilobyte}}, invece 'u limite massime jè de {{PLURAL:$2|'nu kilobyte|$2 kilobyte}}.'''\nNon ge puè reggistrà sta pàggene.",
-       "readonlywarning": "'''FA ATTENZIO': 'U database ha state bloccate pe manutenzione, e allore tu non ge puè reggistrà le cangiaminde ca ste face mò.'''\nTu puè fa 'na bella cose, tagghie e 'nzicche le cangiaminde jndr'à 'nu file de teste sus a 'u combiuter tune e pò cchiù tarde le reggistre sus 'a Uicchi.\n\nL'amministratore ca ha bloccate 'u database ha date stu mutive: $1",
+       "readonlywarning": "<strong>FA ATTENZIO': 'U database ha state bloccate pe manutenzione, e allore tu non ge puè reggistrà le cangiaminde ca ste face mò.</strong>\nTu puè fa 'na bella cose, tagghie e 'nzicche le cangiaminde jndr'à 'nu file de teste sus a 'u combiuter tune e pò cchiù tarde le reggistre sus 'a Uicchi.\n\nL'amministratore ca ha bloccate 'u database ha date stu mutive: $1",
        "protectedpagewarning": "'''ATTENZIO': Sta pàgene ha state bloccate e allore sulamende le utinde cu le privilegge de ''sysop'' ponne cangiarle.'''\nL'urteme archivie de le trasute ha state previste aqquà sotte pe referimende:",
        "semiprotectedpagewarning": "'''Fà attenzione:''' Sta pàgene ha state bloccate accussì sulamende l'utinde reggistrete ponne fà cangiaminde.\nL'urteme archivije de le trasute ha state previste aqquà sotte pe referimende:",
        "cascadeprotectedwarning": "<strong>FA ATTENZIO':</strong> Sta pàgene ha state blocchete accussì sulamende l'utinde ca tènene le deritte de amministratore a ponne cangià, purcè inglude {{PLURAL:$1|pàgene|pàggene}} prutette a cascate:",
        "page_first": "prime",
        "page_last": "urteme",
        "histlegend": "Differenze de selezione: signe le radio box de le versiune ca vuè cu combronde e cazze ''invio'' o 'u buttone ca ste sotte.<br />\nLeggenda: (cur) = differenze cu 'a versiona corrende,\n(last) = differenze ca 'a versione precedende, M = cangiaminde stuédeche.",
-       "history-fieldset-title": "Sfogghje 'a storie",
-       "history-show-deleted": "Sule le scangellate",
+       "history-fieldset-title": "cirche pe revisiune",
+       "history-show-deleted": "Sule le revisiune scangellate",
        "histfirst": "Prime",
        "histlast": "Urteme",
        "historysize": "({{PLURAL:$1|1 byte|$1 bytes}})",
        "revdelete-unsuppress": "Live le restriziune sus a le revisiune repristinate",
        "revdelete-log": "Mutive:",
        "revdelete-submit": "Applichesce a {{PLURAL:$1|'a revisione|le revisiune}} selezionate",
-       "revdelete-success": "'''Visibbilità de le revisiune aggiornate correttamende.'''",
+       "revdelete-success": "Visibbilità de le revisiune aggiornate.",
        "revdelete-failure": "''' 'A visibbilità de le revisiune non ge pò essere aggiornate:'''\n$1",
-       "logdelete-success": "'''Log visibility successfully set.'''\n'''Visibbilità de l'archivije 'mbostate correttamende.'''",
+       "logdelete-success": "Visibbilità de l'archivije 'mbostate.",
        "logdelete-failure": "'''L'archivije d'a visibbilità non ge pò essere 'mbostate:'''\n$1",
        "revdel-restore": "Cange 'a visibilità",
        "pagehist": "Storie d'a vôsce",
        "prefs-help-prefershttps": "Sta preferenze pigghie effette sulamende quanne tràse arrete.",
        "prefswarning-warning": "Tu è fatte cangiaminde sus a le preferenze tune ca non g'onne state angore reggistrate.\nCe tu lasse sta pàgene senze ca è cazzate \"$1\" le preferenze tune non g'avènene aggiornate.",
        "prefs-tabs-navigation-hint": "Conziglie: Tu puè ausà le freccie de destre e sinistre pe navigà 'mbrà le schede de l'elenghe.",
-       "userrights": "Gestione de le deritte utende",
-       "userrights-lookup-user": "Gestisce le gruppe de l'utinde",
+       "userrights": "Deritte utende",
+       "userrights-lookup-user": "Scacchie 'n'utende",
        "userrights-user-editname": "Mitte 'nu nome utende:",
-       "editusergroup": "Cange le gruppe utinde",
+       "editusergroup": "Careche le gruppe utinde",
        "editinguser": "Stè cange le deritte de {{GENDER:$1|l'utende}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Cange le gruppe d'utinde",
-       "userrights-viewusergroup": "'Ndruche le gruppe d'utinde",
-       "saveusergroups": "Reggistre le gruppe d'utinde",
+       "userrights-editusergroup": "Cange le gruppe {{GENDER:$1|utinde}}",
+       "userrights-viewusergroup": "'Ndruche le gruppe {{GENDER:$1|utinde}}",
+       "saveusergroups": "Reggistre le gruppe {{GENDER:$1|utinde}}",
        "userrights-groupsmember": "Membre de:",
        "userrights-groupsmember-auto": "Membre imblicite de:",
        "userrights-groups-help": "Tu puè alterà le gruppe addò de st'utende jè iscritte:\n* 'Na spunde de verifiche significhe ca l'utende stè jndr'à stu gruppe.\n* 'A spunda de verifica luate significhe ca l'utende non ge stè jndr'à stu gruppe.\n* 'Nu * significhe ca tu non ge puè luà 'u gruppe 'na vote ca tu l'è aggiunde, o a smerse.",
        "undeleteviewlink": "vide",
        "undeleteinvert": "Selezione a smerse",
        "undeletecomment": "Mutive:",
-       "undeletedrevisions": "{{PLURAL:$1|1 revisione|$1 revisiune}} ripristinete",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 revisione|$1 revisiune}} e {{PLURAL:$2|1 file|$2 file}} ripristinete",
-       "undeletedfiles": "{{PLURAL:$1|1 file|$1 file}} ripristinete",
        "cannotundelete": "Repristine fallite:\n$1",
        "undeletedpage": "'''$1 ha state repristinate'''\n\nLigge l'[[Special:Log/delete|archivije de le scangellaminde]] pe 'nu report de le urteme scangellaminde e repristinaminde.",
        "undelete-header": "Vide [[Special:Log/delete|l'archivije de le scangellaminde]] pe l'urteme pàggene scangellete.",
        "htmlform-user-not-exists": "<strong>$1</strong> non g'esiste.",
        "htmlform-user-not-valid": "<strong>$1</strong> non g'è 'nu nome utende valide.",
        "logentry-delete-delete": "$1 pàgena {{GENDER:$2|scangellate}} $3",
-       "logentry-delete-restore": "$1 pàgena {{GENDER:$2|repristinate}} $3",
+       "logentry-delete-restore": "$1 pàgena {{GENDER:$2|repristinate}} $3 ($4)",
+       "logentry-delete-restore-nocount": "$1 {{GENDER:$2|repristinate}} pàgene $3",
        "logentry-delete-event": "$1 {{GENDER:$2|cangiate}} 'a vesibbilità {{PLURAL:$5|de l'archivije de le fatte|$5 de l'archivije de le fatte}} sus 'a $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|cangiate}} 'a vesibbilità {{PLURAL:$5|d'a revisione|$5 de le revisiune}} sus 'a pàgene $3: $4",
        "logentry-delete-event-legacy": "$1 {{GENDER:$2|cangiate}} 'a vesibbilità d'u archivije de le fatte sus 'a $3",
        "logentry-tag-update-revision": "$1 {{GENDER:$2|aggiornate}} le tag sus 'a revisione $4 d'a pàgene $3 ({{PLURAL:$7|aggiunde}} $6; {{PLURAL:$9|luate}} $8)",
        "logentry-tag-update-logentry": "$1 {{GENDER:$2|aggiornate}} le tag sus 'a vôsce de l'archivije $5 d'a pàgene $3 ({{PLURAL:$7|aggiunde}} $6; {{PLURAL:$9|luate}} $8)",
        "rightsnone": "(ninde)",
-       "revdelete-summary": "cange 'u riepileghe",
        "feedback-adding": "Aggiunge feedback a 'a pàgene...",
        "feedback-back": "Rrete",
        "feedback-bugcheck": "Granne! Appene verificate ca non g'è une de le [$1 bug canusciute].",
        "mw-widgets-dateinput-no-date": "Nisciune date scacchiate",
        "mw-widgets-titleinput-description-new-page": "'a pàgene non g'esiste angore",
        "mw-widgets-titleinput-description-redirect": "redirezionate sus a $1",
-       "randomrootpage": "Pàgene prengepàle a uecchije"
+       "randomrootpage": "Pàgene prengepàle a uecchije",
+       "gotointerwiki": "Ste lasse {{SITENAME}}"
 }
index 36efee9..aaf4370 100644 (file)
                        "Gamliel Fishkin",
                        "Ping08",
                        "Yuryleb",
-                       "Redredsonia"
+                       "Redredsonia",
+                       "Nitch",
+                       "Alexey zakharenkov"
                ]
        },
        "tog-underline": "Подчёркивание ссылок:",
        "tog-watchlisthidebots": "Скрывать правки ботов из списка наблюдения",
        "tog-watchlisthideminor": "Скрывать малые правки из списка наблюдения",
        "tog-watchlisthideliu": "Скрывать правки представившихся участников из списка наблюдения",
-       "tog-watchlistreloadautomatically": "Ð\9fеÑ\80езагÑ\80Ñ\83жать список наблюдения автоматически всякий раз, когда изменяется фильтр (требуется JavaScript)",
+       "tog-watchlistreloadautomatically": "Ð\9eбновлÑ\8fть список наблюдения автоматически всякий раз, когда изменяется фильтр (требуется JavaScript)",
        "tog-watchlisthideanons": "Скрывать правки анонимных участников из списка наблюдения",
        "tog-watchlisthidepatrolled": "Скрывать отпатрулированные правки из списка наблюдения",
        "tog-watchlisthidecategorization": "Скрывать категоризацию страниц",
        "tog-showhiddencats": "Показывать скрытые категории",
        "tog-norollbackdiff": "Не показывать разницу версий после выполнения отката",
        "tog-useeditwarning": "Предупреждать, когда я покидаю страницу с несохранёнными изменениями",
-       "tog-prefershttps": "Всегда использовать защищённое соединение после представления системе",
+       "tog-prefershttps": "Всегда использовать защищённое соединение",
        "underline-always": "Всегда",
        "underline-never": "Никогда",
        "underline-default": "Использовать настройки браузера",
        "category-article-count": "{{PLURAL:$2|1=Эта категория содержит единственную страницу.|{{PLURAL:$1|Показана $1 страница|Показаны $1 страницы|Показано $1 страниц}} из $2, {{PLURAL:$2|находящейся|находящихся}} в данной категории.}}",
        "category-article-count-limited": "В этой категории {{PLURAL:$1|$1 страница|$1 страницы|$1 страниц|1=только одна страница}}.",
        "category-file-count": "{{PLURAL:$2|1=Эта категория содержит единственный файл.|{{PLURAL:$1|Показан $1 файл|Показано $1 файла|Показаны $1 файлов}} из $2, {{PLURAL:$2|находящегося|находящихся}} в данной категории.}}",
-       "category-file-count-limited": "В этой категории {{PLURAL:$1|$1 файл|$1 файла|$1 файлов|1=только один файл}}.",
+       "category-file-count-limited": "В этой категории {{PLURAL:$1|1=1 файл|$1 файла|$1 файлов}}.",
        "listingcontinuesabbrev": "(продолжение)",
        "index-category": "Индексируемые страницы",
        "noindex-category": "Неиндексируемые страницы",
        "tagline": "Материал из {{grammar:genitive|{{SITENAME}}}}",
        "help": "Справка",
        "search": "Поиск",
-       "search-ignored-headings": " #<!-- оставьте эту строку как есть --> <pre>\n# Заголовки, которые будут игнорироваться поиском.\n# Изменения вступают в силу, как только страница с заголовком индексируется.\n# Вы можете принудить переиндексировать страницу с помощью нулевой правки.\n# Синтаксис выглядит следующим образом:\n#   * Всё, начинающееся на символ «#» и до конца строки представляет собой комментарий.\n#   * Каждая непустая строка — точное название того, что будет игнорироваться, включая регистр и пр.\nПримечания\nСсылки\nСм. также\n #</pre> <!-- оставьте эту строку как есть -->",
+       "search-ignored-headings": " #<!-- оставьте эту строку как есть --> <pre>\n# Заголовки, которые будут игнорироваться поиском.\n# Изменения вступают в силу после того, как страница с заголовком индексируется.\n# Вы можете принудительно переиндексировать страницу, сделав нулевую правку.\n# Синтаксис выглядит следующим образом:\n#   * Всё, начинающееся на символ «#» и до конца строки представляет собой комментарий.\n#   * Каждая непустая строка — точное название того, что будет игнорироваться, включая регистр и пр.\nПримечания\nСсылки\nСм. также\n #</pre> <!-- оставьте эту строку как есть -->",
        "searchbutton": "Найти",
        "go": "Перейти",
        "searcharticle": "Перейти",
        "delete": "Удалить",
        "deletethispage": "Удалить эту страницу",
        "undeletethispage": "Восстановить эту страницу",
-       "undelete_short": "Восстановить {{PLURAL:$1|$1 правку|$1 правки|$1 правок|1=правку}}",
-       "viewdeleted_short": "Просмотр {{PLURAL:$1|$1 удалённой правки|удалённой правки|$1 удалённых правок}}",
+       "undelete_short": "Восстановить {{PLURAL:$1|1=$1 правку|$1 правки|$1 правок|1=правку}}",
+       "viewdeleted_short": "Просмотр {{PLURAL:$1|1=$1 удалённой правки|удалённой правки|$1 удалённых правок}}",
        "protect": "Защитить",
        "protect_change": "изменить",
        "protectthispage": "Защитить эту страницу",
        "redirectpagesub": "Страница-перенаправление",
        "redirectto": "Перенаправление на:",
        "lastmodifiedat": "Последнее изменение этой страницы: $2, $1.",
-       "viewcount": "К этой странице обращались $1 {{PLURAL:$1|раз|раза|раз}}.",
+       "viewcount": "К этой странице обращались $1 {{PLURAL:$1|1=раз|раза|раз}}.",
        "protectedpage": "Защищённая страница",
        "jumpto": "Перейти к:",
        "jumptonavigation": "навигация",
        "jumptosearch": "поиск",
-       "view-pool-error": "Извините, сейчас серверы перегружены.\nПоступило слишком много запросов на просмотр этой страницы.\nПожалуйста, подождите и повторите попытку обращения к странице позже.\n\n$1",
+       "view-pool-error": "Извините, в настоящий момент серверы перегружены.\nСлишком много пользователей пытаются просмотреть этот ресурс.\nПожалуйста, подождите и повторите попытку обращения к нему позже.\n\n$1",
        "generic-pool-error": "Извините, в настоящий момент серверы перегружены.\nСлишком много пользователей пытаются просмотреть этот ресурс.\nПожалуйста, подождите и повторите попытку обращения к нему позже.",
        "pool-timeout": "Истекло время ожидания блокировки",
        "pool-queuefull": "Накопитель запросов полон",
        "pagetitle": "$1 — {{SITENAME}}",
        "retrievedfrom": "Источник — «$1»",
        "youhavenewmessages": "Вы получили $1 ($2).",
-       "youhavenewmessagesfromusers": "{{PLURAL:$4|Вы получили}} $1 от {{PLURAL:$3|$3 участника|$3 участников|1=другого участника}} ($2).",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|Вы получили}} $1 от {{PLURAL:$3|1=$3 участника|$3 участников|1=другого участника}} ($2).",
        "youhavenewmessagesmanyusers": "Вы получили $1 от множества пользователей ($2).",
-       "newmessageslinkplural": "{{PLURAL:$1|новое сообщение|999=новые сообщения}}",
-       "newmessagesdifflinkplural": "{{PLURAL:$1|последнее изменение|999=последние изменения}}",
+       "newmessageslinkplural": "{{PLURAL:$1|1=новое сообщение|999=новые сообщения}}",
+       "newmessagesdifflinkplural": "{{PLURAL:$1|1=последнее изменение|999=последние изменения}}",
        "youhavenewmessagesmulti": "Вы получили новые сообщения на $1",
        "editsection": "править",
        "editold": "править",
        "confirmable-no": "Нет",
        "thisisdeleted": "Просмотреть или восстановить $1?",
        "viewdeleted": "Просмотреть $1?",
-       "restorelink": "{{PLURAL:$1|$1 удалённую правку|$1 удалённые правки|$1 удалённых правок|1=удалённую правку}}",
+       "restorelink": "{{PLURAL:$1|1=$1 удалённую правку|$1 удалённые правки|$1 удалённых правок|1=удалённую правку}}",
        "feedlinks": "В виде:",
        "feed-invalid": "Неправильный тип канала для подписки.",
        "feed-unavailable": "Ленты синдикации недоступны",
        "title-invalid-characters": "Запрашиваемое название страницы содержит недопустимые символы: «$1».",
        "title-invalid-relative": "Заголовок имеет относительный путь. Заголовки страниц с относительным путем (/,../) являются недействительными, так как они часто недоступны, когда обрабатываются браузером пользователя.",
        "title-invalid-magic-tilde": "Запрашиваемый заголовок страницы содержит недопустимую последовательность тильды (<nowiki>~~~</nowiki>).",
-       "title-invalid-too-long": "Запрашиваемый заголовок страницы слишком длинен. Он должен быть не более $1 {{PLURAL:$1|байта|байт}} в кодировке UTF-8.",
+       "title-invalid-too-long": "Запрашиваемый заголовок страницы слишком длинен. Он должен быть не более $1 {{PLURAL:$1|1=байта|байт}} в кодировке UTF-8.",
        "title-invalid-leading-colon": "Запрашиваемое название страницы содержит недопустимое двоеточие в начале.",
-       "perfcached": "СледÑ\83Ñ\8eÑ\89ие Ð´Ð°Ð½Ð½Ñ\8bе Ð²Ð·Ñ\8fÑ\82Ñ\8b Ð¸Ð· ÐºÑ\8dÑ\88а Ð¸ Ð¼Ð¾Ð³Ñ\83Ñ\82 Ð½Ðµ Ñ\83Ñ\87иÑ\82Ñ\8bваÑ\82Ñ\8c Ð¿Ð¾Ñ\81ледниÑ\85 Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹. Ð\92 ÐºÑ\8dÑ\88е Ñ\85Ñ\80аниÑ\82Ñ\81Ñ\8f Ð½Ðµ Ð±Ð¾Ð»ÐµÐµ $1 {{PLURAL:$1|записи|записей}}.",
-       "perfcachedts": "Следующие данные взяты из кэша, последний раз он обновлялся в $1. В кэше хранится не более $4 {{PLURAL:$4|записи|записей}}.",
+       "perfcached": "Ð\94аннÑ\8bе Ð²Ð·Ñ\8fÑ\82Ñ\8b ÐºÑ\8dÑ\88а; Ð¾Ð½Ð¸ Ð¼Ð¾Ð³Ð»Ð¸ Ñ\83Ñ\81Ñ\82аÑ\80еÑ\82Ñ\8c. Ð\92 ÐºÑ\8dÑ\88е Ñ\85Ñ\80аниÑ\82Ñ\81Ñ\8f Ð½Ðµ Ð±Ð¾Ð»ÐµÐµ $1 {{PLURAL:$1|1=записи|записей}}.",
+       "perfcachedts": "Следующие данные взяты из кэша, последний раз он обновлялся в $1. В кэше хранится не более {{PLURAL:$4|1=$1 записи|$1 записей}}.",
        "querypage-no-updates": "Обновление этой страницы сейчас отключено.\nПредставленные здесь данные не будут обновляться.",
        "viewsource": "Просмотр вики-текста",
        "viewsource-title": "Просмотр исходного текста страницы $1",
        "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|участник|участника|участников}} за последнее время",
+       "createacct-benefit-body1": "{{PLURAL:$1|1=$1 правка|$1 правки|$1 правок}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|1=$1 статья|$1 статьи|$1 статей}}",
+       "createacct-benefit-body3": "{{PLURAL:$1|1=$1 участник|$1 участника|$1 участников}} за последнее время",
        "badretype": "Введённые вами пароли не совпадают.",
        "usernameinprogress": "Создание учётной записи для данного имени участника уже выполняется.\nПожалуйста, подождите.",
        "userexists": "Введённое имя участника уже используется.\nПожалуйста, выберите другое имя.",
        "login-userblocked": "Участник заблокирован. Вход в систему запрещен.",
        "wrongpassword": "Введённый вами пароль неверен. Попробуйте ещё раз.",
        "wrongpasswordempty": "Пожалуйста, введите непустой пароль.",
-       "passwordtooshort": "Пароль должен состоять не менее чем из $1 {{PLURAL:$1|символа|символов}}.",
-       "passwordtoolong": "Пароль не может превышать {{PLURAL:$1|1 символ|$1 символов|$1 символа}}.",
+       "passwordtooshort": "Пароль должен состоять не менее, чем из $1 {{PLURAL:$1|1=символа|символов}}.",
+       "passwordtoolong": "Пароль не может содержать более {{PLURAL:$1|1=$1 символа|$1 символов}}.",
        "passwordtoopopular": "Часто выбираемые пароли не могут быть использованы. Пожалуйста, выберите более уникальный пароль.",
        "password-name-match": "Введённый пароль должен отличаться от имени участника.",
        "password-login-forbidden": "Использование этого имени участника и пароля запрещено.",
        "mailmypassword": "Сбросить пароль",
        "passwordremindertitle": "Напоминание пароля участника {{grammar:genitive|{{SITENAME}}}}",
-       "passwordremindertext": "Кто-то (вероятно, вы, с IP-адреса $1) запросил создать\nновый пароль для {{grammar:genitive|{{SITENAME}}}} ($4). Для участника $2\nсоздан временный пароль: $3. Если это был ваш запрос,\nвам следует представиться системе и выбрать новый пароль.\nВаш временный пароль будет действовать в течение $5 {{PLURAL:$5|дня|дней}}.\n\nЕсли вы не посылали запроса на смену пароля, или если вы уже вспомнили свой пароль,\nи не желаете его менять, вы можете проигнорировать данное сообщение и\nпродолжить использовать свой старый пароль.",
+       "passwordremindertext": "Кто-то (вероятно, вы, с IP-адреса $1) запросил создать\nновый пароль для {{grammar:genitive|{{SITENAME}}}} ($4). Для участника $2\nсоздан временный пароль: $3. Если это был ваш запрос,\nвам следует представиться системе и выбрать новый пароль.\nВаш временный пароль будет действовать в течение $5 {{PLURAL:$5|1=дня|дней}}.\n\nЕсли вы не посылали запроса на смену пароля, или если вы уже вспомнили свой пароль,\nи не желаете его менять, вы можете проигнорировать данное сообщение и\nпродолжить использовать свой старый пароль.",
        "noemail": "Для участника с именем $1 электронный адрес указан не был.",
        "noemailcreate": "Вам необходимо указать корректный адрес электронной почты",
        "passwordsent": "Новый пароль был выслан на адрес электронной почты, указанный для участника $1.\n\nПожалуйста, представьтесь системе заново после получения пароля.",
        "blocked-mailpassword": "Редактирование с вашего IP-адреса запрещено. Для предотвращения злоупотреблений для этого IP-адреса заблокирована и функция восстановления пароля.",
        "eauthentsent": "На указанный адрес электронной почты отправлено письмо. \nЧтобы получать письма в дальнейшем, следуйте изложенным там инструкциям для подтверждения, что этот адрес действительно принадлежит вам.",
-       "throttled-mailpassword": "Функция напоминания пароля уже использовалась в течение {{PLURAL:$1|1=последнего часа|последних $1 часов}}.\nДля предотвращения злоупотреблений, разрешено запрашивать не более одного напоминания {{PLURAL:$1|за $1 час|за $1 часов|за $1 часа|1=в час}}.",
+       "throttled-mailpassword": "Функция напоминания пароля уже использовалась в течение {{PLURAL:$1|1=последнего часа|последних $1 часов}}.\nДля предотвращения злоупотреблений, разрешено запрашивать не более одного напоминания {{PLURAL:$1|1=за $1 час|за $1 часов|за $1 часа|1=в час}}.",
        "mailerror": "Ошибка при отправке почты: $1",
        "acct_creation_throttle_hit": "Посетители с вашего IP-адреса {{PLURAL:$1|была создана $1 учётная запись|было создано $1 учётных записей|были созданы $1 учётных записи}} за последние $2 — это предельное количество для данного отрезка времени.\nВ результате, пользователи с этим IP-адресом в данный момент больше не могут создавать новых учётных записей.",
        "emailauthenticated": "Ваш адрес электронной почты подтверждён $2 в $3.",
        "post-expand-template-argument-warning": "'''Внимание:''' эта страница содержит по крайней мере один шаблон, аргумент которого имеет слишком большой размер развёртывания.\nПодобные аргументы были опущены.",
        "post-expand-template-argument-category": "Страницы, содержащие пропущенные аргументы шаблонов",
        "parser-template-loop-warning": "Обнаружена петля в шаблонах: [[$1]]",
+       "template-loop-category": "Страницы с петлями в шаблонах",
        "parser-template-recursion-depth-warning": "Превышен предел глубины рекурсии шаблона ($1)",
        "language-converter-depth-warning": "Превышен предел глубины преобразователя языков ($1)",
        "node-count-exceeded-category": "Страницы, на которых превышено число узлов",
        "page_first": "первая",
        "page_last": "последняя",
        "histlegend": "Выбор версий: отметьте версии страницы, которые вы хотите сравнить, и нажмите '''{{int:compare-submit}}'''.<br />\nПояснения: '''({{int:cur}})''' — отличия от текущей версии; '''({{int:last}})''' — отличия от предшествующей версии; '''{{int:minoreditletter}}''' — незначительные изменения.",
-       "history-fieldset-title": "Просмотреть историю",
-       "history-show-deleted": "Только удалённые",
+       "history-fieldset-title": "Поиск правок",
+       "history-show-deleted": "Только удалённые правки",
        "histfirst": "старейшие",
        "histlast": "новейшие",
        "historysize": "($1 {{PLURAL:$1|байт|байта|байт}})",
        "prefs-help-prefershttps": "Эта настройка будет применена после следующего представления системе.",
        "prefswarning-warning": "Вы внесли в свои настройки изменения, которые ещё не были сохранены.\nЕсли вы покинете эту страницу, не нажав «$1», настройки не будут обновлены.",
        "prefs-tabs-navigation-hint": "Совет: Вы можете использовать клавиши стрелок влево и вправо для перехода между вкладками в списке вкладок.",
-       "userrights": "Права пользователя",
+       "userrights": "Права участника",
        "userrights-lookup-user": "Выбор участника",
        "userrights-user-editname": "Введите имя учётной записи:",
        "editusergroup": "Загрузить группы участников",
        "saveusergroups": "Сохранить группы {{GENDER:$1|участника|участницы}}",
        "userrights-groupsmember": "Состоит в группах:",
        "userrights-groupsmember-auto": "Неявно состоит в группах:",
-       "userrights-groups-help": "Вы можете изменить группы, в которые входит {{GENDER:$1|этот участник|эта участница}}.\n* Если около названия группы стоит отметка — {{GENDER:$1|участник|участница}} входит в эту группу.\n* Если отметка не стоит — {{GENDER:$1|участник|участница}} не входит в эту группу.\n* Символ * указывает на то, что вы не сможете удалить {{GENDER:$1|участника|участницу}} из группы, если добавите {{GENDER:$1|его|её}} в неё (или наоборот).\n* Символ # указывает на то, что вы можете только отложить время истечения этой группы, вы не можете перенести его на более ранний срок.",
+       "userrights-groups-help": "Ð\92Ñ\8b Ð¼Ð¾Ð¶ÐµÑ\82е Ð¸Ð·Ð¼ÐµÐ½Ð¸Ñ\82Ñ\8c Ð³Ñ\80Ñ\83ппÑ\8b, Ð² ÐºÐ¾Ñ\82оÑ\80Ñ\8bе Ð²Ñ\85одиÑ\82 {{GENDER:$1|Ñ\8dÑ\82оÑ\82 Ñ\83Ñ\87аÑ\81Ñ\82ник|Ñ\8dÑ\82а Ñ\83Ñ\87аÑ\81Ñ\82ниÑ\86а}}.\n* Ð\95Ñ\81ли Ð¾ÐºÐ¾Ð»Ð¾ Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ñ\8f Ð³Ñ\80Ñ\83ппÑ\8b Ñ\81Ñ\82оиÑ\82 Ð¾Ñ\82меÑ\82ка â\80\94 {{GENDER:$1|Ñ\83Ñ\87аÑ\81Ñ\82ник|Ñ\83Ñ\87аÑ\81Ñ\82ниÑ\86а}} Ð²Ñ\85одиÑ\82 Ð² Ñ\8dÑ\82Ñ\83 Ð³Ñ\80Ñ\83ппÑ\83.\n* Ð\95Ñ\81ли Ð¾Ñ\82меÑ\82ка Ð½Ðµ Ñ\81Ñ\82оиÑ\82 â\80\94 {{GENDER:$1|Ñ\83Ñ\87аÑ\81Ñ\82ник|Ñ\83Ñ\87аÑ\81Ñ\82ниÑ\86а}} Ð½Ðµ Ð²Ñ\85одиÑ\82 Ð² Ñ\8dÑ\82Ñ\83 Ð³Ñ\80Ñ\83ппÑ\83.\n* Ð¡Ð¸Ð¼Ð²Ð¾Ð» * Ñ\83казÑ\8bваеÑ\82 Ð½Ð° Ñ\82о, Ñ\87Ñ\82о Ð²Ñ\8b Ð½Ðµ Ñ\81можеÑ\82е Ñ\83далиÑ\82Ñ\8c {{GENDER:$1|Ñ\83Ñ\87аÑ\81Ñ\82ника|Ñ\83Ñ\87аÑ\81Ñ\82ниÑ\86Ñ\83}} Ð¸Ð· Ð³Ñ\80Ñ\83ппÑ\8b, ÐµÑ\81ли Ð´Ð¾Ð±Ð°Ð²Ð¸Ñ\82е {{GENDER:$1|его|еÑ\91}} Ð² Ð½ÐµÑ\91 (или Ð½Ð°Ð¾Ð±Ð¾Ñ\80оÑ\82).\n* Ð¡Ð¸Ð¼Ð²Ð¾Ð» # Ñ\83казÑ\8bваеÑ\82 Ð½Ð° Ñ\82о, Ñ\87Ñ\82о Ð²Ñ\8b Ð¼Ð¾Ð¶ÐµÑ\82е Ñ\82олÑ\8cко Ð¾Ñ\82ложиÑ\82Ñ\8c Ð²Ñ\80емÑ\8f Ð¸Ñ\81Ñ\82еÑ\87ениÑ\8f Ñ\87ленÑ\81Ñ\82ва Ð² Ñ\8dÑ\82ой Ð³Ñ\80Ñ\83ппÑ\8b, Ð²Ñ\8b Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ\82е Ð¿ÐµÑ\80енеÑ\81Ñ\82и ÐµÐ³Ð¾ Ð½Ð° Ð±Ð¾Ð»ÐµÐµ Ñ\80анний Ñ\81Ñ\80ок.",
        "userrights-reason": "Причина:",
        "userrights-no-interwiki": "У вас нет разрешения изменять права участников в других вики.",
        "userrights-nodatabase": "База данных $1 не существует или расположена не локально.",
        "userrights-expiry-options": "1 день:1 day,1 неделя:1 week,1 месяц:1 mopnth,3 месяца:3 months,6 месяцев:6 months,1 год:1 year",
        "userrights-invalid-expiry": "Время истечения для группы «$1» задано неверно.",
        "userrights-expiry-in-past": "Время истечения для группы «$1» задано в прошлом.",
-       "userrights-cannot-shorten-expiry": "Вы не можете перенести на более ранний срок дату истечения группы «$1». Только участники, имеющие право на добавление и удаление этой группы, могут перенести её на более ранний срок.",
+       "userrights-cannot-shorten-expiry": "Вы не можете перенести на более ранний срок дату истечения членства в группе «$1». Только участники, имеющие право на добавление и удаление этой группы, могут перенести её на более ранний срок.",
        "userrights-conflict": "Конфликт изменения прав участника! Пожалуйста, проверьте и примените изменения заново.",
        "group": "Группа:",
        "group-user": "Участники",
        "recentchanges-legend": "Настройки свежих правок",
        "recentchanges-summary": "Ниже в хронологическом порядке перечислены последние изменения на страницах {{grammar:genitive|{{SITENAME}}}}.",
        "recentchanges-noresult": "Изменений в указанный период, соответствующих указанным условиям, нет.",
-       "recentchanges-feed-description": "Отслеживать в этом потоке последние изменения в вики.",
+       "recentchanges-feed-description": "Отслеживание последних изменений в вики.",
        "recentchanges-label-newpage": "Этой правкой была создана новая страница.",
        "recentchanges-label-minor": "Это незначительное изменение",
        "recentchanges-label-bot": "Эта правка сделана ботом",
        "rcfilters-invalid-filter": "Недопустимый фильтр",
        "rcfilters-empty-filter": "Нет активных фильтров. Показываются все правки.",
        "rcfilters-filterlist-title": "Фильтры",
+       "rcfilters-filterlist-whatsthis": "Что это?",
        "rcfilters-filterlist-feedbacklink": "Оставить отзыв о новых (бета) фильтрах",
        "rcfilters-highlightbutton-title": "Выделить результаты",
        "rcfilters-highlightmenu-title": "Выберите цвет",
        "php-uploaddisabledtext": "Загрузка файлов отключена в настройках PHP. Пожалуйста, проверьте значение свойства file_uploads.",
        "uploadscripted": "Файл содержит HTML-код или скрипт, который может быть ошибочно обработан браузером.",
        "upload-scripted-pi-callback": "Невозможно загрузить файл, содержащий инструкции обработки таблицы стилей XML.",
+       "upload-scripted-dtd": "Невозможно загрузить SVG-файлы, которые содержат нестандартное DTD-объявление.",
        "uploaded-script-svg": "Найден небезопасный элемент с поддержкой сценариев «$1» в загруженном SVG-файле.",
        "uploaded-hostile-svg": "Найден небезопасный CSS-код в элементе стиля загруженного SVG-файла.",
        "uploaded-event-handler-on-svg": "Установка атрибутов обработчика событий <code>$1=\"$2\"</code> не разрешено для SVG-файлов.",
        "shared-repo-from": "из $1",
        "shared-repo": "общего хранилища",
        "shared-repo-name-wikimediacommons": "Викисклада",
-       "filepage.css": "/* CSS и помещены сюда входит на странице описания файла, также на зарубежного заказчика Вики */",
+       "filepage.css": "/* Размещённые здесь CSS будут применены на странице описания файла и на сторонних клиентских вики */",
        "upload-disallowed-here": "Вы не можете перезаписать этот файл.",
        "filerevert": "Возврат к старой версии $1",
        "filerevert-legend": "Возвратить версию файла",
        "listgrants-grant": "Разрешение",
        "listgrants-rights": "Права",
        "trackingcategories": "Отслеживающие категории",
-       "trackingcategories-summary": "Ð\9dа Ñ\8dÑ\82ой Ñ\81Ñ\82Ñ\80аниÑ\86е Ð¿ÐµÑ\80еÑ\87иÑ\81ленÑ\8b Ð¾Ñ\82Ñ\81леживаÑ\8eÑ\89ие ÐºÐ°Ñ\82егоÑ\80ии, ÐºÐ¾Ñ\82оÑ\80Ñ\8bе Ð°Ð²Ñ\82омаÑ\82иÑ\87еÑ\81ки Ð·Ð°Ð¿Ð¾Ð»Ð½Ñ\8fÑ\8eÑ\82Ñ\81Ñ\8f Ð¿Ñ\80огÑ\80аммнÑ\8bм Ð¾Ð±ÐµÑ\81пеÑ\87ением MediaWiki. Их можно переименовать, изменив соответствующие системные сообщения в пространстве имён {{ns:8}}.",
-       "trackingcategories-msg": "Отслеживающая категория",
+       "trackingcategories-summary": "Ð\9dа Ñ\8dÑ\82ой Ñ\81Ñ\82Ñ\80аниÑ\86е Ð¿ÐµÑ\80еÑ\87иÑ\81ленÑ\8b ÐºÐ°Ñ\82егоÑ\80ии, Ð·Ð°Ð¿Ð¾Ð»Ð½Ñ\8fемÑ\8bе Ð°Ð²Ñ\82омаÑ\82иÑ\87еÑ\81ки. Их можно переименовать, изменив соответствующие системные сообщения в пространстве имён {{ns:8}}.",
+       "trackingcategories-msg": "Отслеживаемая категория",
        "trackingcategories-name": "Имя сообщения",
        "trackingcategories-desc": "Критерий включения в категорию",
        "restricted-displaytitle-ignored": "Страницы с игнорируемыми отображаемыми названиями",
        "movedarticleprotection": "перенёс настройки защиты с «[[$2]]» на «[[$1]]»",
        "protectedarticle-comment": "Защитил{{GENDER:$2||а}} «[[$1]]»",
        "modifiedarticleprotection-comment": "Изменил{{GENDER:$2||а}} уровень защиты «[[$1]]»",
-       "unprotectedarticle-comment": "Убрал {{GENDER:$2||а}} защиту с «[[$1]]»",
+       "unprotectedarticle-comment": "Cнял{{GENDER:$2||а}} защиту с «[[$1]]»",
        "protect-title": "Установка уровня защиты для «$1»",
        "protect-title-notallowed": "Просмотр уровня защиты «$1»",
        "prot_1movedto2": "[[$1]] переименована в [[$2]]",
        "undeleteviewlink": "просмотреть",
        "undeleteinvert": "Обратить выделение",
        "undeletecomment": "Причина:",
-       "undeletedrevisions": "{{PLURAL:$1|восстановлено|восстановлены}} $1 {{PLURAL:$1|изменение|изменения|изменений}}",
-       "undeletedrevisions-files": "восстановлены $1 {{PLURAL:$1|версия|версии|версий}} и $2 {{PLURAL:$2|файл|файла|файлов}}",
-       "undeletedfiles": "{{PLURAL:$1|восстановлен|восстановлены}} $1 {{PLURAL:$1|файл|файла|файлов}}",
        "cannotundelete": "Некоторые или все ваши восстановления не удались:\n$1",
        "undeletedpage": "'''Страница «$1» была восстановлена.'''\n\nДля просмотра списка последних удалений и восстановлений см. [[Special:Log/delete|журнал удалений]].",
        "undelete-header": "Список недавно удалённых страниц можно посмотреть в [[Special:Log/delete|журнале удалений]].",
        "print.css": "/* Размещённый здесь CSS будет применяться к версии для печати */",
        "noscript.css": "/* Размещённый здесь CSS будет применяться для участников с отключенным JavaScript  */",
        "group-autoconfirmed.css": "/* Размещённый здесь CSS будет применяться для автоподтверждённых участников */",
-       "group-user.css": "/* CSS для размещен здесь затронут только для зарегистрированных пользователей */",
+       "group-user.css": "/* Размещённый здесь CSS будет применяться только для зарегистрированных пользователей */",
        "group-bot.css": "/* Размещённый здесь CSS будет применяться только для ботов */",
        "group-sysop.css": "/* Размещённый здесь CSS будет применяться только для администраторов */",
        "group-bureaucrat.css": "/* Размещённый здесь CSS будет применяться только для бюрократов */",
        "common.js": "/* Размещённый здесь код JavaScript будет загружаться пользователям при обращении к каждой странице */",
        "group-autoconfirmed.js": "/* Размещённый здесь код JavaScript будет загружаться только участникам, имеющим статус автоподтверждённых (autoconfirmed) */",
-       "group-user.js": "/* Ð\97деÑ\81Ñ\8c Ð»Ñ\8eбой JavaScript Ð±Ñ\83деÑ\82 Ð·Ð°Ð³Ñ\80Ñ\83жаться только для зарегистрированных пользователей */",
+       "group-user.js": "/* Ð Ð°Ð·Ð¼ÐµÑ\89Ñ\91ннÑ\8bй Ð·Ð´ÐµÑ\81Ñ\8c JavaScript Ð±Ñ\83деÑ\82 Ð¿Ñ\80именÑ\8fться только для зарегистрированных пользователей */",
        "group-bot.js": "/* Размещённый здесь код JavaScript будет загружаться только участникам, имеющим статус ботов (bots) */",
        "group-sysop.js": "/* Размещённый здесь код JavaScript будет загружаться только участникам, имеющим статус администраторов (sysops) */",
        "group-bureaucrat.js": "/* Размещённый здесь код JavaScript будет загружаться только участникам, имеющим статус бюрократов (bureaucrats) */",
        "newimages-summary": "На этой служебной странице показаны недавно загруженные файлы.",
        "newimages-legend": "Фильтр",
        "newimages-label": "Имя файла (или его часть):",
+       "newimages-user": "IP-адрес или имя участника",
        "newimages-showbots": "Показать загрузки ботов",
        "newimages-hidepatrolled": "Скрыть отпатрулированные загрузки",
        "noimages": "Изображения отсутствуют.",
        "sunday-at": "в воскресенье в $1",
        "yesterday-at": "Вчера в $1",
        "bad_image_list": "Формат должен быть следующим:\n\nБудут учитываться только элементы списка (строки, начинающиеся на символ *).\nПервая ссылка строки должна быть ссылкой на запрещённое для вставки изображение.\nПоследующие ссылки в той же строке будут рассматриваться как исключения, то есть статьи, куда изображение может быть включено.",
-       "variantname-zh-hans": "его",
+       "variantname-zh-hans": "hans",
        "metadata": "Метаданные",
        "metadata-help": "Файл содержит дополнительные данные, обычно добавляемые цифровыми камерами или сканерами. Если файл после создания редактировался, то некоторые параметры могут не соответствовать текущему изображению.",
        "metadata-expand": "Показать дополнительные данные",
        "exif-copyrighted-false": "Авторско-правовой статус не задан",
        "exif-photometricinterpretation-1": "Чёрный и белый (чёрный — 0)",
        "exif-photometricinterpretation-4": "Маска прозрачности",
-       "exif-photometricinterpretation-5": "РазделенÑ\8b (видимо Ð² CMYK)",
+       "exif-photometricinterpretation-5": "РазделенÑ\8b (веÑ\80оÑ\8fÑ\82но CMYK)",
        "exif-unknowndate": "Неизвестная дата",
        "exif-orientation-1": "Нормальная",
        "exif-orientation-2": "Отражено по горизонтали",
        "confirmemail_body_set": "Кто-то (возможно вы) с IP-адресом $1\nуказал данный адрес электронной почты для учётной записи «$2» в проекте «{{SITENAME}}».\n\nЧтобы подтвердить, что эта учётная запись действительно принадлежит вам,\nи включить возможность отправки писем с сайта «{{SITENAME}}», откройте в браузере приведённую ниже ссылку:\n\n$3\n\nЕсли данная учётная запись *не* относится к вам, то перейдите по следующей ссылке,\nчтобы отменить подтверждение адреса электронной почты:\n\n$5\n\nКод подтверждения действителен до $4.",
        "confirmemail_invalidated": "Подтверждение адреса электронной почты отменено.",
        "invalidateemail": "Отмена подтверждения адреса электронной почты",
-       "notificationemail_subject_changed": "{{SITENAME}} зарегистрированный адрес электронной почты был изменен",
+       "notificationemail_subject_changed": "Адрес электронной почты для {{SITENAME}} был изменён",
        "notificationemail_subject_removed": "{{SITENAME}} зарегистрированный адрес электронной почты был удален",
        "notificationemail_body_changed": "Кто-то, вероятно, вы, с IP-адреса $1,\nизменил адрес электронной почты учетной записи \"$2\" на \"$3\" на {{SITENAME}}.\n\nЕсли это были не вы, обратитесь к администратору сайта немедленно.",
        "notificationemail_body_removed": "Кто-то, вероятно вы, с IP-адреса $1,\nудалил адрес электронной почты учетной записи \"$2\" на {{SITENAME}}.\n\nЕсли это были не вы, обратитесь к администратору сайта немедленно.",
        "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-restore": "$1 {{GENDER:$2|восстановил|восстановила}} страницу $3 ($4)",
+       "logentry-delete-restore-nocount": "$1 {{GENDER:$2|восстановил|восстановила}} страницу $3",
+       "restore-count-revisions": "{{PLURAL:$1|1 версия|$1 версии|$1 версий}}",
+       "restore-count-files": "{{PLURAL:$1|1 файл|$1 файла|$1 файлов}}",
        "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",
        "logentry-delete-event-legacy": "$1 {{GENDER:$2|изменил|изменила}} видимость записей журнала $3",
        "special-characters-group-thai": "Тайские",
        "special-characters-group-lao": "Лаосские",
        "special-characters-group-khmer": "Кхмерские",
+       "special-characters-group-canadianaboriginal": "Канадское слоговое письмо",
        "special-characters-title-endash": "среднее тире",
        "special-characters-title-emdash": "длинное тире",
        "special-characters-title-minus": "знак минус",
        "log-action-filter-contentmodel": "Тип изменения модели содержимого:",
        "log-action-filter-delete": "Тип удаления:",
        "log-action-filter-import": "Тип импорта:",
-       "log-action-filter-managetags": "Тип Ñ\82ега Ñ\83пÑ\80авленÑ\87еÑ\81киÑ\85 Ð´ÐµÐ¹Ñ\81Ñ\82вий:",
+       "log-action-filter-managetags": "Ð\94ейÑ\81Ñ\82вие Ð¿Ð¾ Ñ\83пÑ\80авлениÑ\8e Ñ\82егами:",
        "log-action-filter-move": "Тип переименования:",
        "log-action-filter-newusers": "Тип создания учётной записи:",
        "log-action-filter-patrol": "Тип патрулирования:",
        "log-action-filter-managetags-delete": "Удаление тегов",
        "log-action-filter-managetags-activate": "Активация тегов",
        "log-action-filter-managetags-deactivate": "Отключение тега",
-       "log-action-filter-move-move": "Ð\94вигаÑ\82Ñ\8cÑ\81Ñ\8f Ð±ÐµÐ· Ð¿ÐµÑ\80езапиÑ\81и Ð¿ÐµÑ\80еадÑ\80еÑ\81аÑ\86ий",
-       "log-action-filter-move-move_redir": "Ð\9fеÑ\80емеÑ\81Ñ\82иÑ\82Ñ\8c Ñ\81 Ð·Ð°Ð¼ÐµÐ½Ð¾Ð¹ Ð¿ÐµÑ\80еадÑ\80еÑ\81аÑ\86ий",
+       "log-action-filter-move-move": "Ð\9fеÑ\80еименованиÑ\8f Ð½Ðµ Ð² Ñ\81Ñ\83Ñ\89еÑ\81Ñ\82вÑ\83Ñ\8eÑ\89ее Ð¿ÐµÑ\80енапÑ\80авление",
+       "log-action-filter-move-move_redir": "Ð\9fеÑ\80еименованиÑ\8f Ð¿Ð¾Ð²ÐµÑ\80Ñ\85 Ð¿ÐµÑ\80енапÑ\80авлениÑ\8f",
        "log-action-filter-newusers-create": "Создание анонимным участником",
        "log-action-filter-newusers-create2": "Создание зарегистрированным участником",
        "log-action-filter-newusers-autocreate": "Автоматическое создание",
        "restrictionsfield-label": "Разрешённые диапазоны IP-адресов:",
        "restrictionsfield-help": "По одному IP-адресу или CIDR-диапазону в строке. Чтобы разрешить всё, используйте:<pre>0.0.0.0/0\n::/0</pre>",
        "revid": "версия $1",
-       "pageid": "ID страницы $1"
+       "pageid": "ID страницы $1",
+       "rawhtml-notallowed": "&lt;html&gt; теги могут быть использованы только в пределах обычных страниц.",
+       "gotointerwiki": "Покидаем {{grammar:genitive|{{SITENAME}}}}...",
+       "gotointerwiki-invalid": "Указан некорректный заголовок.",
+       "gotointerwiki-external": "Вы покидаете {{grammar:genitive|{{SITENAME}}}} для посещения сайта [[$2]].\n\n[$1 Нажмите здесь, чтобы перейти на $1].",
+       "undelete-cantedit": "Вы не можете восстановить эту страницу, поскольку у вас недостаточно прав для ее редактирования.",
+       "undelete-cantcreate": "Вы не можете восстановить эту страницу, поскольку она не существует, а у вас недостаточно прав для ее создания."
 }
index 2bdc449..a441aa4 100644 (file)
        "nstab-template": "Modellu",
        "nstab-help": "Agiudu",
        "nstab-category": "Categoria",
+       "mainpage-nstab": "Pàgina printzipale",
        "nosuchaction": "No esistit custa atzione",
        "nosuchactiontext": "S'atzione ispetzificada in sa URL no est vàlida.\nEst possìbile chi sa URL siat istada carcada male, o si siat sighidu unu ligòngiu non vàlidu.\nCustu diat pòdere èssere unu \"bug\" de {{SITENAME}}.",
        "nosuchspecialpage": "Custa pàgina ispetziale no esistit",
        "password-change-forbidden": "Non podes cambiare sa password in custa wiki.",
        "login": "Intra",
        "nav-login-createaccount": "Intra / crea contu",
-       "userlogin": "Intra / crea contu",
-       "userloginnocreate": "Intra",
        "logout": "Serra sessione",
        "userlogout": "Essida",
        "notloggedin": "Non ses intradu",
        "userlogin-noaccount": "Non tenes unu contu?",
        "userlogin-joinproject": "Registra⋅ti a {{SITENAME}}",
-       "nologin": "Non tenes unu contu? '''$1'''.",
-       "nologinlink": "Crea unu contu",
        "createaccount": "Crea contu",
-       "gotaccount": "Tenes giai unu contu? $1.",
-       "gotaccountlink": "Identìfica·ti",
-       "userlogin-resetlink": "As ismentigadu is datos pro s'atzessu?",
        "userlogin-resetpassword-link": "As ismentigadu sa password?",
        "userlogin-helplink2": "Agiudu pro s'atzessu",
        "userlogin-createanother": "Crea un àteru contu",
        "createacct-another-email-ph": "Inserta s'indiritzu post.el",
        "createaccountmail": "Imprea una password a sorte e ispedidda a su indiritzu post.el ispetzificadu",
        "createacct-realname": "Nùmene beru (optzionale)",
-       "createaccountreason": "Motivu:",
        "createacct-reason": "Motivu",
        "createacct-reason-ph": "Pro ite ses creende un àteru contu",
        "createacct-submit": "Crea su contu tuo",
        "passwordreset-emaildisabled": "Is funtzionalidades de email sunt istadas disabilitadas in custa wiki.",
        "passwordreset-username": "Nùmene impitadore:",
        "passwordreset-domain": "Domìniu:",
-       "passwordreset-capture": "Ammustrare su cuntenutu de sa email?",
        "passwordreset-email": "Indiritzu email:",
        "passwordreset-emailtitle": "Particulares de s'impitadore in {{SITENAME}}",
        "passwordreset-emailelement": "Nùmene utente: \n$1\n\nPassword temporànea: \n$2",
        "saveprefs": "Sarba",
        "restoreprefs": "Restàura totus is sèberos predefinidos (in totus is setziones)",
        "prefs-editing": "Casella de modìfica",
-       "rows": "Lìnias:",
-       "columns": "Colunnas:",
        "searchresultshead": "Chirca",
        "stub-threshold": "Valore mìnimu pro is <a href=\"#\" class=\"stub\">ligòngios a is abotzos</a>, in bytes:",
        "stub-threshold-disabled": "Disativadu",
        "boteditletter": "b",
        "rc_categories_any": "Calesisiat",
        "rc-change-size": "$1",
+       "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} a pustis de sa modìfica",
        "newsectionsummary": "/* $1 */ setzione noa",
        "rc-enhanced-expand": "Ammustra particulares",
        "rc-enhanced-hide": "Cua particulares",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|carrigadu}} una versione noa de $3",
        "logentry-upload-revert": "$1 {{GENDER:$2|carrigadu}} $3",
        "rightsnone": "(nisciunu)",
-       "revdelete-summary": "ogetu de sa modìfica",
        "feedback-cancel": "Annudda",
        "feedback-close": "Fatu",
        "feedback-message": "Messàgiu:",
index 0931c4a..33f7fd3 100644 (file)
@@ -31,6 +31,7 @@
        "tog-hideminor": "Skauk smaa eidits in recent chynges",
        "tog-hidepatrolled": "Skauk patrolled eidits in recent chynges",
        "tog-newpageshidepatrolled": "Skauk patrolled pages frae the new page leet",
+       "tog-hidecategorization": "Hide categorisation o pages",
        "tog-extendwatchlist": "Mak watchleet bigger tae shaw aw chynges, no just the maist recent",
        "tog-usenewrc": "Groop chynges bi page in recent chynges n watchleet",
        "tog-numberheadings": "Autæ-nummer heidins",
@@ -41,6 +42,7 @@
        "tog-watchdefault": "Eik pages n files that Ah eedit til ma watchleet",
        "tog-watchmoves": "Eik pages n files that Ah muiv til ma watchleet",
        "tog-watchdeletion": "Eik pages n files that Ah get rid o til ma watchleet",
+       "tog-watchuploads": "Add new files a uplaid tae ma watchleet",
        "tog-watchrollback": "Eik pages whaur Ah'v performed ae rowback tae ma watchleet",
        "tog-minordefault": "Mairk aa eedits \"smaa\" bi defaut",
        "tog-previewontop": "Shaw luikower afore eedit kist n naw efter it",
@@ -50,7 +52,7 @@
        "tog-enotifminoredits": "Send me ae wab-mail fer wee eedits o pages n files ava",
        "tog-enotifrevealaddr": "Shaw ma email address in notification mails",
        "tog-shownumberswatching": "Shaw the nummer o watchin uisers",
-       "tog-oldsig": "Exeestin signatur:",
+       "tog-oldsig": "Yer exeestin seegnatur:",
        "tog-fancysig": "Treat signature as wikitext (wioot aen autæmatic airtin)",
        "tog-uselivepreview": "Uise live luik ower (experimental)",
        "tog-forceeditsummary": "Gie me ae jottin when Ah dinnae put in aen eidit owerview",
@@ -60,6 +62,7 @@
        "tog-watchlisthideliu": "Skauk eidits bi loggit in uisers fae the watchleet",
        "tog-watchlisthideanons": "Skauk eidits bi nameless uisers fae the watchleet",
        "tog-watchlisthidepatrolled": "Skauk patrolled eidits fae the watchleet",
+       "tog-watchlisthidecategorization": "Hide categorisation o pages",
        "tog-ccmeonemails": "Gie me copies o emails Ah write tae ither uisers",
        "tog-diffonly": "Dinna shaw page contents ablo diffs",
        "tog-showhiddencats": "Shaw Skauk't categeries",
        "newwindow": "(apens in new windae)",
        "cancel": "Cancel",
        "moredotdotdot": "Mair...",
-       "morenotlisted": "This leet isna complete.",
+       "morenotlisted": "This leet mey be incomplete.",
        "mypage": "Ma page",
        "mytalk": "Ma tauk",
        "anontalk": "Tauk",
        "searcharticle": "Gang",
        "history": "Page histerie",
        "history_short": "Histerie",
+       "history_small": "history",
        "updatedmarker": "updatit sin ma hintmast visit",
        "printableversion": "Prent version",
        "permalink": "Permanent airtin",
        "view-foreign": "See oan $1",
        "edit": "Eedit",
        "edit-local": "Eedit the local descreeption",
-       "create": "Ceaut",
+       "create": "Creaut",
        "create-local": "Eik local descreeption",
        "editthispage": "Eedit this page",
        "create-this-page": "Creaut this page",
        "talk": "Tauk",
        "views": "Views",
        "toolbox": "Tuilkist",
+       "tool-link-userrights": "Chynge {{GENDER:$1|uiser}} groups",
+       "tool-link-userrights-readonly": "View {{GENDER:$1|uiser}} groups",
+       "tool-link-emailuser": "Email this {{GENDER:$1|uiser}}",
        "userpage": "See the uiser page",
        "projectpage": "See waurk page",
        "imagepage": "See the file page",
        "filecopyerror": "Cuidna copie file \"$1\" til \"$2\".",
        "filerenameerror": "Cuidna rename file \"$1\" til \"$2\".",
        "filedeleteerror": "Cuidna delyte file \"$1\".",
-       "directorycreateerror": "Couldna creat directerie \"$1\".",
+       "directorycreateerror": "Couldna creaut directerie \"$1\".",
        "directoryreadonlyerror": "Directerie \"$1\" is read-yinlie.",
        "directorynotreadableerror": "Directerie \"$1\" is no readable.",
        "filenotfound": "Coudna fynd file \"$1\".",
        "no-null-revision": "Coudna mak new null reveesion fer page \"$1\"",
        "badtitle": "Bad teetle",
        "badtitletext": "The requestit page teitle wis onvalid, tuim, or ae wranglie airtit inter-leid or inter-wiki teitle. It micht contain yin or mair chairacters that canna be uised in teitles.",
+       "title-invalid-interwiki": "The requestit page teetle conteens an interwiki airtin which canna be uised in teetles.",
+       "title-invalid-talk-namespace": "The requestit page teetle refers tae a talk page that canna exeest.",
+       "title-invalid-characters": "The requestit page teetle conteens invalid chairacters: \"$1\".",
+       "title-invalid-magic-tilde": "The requestit page teetle conteens invalid magic tilde sequence (<nowiki>~~~</nowiki>).",
+       "title-invalid-too-long": "The requestit page teetle is too lang. It must be na langer nor $1 {{PLURAL:$1|byte|bytes}} in UTF-8 encodin.",
+       "title-invalid-leading-colon": "The requestit page teetle conteens an invalid colon at the beginnin.",
        "perfcached": "The follaein data is cached n michtna be richt up til date. Ae maist muckle o {{PLURAL:$1|yin result is|$1 results ar}} available in the cache.",
        "perfcachedts": "The follaein data is cached, n wis hindermaist updated $1. Ae maist muckkle o {{PLURAL:$4|yin result is|$4 results ar}} available in the cache.",
        "querypage-no-updates": "Updates fer this page ar disablit at the meenit. Data here will nae be refreshit at the meenit.",
        "virus-unknownscanner": "onken't antivirus:",
        "logouttext": "<strong>Ye'r nou loggit oot.</strong>\n\nMynd that some pages micht continue tae be displeyed aes gif ye were still loggit in, til ye clear yer brouser cache.",
        "cannotlogoutnow-title": "Canna log oot nou",
+       "cannotlogoutnow-text": "Loggin oot isna possible when uisin $1.",
        "welcomeuser": "Weelcome, $1!",
        "welcomecreation-msg": "Yer accoont haes been cræftit.\nYe can chynge yer {{SITENAME}} [[Special:Preferences|preeferences]] gif ye like.",
        "yourname": "Uisername:",
        "createacct-yourpasswordagain-ph": "Enter passwaird again.",
        "userlogin-remembermypassword": "Keep me loggit in",
        "userlogin-signwithsecure": "Uise secure connection",
+       "cannotlogin-title": "Canna log in",
+       "cannotlogin-text": "Logging in isna possible.",
        "cannotloginnow-title": "Canna log in nou",
+       "cannotloginnow-text": "Logging in isna possible when uisin $1.",
+       "cannotcreateaccount-title": "Canna creaut accoonts",
        "yourdomainname": "Yer domain:",
        "password-change-forbidden": "Ye canna chynge passwords oan this wiki.",
        "externaldberror": "Aither thaur wis aen external authentication database mistak, or ye'r naw permitit tae update yer external accoont.",
        "login": "Log in",
        "login-security": "Verify yer identity",
-       "nav-login-createaccount": "Log in / cræft aen accoont",
+       "nav-login-createaccount": "Log in / creaut accoont",
        "logout": "Log oot",
        "userlogout": "Log oot",
        "notloggedin": "Naw loggit in",
        "createacct-reason-ph": "Why ar ye creating anither accoont",
        "createacct-reason-help": "Message shawn in the accoont creation log",
        "createacct-submit": "Mak yer accoont",
-       "createacct-another-submit": "Mak anither accoont",
+       "createacct-another-submit": "Creaut accoont",
        "createacct-continue-submit": "Continue accoont creation",
        "createacct-another-continue-submit": "Continue accoont creation",
        "createacct-benefit-heading": "{{SITENAME}} is makit bi fowk like ye.",
        "eauthentsent": "Ae confirmation wab-mail haes been sent til the speceefied wab-mail address.\nAfore oni ither wab-mail is sent til the accoont, ye'll hae tae follae the instructions in the wab-mail, sae as tae confirm that the accoont is reallie yers.",
        "throttled-mailpassword": "Ae password reset wab-mail haes awreadie been sent, wiin the laist {{PLURAL:$1|hoor|$1 hoors}}.\nTae hinder abuiss, yinly the yin password reset wab-mail will be sent per {{PLURAL:$1|hoor|$1 hoors}}.",
        "mailerror": "Mistak sendin mail: $1",
-       "acct_creation_throttle_hit": "Veesiters tae this wiki uisin yer IP address hae creautit $1 {{PLURAL:$1|accoont|accoonts}} the day, this is the maist alloued in that lang.\nSae veesiters uisin this IP address canna creaut onie mair accoonts juist nou.",
+       "acct_creation_throttle_hit": "Veesitors tae this wiki uisin yer IP address hae creautit {{PLURAL:$1|1 accoont|$1 accoonts}} in the last $2, which is the maximum allaed in this time period.\nAs a result, veesitors uisin this IP address canna creaut ony mair accoonts at the moment.",
        "emailauthenticated": "Yer wab-mail address wis confirmed oan $2 at $3.",
        "emailnotauthenticated": "Yer wab-mail address isna yet confirmed.\nNae wab-mail will be sent fer oni o the follaein features.",
        "noemailprefs": "Specifie aen email address in yer preferances fer thir featurs tae wairk.",
        "invalidemailaddress": "The wab-mail address canna be acceptit sin it seems tae be formattit wrang.\nPlease enter ae weel-formattit address or mak that field tuim.",
        "cannotchangeemail": "Accoont wab-mail addresses canna be chynged oan this wiki.",
        "emaildisabled": "This site canna send wab-mails.",
-       "accountcreated": "Accoont cræftit",
-       "accountcreatedtext": "The uiser accoont fer [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|tauk]]) haes been cræftit.",
+       "accountcreated": "Accoont creautit",
+       "accountcreatedtext": "The uiser accoont fer [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|tauk]]) haes been creautit.",
        "createaccount-title": "Accoont creaution fer {{SITENAME}}",
        "createaccount-text": "Somebodie cræftit aen accoont fer yer wab-mail address oan {{SITENAME}} ($4) named \"$2\", wi passwaird \"$3\".\nYe shid log in n chynge yer passwaird nou.\n\nYe can ignore this message, gif this accoont wis cræftit bi mistak.",
        "login-throttled": "Ye'v makit ower monie recynt login attempts.\nPlease wait $1 afore giein it anither gae.",
        "resetpass_submit": "Set passwaird n log in",
        "changepassword-success": "Yer passwaird chynge wis braw!",
        "changepassword-throttled": "Ye'v makit ower monie recynt login attempts.\nPlease wait $1 afore giein it anither gae.",
+       "botpasswords-createnew": "Creaut a new bot passwird",
+       "botpasswords-label-create": "Creaut",
+       "botpasswords-created-title": "Bot passwird creautit",
+       "botpasswords-created-body": "The bot passwird for bot name \"$1\" o uiser \"$2\" wis creautit.",
        "resetpass_forbidden": "Passwairds canna be chynged",
        "resetpass-no-info": "Ye maun be loggit in tae access this page directly.",
        "resetpass-submit-loggedin": "Chynge passwaird",
        "passwordreset-emailtext-user": "Uiser $1 oan {{SITENAME}} requested ae reset o yer passwaird fer {{SITENAME}}\n($4). The follaein uiser {{PLURAL:$3|accoont is|accoonts ar}} associated wi this wab-mail address:\n\n$2\n\n{{PLURAL:$3|This temperie passwaird|Thir temperie passwairds}} will expire in {{PLURAL:$5|yin day|$5 days}}.\nYe shid log in n chuise ae new password nou. Gif some ither bodie haes makit this request, or gif ye'v mynded yer oreeginal passwaird, n ye nae langer wish tae chynge it, ye can ignore this message n continue uisin yer auld passwaird.",
        "passwordreset-emailelement": "Uisername: \n$1\n\nTemperie passwaird: \n$2",
        "passwordreset-emailsentemail": "Ae passwaird reset wab-mail haes been sent.",
-       "changeemail": "Chynge wab-mail address",
+       "changeemail": "Chynge or remuive email address",
        "changeemail-header": "Chynge accoont wab-mail address",
        "changeemail-no-info": "Ye maun be loggit in tae access this page directly.",
        "changeemail-oldemail": "Current wab-mail address:",
        "sig_tip": "Yer seignatur wi timestamp",
        "hr_tip": "Horizontal line (dinna ower uise)",
        "summary": "Ootline:",
-       "subject": "Subject/heidline:",
+       "subject": "Subject:",
        "minoredit": "This is ae smaa eedit",
        "watchthis": "Watch this page",
        "savearticle": "Hain page",
        "anoneditwarning": "<strong>Warnishment:</strong> Ye'r no loggit in. Yer IP address will be publeeclie veesible gif ye mak onie eedits. Gif ye <strong>[$1 log in]</strong> or <strong>[$2 creaute aen accoont]</strong>, yer eedits will be attreebutit tae yer uisername, aes weel aes ither benefits.",
        "anonpreviewwarning": "<em>Ye'r no loggit in. Hainin will record yer IP address in this page's eedit histerie.</em>",
        "missingsummary": "<strong>Mynd:</strong> Ye'v naw gien aen eedit owerview. Gif ye clap oan \"{{int:savearticle}}\" again, yer eedit will be haint wioot ane.",
+       "selfredirect": "<strong>Wairnin:</strong> Ye are redirectin this page tae itsel.\nYe mey hae specifee'd the wrang tairget for the redirect, or ye mey be eeditin the wrang page.\nIf ye click \"{{int:savearticle}}\" again, the redirect will be creautit onywey.",
        "missingcommenttext": "Please enter ae comment ablo.",
-       "missingcommentheader": "<strong>Mynd:</strong> Ye'v na gien ae subject/heidline fer this comment.\nGif ye clap \"{{int:savearticle}}\" again, yer eedit will be hained wioot yin.",
-       "summary-preview": "Ootline leuk ower:",
-       "subject-preview": "Subject/heidline leuk ower:",
+       "missingcommentheader": "<strong>Reminder:</strong> Ye hae nae providit a subject for this comment.\nIf ye click \"{{int:savearticle}}\" again, yer eedit will be saved withoot ane.",
+       "summary-preview": "Preview o eedit summary:",
+       "subject-preview": "Preview o subject:",
+       "previewerrortext": "An error occurred while attemptin tae preview yer chynges.",
        "blockedtitle": "Uiser is blockit",
        "blockedtext": "<strong>Yer uisername or IP address haes been blockit.</strong>\n\nThe block wis makit bi $1.\nThe raison gieen is <em>$2</em>.\n\n* Stairt o block: $8\n* Expirie o block: $6\n* Intended blockee: $7\n\nYe can contact $1 or anither [[{{MediaWiki:Grouppage-sysop}}|admeenistrater]] tae discuss the block.\nYe canna uise the \"wab-mail this uiser\" feature onless ae valid wab-mail address is speceefied in yer [[Special:Preferences|accoont preferences]] n ye'v naw been blockit fae uisin it.\nYer current IP address is $3, n the block ID is #$5.\nPlease incluide aw the abuin details in onie speirins that ye mak.",
        "autoblockedtext": "Yer IP address haes been autæmateeclie blockit cause it wis uised bi anither uiser that wis blockit bi $1.\nThe raison gien is:\n\n:<em>$2</em>\n\n* Stairt o block: $8\n* Expirie o block: $6\n* Intended blockee: $7\n\nYe can contact $1 or yin o the ither [[{{MediaWiki:Grouppage-sysop}}|admeenistraters]] tae discuss the block.\n\nMynd that ye canna uise the \"wab-mail this uiser\" feature onless ye hae ae valid wab-mail address registered in yer [[Special:Preferences|uiser preeferances]] n ye'v na been blockit fae uisin it.\n\nYer current IP address is $3, n the block ID is #$5.\nPlease incluid aw abuin details in onie speirins that ye mak.",
+       "systemblockedtext": "Yer uisername or IP address haes been automatically blocked bi MediaWiki.\nThe raison gien is:\n\n:<em>$2</em>\n\n* Stairt o block: $8\n* Expiration o block: $6\n* Intendit blockee: $7\n\nYer current IP address is $3.\nPlease include aw above details in ony queries ye mak.",
        "blockednoreason": "nae grunds put",
        "whitelistedittext": "Pleas $1 tae eedit pages.",
        "confirmedittext": "Ye maun confirm yer wab-mail address afore eeditin pages. Please set n validate yer wab-mail address throogh yer [[Special:Preferences|uiser settins]].",
        "accmailtext": "Ae randomly generated passwaird fer [[User talk:$1|$1]] haes been sent til $2. It can be chynged oan the <em>[[Special:ChangePassword|chynge passwaird]]</em> page upo loggin in.",
        "newarticle": "(New)",
        "newarticletext": "Ye'v follaed aen airtin til ae page that disna exeest yet. Tae cræft the page, stairt typin in the kist ablo (see the [$1 heelp page] fer mair info). Gif ye'r here bi mistak, jist clap yer brouser's <strong>back</strong> button.",
-       "anontalkpagetext": "----\n<em>This is the discussion page fer aen anonymoos uiser that's naw cræftit aen accoont yet, or that disna uise it.</em>\nWe maun therefore uise the numerical IP address tae identifie him/her.\nSic aen IP address can be shaired bi several uisers.\nGif ye'r aen anonymos uiser n feel that onreelavant comments hae been directed at ye, please [[Special:CreateAccount|cræft aen accoont]] or [[Special:UserLogin|log in]] tae avoid futur confusion wi ither anonymoos uisers.",
-       "noarticletext": "Thaur's naw tex oan this page the nou. \nYe can [[Special:Search/{{PAGENAME}}|rake fer this page teitle]] in ither pages,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} rake the related logs],\nor [{{fullurl:{{FULLPAGENAME}}|action=edit}} eedit this page].</span>",
+       "anontalkpagetext": "----\n<em>This is the discussion page for an anonymous uiser wha haes nae creautit an accoont yet, or wha disna uise it.</em>\nWe tharefore hae tae use the numerical IP address tae identifee him/her.\nSuch an IP address can be shared bi several uisers.\nIf ye are an anonymous uiser an feel that irrelevant comments hae been directit at ye, please [[Special:CreateAccount|creaut an accoont]] or [[Special:UserLogin|log in]] tae avoid futur confusion wi ither anonymous uisers.",
+       "noarticletext": "Thare is currently na text in this page.\nYe can [[Special:Search/{{PAGENAME}}|sairch for this page teetle]] in ither pages,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} sairch the relatit logs],\nor [{{fullurl:{{FULLPAGENAME}}|action=edit}} creaut this page]</span>.",
        "noarticletext-nopermission": "Thaur's nae tex in this page the nou.\nYe can [[Special:Search/{{PAGENAME}}|rake fer this page title]] in ither pages, or <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} rake the relatit logs]</span>, but ye dinna hae permeession tae cræft this page.",
        "missing-revision": "The reveesion #$1 o the page named \"{{FULLPAGENAME}}\" disna exeest.\n\nThis is uissuallie caused bi follaein aen ootdated histerie airtin til ae page that haes been delytit.\nDetails can be foond in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} delytion log].",
        "userpage-userdoesnotexist": "Uiser accoont \"<nowiki>$1</nowiki>\" hasnae been registerit. Please check gin ye wint tae mak or eidit this page.",
        "copyrightwarning": "Please mynd that aw contreebutions til {{SITENAME}} is conseedert tae be released unner the $2 (see $1 for details). Gif ye dinna want yer writin tae be eeditit wioot mercie n redistreebuted at will, than dinna haun it it here.<br /> Forbye thon, ye'r promisin us that ye wrat this yersel, or copied it fae ae publeec domain or siclike free resoorce. <strong>Dinna haun in copierichtit wark wioot permeession!</strong>",
        "copyrightwarning2": "Please mynd that aa contreebutions til {{SITENAME}} micht be eeditit, chynged, or remuived bi ither contreebuters.\nGin ye dinna want yer writin tae be eeditit wioot mercie n redistreebuted at will, than dinna haun it in here.<br />\nYe'r promisin us forbye that ye wrat this yersel, or copied it fae ae\npubleec domain or siclike free resoorce (see $1 fer details).\n<strong>Dinna haun in copierichtit wark wioot permeession!</strong>",
        "longpageerror": "<strong>Mistak: The tex ye'v submitted is {{PLURAL:$1|yin kilobyte|$1 kilobytes}} lang, n this is langer than the maist muckle o {{PLURAL:$2|yin kilobyte|$2 kilobytes}}.</strong>\nIt canna be hained.",
-       "readonlywarning": "<strong>Warnishment: The database haes been lockit fer maintenance, sae ye'll no be able tae hain yer eedits richt nou.</strong>\nYe micht wish tae copie n paste yer tex intil ae tex file n hain it fer later.\n\nThe admeenistræter that lockit it affered this explanation: $1",
+       "readonlywarning": "<strong>Wairnin: The database haes been locked for maintenance, sae ye will nae be able tae hain yer eedits richt nou.</strong>\nYe mey wish tae copy an paste yer text intae a text file an hain it for later.\n\nThe seestem admeenistrator wha locked it offered this explanation: $1",
        "protectedpagewarning": "<strong>Warnishment: This page haes been protectit sae that yinlie uisers wi admeenistrater preevileges can eedit it.</strong>\nThe latest log entrie is gien ablo fer referance:",
        "semiprotectedpagewarning": "<strong>Mynd:</strong> This page haes been protectit sae that yinlie registered uisers can eedit it.\nThe latest log entrie is gien ablo fer referance:",
-       "cascadeprotectedwarning": "<strong>Warnishment:</strong> This page haes been lockit sae that yinlie uisers wi admeenisræter richts can eidit it, acause it is inclædit in the follaein cascade-protectit {{PLURAL:$1|page|pages}}:",
+       "cascadeprotectedwarning": "<strong>Wairnin:</strong> This page haes been pertectit sae that anerly uisers wi admeenistrator privileges can eedit it acause it is transcludit in the follaein cascade-pertectit {{PLURAL:$1|page|pages}}:",
        "titleprotectedwarning": "<strong>Warnishment: This page haes been protectit sae that [[Special:ListGroupRights|speceefic richts]] ar needed tae cræft it.</strong>\nThe laitest log entrie is gien ablo fer referance:",
        "templatesused": "{{PLURAL:$1|Template|Templates}} uised oan this page:",
        "templatesusedpreview": "{{PLURAL:$1|Template|Templates}} uised in this luikower:",
        "invalid-content-data": "Onvalid content data",
        "content-not-allowed-here": "\"$1\" content isna permited oan the page [[$2]]",
        "editwarning-warning": "Leain this page micht cause ye tae lose oni chynges that ye'v makit.\nGif ye'r loggit in, ye can disable this warnishment in the \"{{int:prefs-editing}}\" section o yer preferences.",
+       "editpage-invalidcontentmodel-title": "Content model nae supportit",
+       "editpage-invalidcontentmodel-text": "The content model \"$1\" isna supportit.",
        "editpage-notsupportedcontentformat-title": "Content format isna supported",
        "editpage-notsupportedcontentformat-text": "The content format $1 isna supported bi the content model $2.",
        "content-model-wikitext": "wikitex",
        "content-model-text": "plain tex",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "deprecated-self-close-category": "Pages uising invalid sel-closed HTML tags",
        "duplicate-args-category": "Pages uisin dupleecate arguments in template caws",
        "duplicate-args-category-desc": "The page contains template caws that uise dupleecates o arguments, lik <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> or <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "<strong>Warnishment:</strong> This page contains ower moni expensive parser function caws.\n\nIt shid hae less than $2 {{PLURAL:$2|caw|caws}}, thaur {{PLURAL:$1|is nou $1 caw|ar noo $1 caws}}.",
        "post-expand-template-argument-warning": "<strong>Warnishment:</strong> This page hauds at least the ae template argument that haes aen ower muckle expansion size.\nThir arguments hae been left oot.",
        "post-expand-template-argument-category": "Pages containing omittit template arguments",
        "parser-template-loop-warning": "Template luip detected: [[$1]]",
+       "template-loop-category": "Pages wi template loops",
+       "template-loop-category-desc": "The page conteens a template loop, ie. a template which caws itsel recursively.",
        "parser-template-recursion-depth-warning": "Template recursion depth limit owershote ($1)",
        "language-converter-depth-warning": "Leid converter depth limit owershote ($1)",
        "node-count-exceeded-category": "Pages whaur node-coont is owershote",
        "page_first": "first",
        "page_last": "hintmaist",
        "histlegend": "Diff selection: Maurk the radio kists o the reveesions tae compare n hit enter or the button at the bottom.<br />\nLegend: <strong>({{int:cur}})</strong> = differance wi laitest reveesion, <strong>({{int:last}})</strong> = differance wi preceedin reveesion, <strong>{{int:minoreditletter}}</strong> = smaa eidit.",
-       "history-fieldset-title": "Brouse histerie",
-       "history-show-deleted": "Delytit yinlie",
+       "history-fieldset-title": "Sairch for reveesions",
+       "history-show-deleted": "Reveesion deletit anerly",
        "histfirst": "auldest",
        "histlast": "newest",
        "historysize": "({{PLURAL:$1|1 byte|$1 bytes}})",
        "history-feed-description": "Reveesion histerie fer this page oan the wiki",
        "history-feed-item-nocomment": "$1 at $2",
        "history-feed-empty": "The requestit page disnae exeest.\nIt micht hae been delytit fae the wiki, or the name micht hae been chynged.\nTry [[Special:Search|rakin oan the wiki]] fer new pages ye micht be interestit in.",
+       "history-edit-tags": "Eedit tags o selectit reveesions",
        "rev-deleted-comment": "(eedit ootline remuived)",
        "rev-deleted-user": "(uisername remuivit)",
-       "rev-deleted-event": "(log action remuived)",
+       "rev-deleted-event": "(log details remuived)",
        "rev-deleted-user-contribs": "[uisername or IP address remuived - eidit skauk't fae contreebutions]",
        "rev-deleted-text-permission": "This page reveesion haes been <strong>delytit</strong>.\nDetails can be foond in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} delytion log].",
        "rev-suppressed-text-permission": "This page reveesion haes been <strong>suppressed</strong>.\nTae fynd oot why the [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log].",
        "mergehistory-empty": "Naw reveesions can be merged.",
        "mergehistory-done": "$3 {{PLURAL:$3|reveesion|reveesions}} o $1 successfully merged intil [[:$2]].",
        "mergehistory-fail": "Onable tae perform histerie merge, please recheck the page n time parameters.",
+       "mergehistory-fail-invalid-source": "Soorce page is invalid.",
+       "mergehistory-fail-permission": "Insufficient permissions tae merge history.",
+       "mergehistory-fail-self-merge": "Soorce an destination pages are the same.",
        "mergehistory-fail-toobig": "Canna perform histerie merge cause mair than the leemit o $1 {{PLURAL:$1|reveesion|reveesions}} wid be muivit.",
        "mergehistory-no-source": "Soorce page $1 disna exeest.",
        "mergehistory-no-destination": "Destination page $1 disna exeest.",
        "searchprofile-advanced-tooltip": "Rake in custom namespaces",
        "search-result-size": "$1 ({{PLURAL:$2|1 waird|$2 wairds}})",
        "search-result-category-size": "{{PLURAL:$1|1 memmer|$1 memmers}} ({{PLURAL:$2|1 subcategerie|$2 subcategeries}}, {{PLURAL:$3|1 file|$3 files}})",
-       "search-redirect": "(reguide $1)",
+       "search-redirect": "(reguide frae $1)",
        "search-section": "(section $1)",
        "search-category": "(categerie $1)",
        "search-file-match": "(matches file content.)",
        "search-interwiki-caption": "Sister projec's",
        "search-interwiki-default": "Ootcomes fae $1:",
        "search-interwiki-more": "(mair)",
+       "search-interwiki-more-results": "mair results",
        "search-relatedarticle": "Relatit",
        "searchrelated": "relatit",
        "searchall": "aw",
        "search-external": "Eixternal rake",
        "searchdisabled": "Rakin throu {{SITENAME}} is disabled fer performance raisons. Ye can rake bi wa o Google juist nou. Mynd that thair indexes o {{SITENAME}} content micht be oot o date.",
        "search-error": "Ae mistak haes occurred while rakin: $1",
+       "search-warning": "A wairnin has occured while sairchin: $1",
        "preferences": "Ma preferences",
        "mypreferences": "Ma preferences",
        "prefs-edits": "Nummer o eidits:",
        "prefs-personal": "Uiser data",
        "prefs-rc": "Recent chynges n shawin stubs",
        "prefs-watchlist": "Watchleet",
+       "prefs-editwatchlist": "Eedit watchleet",
+       "prefs-editwatchlist-label": "Eedit entries on yer watchleet:",
+       "prefs-editwatchlist-edit": "View an remuive teetles on yer watchleet",
+       "prefs-editwatchlist-raw": "Eedit raw watchleet",
+       "prefs-editwatchlist-clear": "Clear yer watchleet",
        "prefs-watchlist-days": "Days tae shaw in watchleet:",
        "prefs-watchlist-days-max": "Mucklest $1 {{PLURAL:$1|day|days}}",
        "prefs-watchlist-edits": "Mucklest nummer o chynges tae shaw in expanded watchleet:",
        "prefs-watchlist-token": "Watchleet token:",
        "prefs-misc": "Ither",
        "prefs-resetpass": "Chynge passwaird",
-       "prefs-changeemail": "Chynge Wab-mail address",
+       "prefs-changeemail": "Chynge or remuive email address",
        "prefs-setemail": "Set ae wab-mail address",
        "prefs-email": "Wab-mail opties",
        "prefs-rendering": "Appearence",
        "prefs-help-recentchangescount": "This includes recent chynges, page histories, n logs.",
        "prefs-help-watchlist-token2": "This is the hidlins key til the wab feed o yer watchleet. Onibodie wha kens this can read yer watchleet, sae dinna shair it. Gif ye need to, [[Special:ResetTokens|Ye can reset it]].",
        "savedprefs": "Yer preferences haes been hained.",
+       "savedrights": "The uiser groups o {{GENDER:$1|$1}} hae been hained.",
        "timezonelegend": "Time zone:",
        "localtime": "Local time:",
        "timezoneuseserverdefault": "Uise wiki defaut ($1)",
        "youremail": "Yer email:",
        "username": "{{GENDER:$1|Uisername}}:",
        "prefs-memberingroups": "{{GENDER:$2|Memmer}} o {{PLURAL:$1|groop|groops}}:",
+       "group-membership-link-with-expiry": "$1 (till $2)",
        "prefs-registration": "Regeestration time:",
        "yourrealname": "Yer real name:",
        "yourlanguage": "Interface leid:",
        "badsig": "Raw signature nae guid; check HTML tags.",
        "badsiglength": "Yer signatur is ower lang; it haes tae be $1 {{PLURAL:$1|chairacter|chairacters}} or less.",
        "yourgender": "Hou dae ye prefer tae be described?",
-       "gender-unknown": "Ah prefer tae na say",
+       "gender-unknown": "When mentionin ye, the saftware will uise gender neutral wirds whenever possible",
        "gender-male": "He eedits wiki pages",
        "gender-female": "She eedits wiki pages",
        "prefs-help-gender": "Settin this preference is aen optie.\nThe saffware uises its value tae address ye n tae mention ye til ithers uisin the appropriate grammatical gender.\nThis information will be publeec.",
        "prefs-help-prefershttps": "This preeferance will tak effect oan yer nex login.",
        "prefswarning-warning": "Ye'v makit chynges tae yer preferances that'v no been hained yet.\nGif ye leave this page wioot clapin \"$1\" than yer preferances 'll no be updatit.",
        "prefs-tabs-navigation-hint": "Tip: Ye can uise the cair n richt arrae keys tae naveegate atween the tabs in the tabs leet.",
-       "userrights": "Uiser richts managemant",
-       "userrights-lookup-user": "Manage uiser groops",
+       "userrights": "Uiser richts",
+       "userrights-lookup-user": "Select a uiser",
        "userrights-user-editname": "Enter ae uisername:",
-       "editusergroup": "Eidit uiser boorach",
-       "editinguser": "Chynging uiser richts o uiser <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Eedit uiser groops",
-       "saveusergroups": "Hain uiser groops",
+       "editusergroup": "Laid uiser groups",
+       "editinguser": "Chyngin uiser richts o {{GENDER:$1|uiser}} <strong>[[User:$1|$1]]</strong> $2",
+       "viewinguserrights": "Viewin uiser richts o {{GENDER:$1|uiser}} <strong>[[User:$1|$1]]</strong> $2",
+       "userrights-editusergroup": "Eedit {{GENDER:$1|uiser}} groups",
+       "userrights-viewusergroup": "View {{GENDER:$1|uiser}} groups",
+       "saveusergroups": "Save {{GENDER:$1|uiser}} groups",
        "userrights-groupsmember": "Memmer o:",
        "userrights-groupsmember-auto": "Impleecit memmer o:",
        "userrights-groups-help": "Ye can alter the groops this uiser is in:\n* Ae checkit kist means that the uiser is in that groop.\n* Aen oncheckit kist means that the uiser's na in that groop.\n* Ae * indeecates that ye canna remuiv the groop yince ye'v eikit it, or vice versa.",
        "userrights-nodatabase": "Database $1 disna exeest or isna local.",
        "userrights-changeable-col": "Groops that ye can chynge",
        "userrights-unchangeable-col": "Groops ye canna chynge",
+       "userrights-expiry-none": "Disna expire",
+       "userrights-expiry-othertime": "Ither time:",
        "userrights-conflict": "Conflict o uiser richts chynges! Please luikower n confirm yer chynges.",
        "group": "Groop:",
        "group-user": "Uisers",
        "right-siteadmin": "Lock n lowse the database",
        "right-override-export-depth": "Export pages incluidin linked pages up til ae depth o 5",
        "right-sendemail": "Send Wab-mail til ither uisers",
+       "right-managechangetags": "Creaut an (de)activate [[Special:Tags|tags]]",
+       "grant-createaccount": "Creaut accoonts",
+       "grant-rollback": "Rowback chynges tae pages",
+       "grant-sendemail": "Send email tae ither uisers",
+       "grant-basic": "Basic richts",
        "newuserlogpage": "Uiser cræftin log",
        "newuserlogpagetext": "This is ae log o uiser cræftins.",
        "rightslog": "Uiser richts log",
        "rightslogtext": "This is a log o chynges tae uiser richts.",
        "action-read": "read this page",
        "action-edit": "eedit this page",
-       "action-createpage": "cræft pages",
-       "action-createtalk": "cræft discussion pages",
+       "action-createpage": "creaut this page",
+       "action-createtalk": "creaut this discussion page",
        "action-createaccount": "cræft this uiser accoont",
+       "action-autocreateaccount": "automatically creaut this freemit uiser accoont",
        "action-history": "see the histerie o this page",
        "action-minoredit": "maurk this eedit aes smaa",
        "action-move": "muiv this page",
        "action-upload_by_url": "uplaid this file fae ae URL",
        "action-writeapi": "uise the write API",
        "action-delete": "delyte this page",
-       "action-deleterevision": "delyte this reveesion",
-       "action-deletedhistory": "see this page's delytit histerie",
+       "action-deleterevision": "delete reveesions",
+       "action-deletelogentry": "delete log entries",
+       "action-deletedhistory": "view a page's delete history",
+       "action-deletedtext": "view delete reveesion text",
        "action-browsearchive": "rake delytit pages",
-       "action-undelete": "ondelyte this page",
-       "action-suppressrevision": "luikower n restore this skaukt reveesion",
+       "action-undelete": "undelete pages",
+       "action-suppressrevision": "review an restore hidden reveesions",
        "action-suppressionlog": "see this preevate log",
        "action-block": "block this uiser fae eeditin",
        "action-protect": "chynge protection levels fer this page",
        "action-userrights-interwiki": "eedit the uiser richts o uisers oan ither wikis",
        "action-siteadmin": "lock or lowse the database",
        "action-sendemail": "send wab-mails",
+       "action-editmyoptions": "eedit yer preferences",
        "action-editmywatchlist": "eedit yer watchleet",
        "action-viewmywatchlist": "see yer watchleet",
        "action-viewmyprivateinfo": "see yer preevate information",
        "action-editmyprivateinfo": "eedit yer preevate information",
        "action-editcontentmodel": "eedit the content model o ae page",
+       "action-managechangetags": "creaut an (de)activate tags",
        "nchanges": "$1 {{PLURAL:$1|chynge|chynges}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|sin laist veesit}}",
        "enhancedrc-history": "histeri",
        "recentchanges-label-plusminus": "The page size chynged bi this nummer o bytes",
        "recentchanges-legend-heading": "<strong>Legend:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (see [[Special:NewPages|leet o new pages]] n aw)",
+       "recentchanges-submit": "Shaw",
+       "rcfilters-filterlist-whatsthis": "Whit's this?",
+       "rcfilters-filter-editsbyself-description": "Eedits bi ye.",
+       "rcfilters-filter-major-description": "Eedits nae labeled as minor.",
+       "rcfilters-filter-pageedits-label": "Page eedits",
        "rcnotefrom": "Ablo {{PLURAL:$5|is the chynge|ar the chynges}} sin <strong>$3, $4</strong> (up tae <strong>$1</strong> shawn).",
        "rclistfrom": "Shaw new chynges stertin fae $3 $2",
        "rcshowhideminor": "$1 smaa eedits",
        "rcshowhidemine": "$1 ma eedits",
        "rcshowhidemine-show": "Shaw",
        "rcshowhidemine-hide": "Skauk",
+       "rcshowhidecategorization-show": "Shaw",
        "rclinks": "Shaw last $1 chynges in last $2 days<br />$3",
        "diff": "diff",
        "hist": "hist",
        "upload-too-many-redirects": "The URL contained oewr monie reguidals",
        "upload-http-error": "Aen HTTP mistake occurred: $1",
        "upload-copy-upload-invalid-domain": "Copie uplaids arna available fae this domain.",
+       "upload-dialog-title": "Uplaid file",
+       "upload-dialog-button-cancel": "Cancel",
+       "upload-dialog-button-back": "Back",
+       "upload-dialog-button-done": "Duin",
+       "upload-dialog-button-save": "Hain",
+       "upload-dialog-button-upload": "Uplaid",
+       "upload-form-label-infoform-title": "Details",
+       "upload-form-label-infoform-name": "Name",
+       "upload-form-label-own-work": "This is ma awn wark",
+       "upload-form-label-own-work-message-generic-local": "A confirm that A am uplaidin this file follaein the terms o service an licensin policies on {{SITENAME}}.",
        "backend-fail-stream": "Coudna stream file \"$1\".",
        "backend-fail-backup": "Coudna backup file \"$1\".",
        "backend-fail-notexists": "The file $1 disna exeest.",
        "randomincategory-nopages": "Thaur's naw pages in the [[:Category:$1|$1]] categerie.",
        "randomincategory-category": "Categerie:",
        "randomincategory-legend": "Random page in categerie",
+       "randomincategory-submit": "Gae",
        "randomredirect": "Random reguidal",
        "randomredirect-nopages": "Thaur's naw reguidals in the namespace \"$1\".",
        "statistics": "Stateestics",
        "apihelp-no-such-module": "Module \"$1\" wis no foond.",
        "apisandbox-loading": "Laidin information for API module \"$1\"...",
        "apisandbox-load-error": "An error occurred while laidin information for API module \"$1\": $2",
+       "apisandbox-multivalue-all-values": "$1 (Aw values)",
        "booksources": "Buik soorces",
        "booksources-search-legend": "Rake fer buik soorces",
        "booksources-search": "Rake",
        "booksources-text": "Ablo is ae leet o airtins til ither steids that sell new n uised buiks, n micht hae further information aneat buiks that ye'r seekin ava:",
        "booksources-invalid-isbn": "The gien ISBN disna seem tae be valid; check fer mistaks copiein fae the oreeginal soorce.",
+       "magiclink-tracking-rfc": "Pages uisin RFC magic airtins",
+       "magiclink-tracking-pmid": "Pages uisin PMID magic airtins",
+       "magiclink-tracking-isbn": "Pages uisin ISBN magic airtins",
        "specialloguserlabel": "Performer:",
        "speciallogtitlelabel": "Target (title or uiser):",
        "log": "Logs",
        "trackingcategories-msg": "The Trackin Categerie",
        "trackingcategories-name": "The Message name",
        "trackingcategories-desc": "Categerie inclusion criteria",
+       "restricted-displaytitle-ignored": "Pages wi ignored display teetles",
        "noindex-category-desc": "The page haes ae <code><nowiki>__NOINDEX__</nowiki></code> mageec waird oan it (n is in ae namespace whaur that flag is alloud), n sae it's no indext bi the robots.",
        "index-category-desc": "The page haes ae <code><nowiki>__INDEX__</nowiki></code> oan it (n is in ae namespace whaur that flag is alloud), n sae it's indext bi the robots whaur it widna normallie be.",
        "post-expand-template-inclusion-category-desc": "The page size is muckler than <code>$wgMaxArticleSize</code>, efter makin aw o the templates muckler, sae some templates were no makit muckler.",
        "watchnologin": "Nae loggit in",
        "addwatch": "Eik til watchleet",
        "addedwatchtext": "The page \"[[:$1]]\" haes been added til yer [[Special:Watchlist|watchleet]].\nFutur chynges til this page n its associated tauk page will be leeted thaur.",
-       "addedwatchtext-short": "The page \"$1\" haes been eikit tae yer watchleet.",
+       "addedwatchtext-short": "The page \"$1\" haes been addit tae yer watchleet.",
        "removewatch": "Remuiv fae watchleet",
        "removedwatchtext": "The page \"[[:$1]]\" haes been remuied fae [[Special:Watchlist|yer watchleet]].",
        "removedwatchtext-short": "The page \"$1\" haes been remuived fae yer watchleet.",
        "modifiedarticleprotection": "chynged protection level fer \"[[$1]]\"",
        "unprotectedarticle": "remuied protection fae \"[[$1]]\"",
        "movedarticleprotection": "muived protection settins fae \"[[$2]]\" til \"[[$1]]\"",
+       "protectedarticle-comment": "{{GENDER:$2|Pertectit}} \"[[$1]]\"",
+       "modifiedarticleprotection-comment": "{{GENDER:$2|Chynged pertection level}} for \"[[$1]]\"",
+       "unprotectedarticle-comment": "{{GENDER:$2|Remuived protection}} frae \"[[$1]]\"",
        "protect-title": "Chynge protection level fer \"$1\"",
        "protect-title-notallowed": "See protection level o \"$1\"",
        "prot_1movedto2": "[[$1]] muivit tae [[$2]]",
        "undeleteviewlink": "see",
        "undeleteinvert": "Invert the selection",
        "undeletecomment": "Raison:",
-       "undeletedrevisions": "{{PLURAL:$1|1 reveesion|$1 reveesions}} restored",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 reveesion|$1 reveesions}} n {{PLURAL:$2|1 file|$2 files}} restored",
-       "undeletedfiles": "{{PLURAL:$1|1 file|$1 files}} restored",
        "cannotundelete": "Ondelyte failed:\n$1",
        "undeletedpage": "<strong>$1 haes been restored</strong>\n\nConsult the [[Special:Log/delete|delytion log]] fer ae record o recynt delytions n restorations.",
        "undelete-header": "See [[Special:Log/delete|the delytion log]] fer the recentlie delytit pages.",
        "contributions": "{{GENDER:$1|Uiser}} contributions",
        "contributions-title": "Uiser contreebutions fer $1",
        "mycontris": "Ma contreebutions",
+       "anoncontribs": "Contreibutions",
        "contribsub2": "Fer {{GENDER:$3|$1}} ($2)",
        "contributions-userdoesnotexist": "Uiser accoont \"$1\" is no registerit.",
        "nocontribs": "Nae chynges wis funnd matchin thir criteria.",
        "sp-contributions-username": "IP address or uisername:",
        "sp-contributions-toponly": "Ainlie shaw eedits that ar laitest reveesions",
        "sp-contributions-newonly": "Yinlie shaw eidits that ar page cræftins",
+       "sp-contributions-hideminor": "Hide minor eedits",
        "sp-contributions-submit": "Rake",
        "whatlinkshere": "Whit airts here",
        "whatlinkshere-title": "Pages that link til \"$1\"",
        "whatlinkshere-hidelinks": "$1 airtins",
        "whatlinkshere-hideimages": "$1 file airtins",
        "whatlinkshere-filters": "Filters",
+       "whatlinkshere-submit": "Gae",
        "autoblockid": "Autæblock #$1",
        "block": "Block uiser",
        "unblock": "Onblock uiser",
        "thumbnail_image-missing": "File seems tae be missin: $1",
        "thumbnail_image-failure-limit": "Thaur hae been ower monie recynt failed attempts ($1 or mair) tae render this thummnail. Please ettle again later.",
        "import": "Import pages",
-       "importinterwiki": "Transwiki import",
+       "importinterwiki": "Import frae anither wiki",
        "import-interwiki-text": "Select ae wiki n page title tae import.\nReveesion dates n eediters' names will be preserved.\nAw transwiki import actions ar loggit at the [[Special:Log/import|import log]].",
        "import-interwiki-sourcewiki": "The Soorce wiki:",
        "import-interwiki-sourcepage": "The Soorce page:",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|reveesion|reveesions}} importit fae $2",
        "javascripttest": "JavaScript testin",
        "javascripttest-qunit-intro": "See [$1 testin documentation] oan mediawiki.org.",
-       "tooltip-pt-userpage": "Yer uiser page",
+       "tooltip-pt-userpage": "{{GENDER:|Yer uiser}} page",
        "tooltip-pt-anonuserpage": "The uiser page fer the IP address that ye'r eeditin aes",
-       "tooltip-pt-mytalk": "Yer tauk page",
+       "tooltip-pt-mytalk": "{{GENDER:|Yer}} tauk page",
        "tooltip-pt-anontalk": "Discussion aneat eedits fae this IP address",
-       "tooltip-pt-preferences": "Ma preferances",
+       "tooltip-pt-preferences": "{{GENDER:|Yer}} preferences",
        "tooltip-pt-watchlist": "Ae leet o pages ye'r moniterin fer chynges",
-       "tooltip-pt-mycontris": "Leet o yer contreebutions",
+       "tooltip-pt-mycontris": "A leet o {{GENDER:|yer}} contreibutions",
+       "tooltip-pt-anoncontribs": "A leet o eedits made frae this IP address",
        "tooltip-pt-login": "It's ae guid idea tae log in, but ye dinna hae tae.",
        "tooltip-pt-logout": "Log oot",
        "tooltip-pt-createaccount": "We encoorage ye tae creaute aen accoont n log in; houever, it's no strictllie nesisair",
        "tooltip-t-recentchangeslinked": "Recynt chynges in pages linkt fae this page",
        "tooltip-feed-rss": "RSS feed fer this page",
        "tooltip-feed-atom": "Atom feed fer this page",
-       "tooltip-t-contributions": "See ae leet o this uiser's contreebutions",
+       "tooltip-t-contributions": "A leet o contreibutions bi {{GENDER:$1|this uiser}}",
        "tooltip-t-emailuser": "Send ae wab-mail til this uiser",
        "tooltip-t-info": "Mair information aneat this page",
        "tooltip-t-upload": "Uplaid files",
        "lastmodifiedatby": "This page wis laist modified $2, $1 bi $3.",
        "othercontribs": "Based oan wark bi $1.",
        "others": "ithers",
-       "siteusers": "{{SITENAME}} {{PLURAL:$2|uiser|uisers}} $1",
+       "siteusers": "{{SITENAME}} {{PLURAL:$2|{{GENDER:$1|uiser}}|uisers}} $1",
        "anonusers": "{{SITENAME}} anonymoos {{PLURAL:$2|uiser|uisers}} $1",
        "creditspage": "Page creeedits",
        "nocredits": "Thaur's nae creedit info available fer this page.",
        "pageinfo-length": "Page langth (in bytes)",
        "pageinfo-article-id": "The Page ID",
        "pageinfo-language": "Page content leid",
+       "pageinfo-language-change": "chynge",
        "pageinfo-content-model": "The Page content model",
        "pageinfo-robot-policy": "Indexin bi robots",
        "pageinfo-robot-index": "Permitit",
        "pageinfo-robot-noindex": "Na permitit",
        "pageinfo-watchers": "Nummer o page watchers",
+       "pageinfo-visiting-watchers": "Nummer o page watchers wha veesitit recent eedits",
        "pageinfo-few-watchers": "Less than $1 {{PLURAL:$1|watcher|watchers}}",
        "pageinfo-redirects-name": "Nummer o reguidals til this page",
        "pageinfo-subpages-name": "Nummer o subpages o this page",
        "newimages-summary": "This byordinair page shaws the last uplaidit files.",
        "newimages-legend": "Filter",
        "newimages-label": "Filename (or ae pairt o it):",
+       "newimages-user": "IP address or uisername",
        "newimages-showbots": "Shaw uplaids bi bots",
        "noimages": "Nawthing tae see.",
        "ilsubmit": "Rake",
        "watchlistedit-raw-done": "Yer watchleet haes been updated.",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 title wis|$1 titles were}} added:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 title wis|$1 titles were}} remuived:",
-       "watchlistedit-clear-title": "Cleared watchleet",
+       "watchlistedit-clear-title": "Clear watchleet",
        "watchlistedit-clear-legend": "Clear watchleet",
        "watchlistedit-clear-explain": "Aw o the titles will be remuived fae yer watchleet",
        "watchlistedit-clear-titles": "Titles:",
        "tags-active-no": "Naw",
        "tags-edit": "eedit",
        "tags-hitcount": "$1 {{PLURAL:$1|chynge|chynges}}",
+       "tags-create-submit": "Creaut",
        "tags-edit-logentry-selected": "{{PLURAL:$1|Selectit log event|Selectit log events}}:",
        "tags-edit-logentry-legend": "Add or remuive tags frae {{PLURAL:$1|this log entry|aw $1 log entries}}",
        "tags-edit-logentry-submit": "Apply chynges tae {{PLURAL:$1|this log entry|$1 log entries}}",
        "feedback-subject": "Aneat:",
        "feedback-submit": "Haun-in",
        "feedback-thanks": "Thanks! Yer feedback haes been posted til the page \"[$2 $1]\".",
-       "searchsuggest-search": "Rake",
+       "searchsuggest-search": "Sairch {{SITENAME}}",
        "searchsuggest-containing": "containin...",
        "api-error-badtoken": "Inby mistak: Bad token.",
        "api-error-emptypage": "Cræftin new, tuim pages isna permittit.",
        "pagelang-language": "Leid",
        "pagelang-use-default": "Uise the defaut leid",
        "pagelang-select-lang": "Pick yer leid",
+       "pagelang-nonexistent-page": "The page $1 disna exeest.",
+       "pagelang-unchanged-language": "The page $1 is already set tae leid $2.",
+       "pagelang-unchanged-language-default": "The page $1 is awready set tae the wiki's default content leid.",
+       "pagelang-db-failed": "The database failed tae chynge the page leid.",
        "right-pagelang": "Chynge page leid",
        "action-pagelang": "chynge the page leid",
        "log-name-pagelang": "Leid chynge log",
        "log-description-pagelang": "This is ae log o chynges in page leids.",
-       "logentry-pagelang-pagelang": "$1 {{GENDER:$2|chynged}} page leid fer $3 fae $4 tae $5.",
+       "logentry-pagelang-pagelang": "$1 {{GENDER:$2|chynged}} the leid o $3 frae $4 tae $5",
        "default-skin-not-found": "Whoops! The defaut skin fer yer wiki, defined in <code dir=\"ltr\">$wgDefaultSkin</code> aes <code>$1</code>, is no available.\n\nYer instawation seems tae incluid the follaein skins. See [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Skin configuration] fer information oan hou tae enable thaim n chuise the defaut.\n\n$2\n\n; Gif ye'v juist instawed MediaWiki:\n: Ye proabablie instawed it fae git, or directlie fae the soorce code uisin some ither method. This is expectie. Gie instawin some skins fae [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org's skin directory] ae shot, bi:\n:* Dounlaidin the [https://www.mediawiki.org/wiki/Download tarball installer], this comes wi several skins n extensions. Ye can than capie n paste the <code>skins/</code> directerie fae this.\n:* Dounlaidin indiveedual skin tarballs frae [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* Clonin one of the <code>mediawiki/skins/*</code> repositries bi wa o git intae the <code dir=\"ltr\">skins/</code> directerie o yer MediaWiki instawation.\n: Daein this shoudna interfere wi yer git repositrie gif ye'r ae MediaWiki deveeloper.\n\n; Gif ye,v juist upgradit MediaWiki:\n: MediaWiki 1.24 n newer nae langer enables instawed skins autæmateeclie (see [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: Skin autodiscovery]). Ye can paste the follaein lines intae <code>LocalSettings.php</code> tae enable aw nou installed skins:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Gif ye'v juist modified <code>LocalSettings.php</code>:\n: Double-check the skin names fer typos.",
        "default-skin-not-found-no-skins": "Whoops! The defaut skin fer yer wiki, defined in <code>$wgDefaultSkin</code> aes <code>$1</code>, is no available.\n\nYe'v nae instawed skins.\n\n; Gif ye'v juist instawed or upgradit MediaWiki:\n: Ye probably instawed fae git, or directlie fae the soorce code uisin some ither method. This is expectit. MediaWiki 1.24 n newer disna incluid onie skins in the main repositrie. Gie instawin some skins fae [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org's skin directory] ae shot, bi:\n:* Dounlaidin the [https://www.mediawiki.org/wiki/Download tarball installer], this comes wi several skins n extensions. Ye can than capie n paste the <code>skins/</code> directerie fae it.\n:* Dounlaidin individual skin tarballs fae [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* Cloning yin o the <code>mediawiki/skins/*</code> repositries bi wa o git intae the <code dir=\"ltr\">skins/</code> directerie o yer MediaWiki instawation.\n: Daein this shoudna interfere wi yer git repositrie gif ye'r ae MediaWiki deveeloper. See [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Skin configuration] fer information oan hou tae enable skins n chuise the defaut.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (enabled)",
        "mediastatistics-header-text": "Texual",
        "mediastatistics-header-executable": "Executables",
        "mediastatistics-header-archive": "Compressed formats",
+       "mediastatistics-header-total": "Aw files",
        "json-warn-trailing-comma": "$1 trailin {{PLURAL:$1|comma wis|commas were}} remuived fae JSON",
        "json-error-unknown": "Thaur wis ae proablem wi the JSON. Mistak: $1",
        "json-error-depth": "The mucklest stack depth haes been exceedit",
        "authmanager-authn-no-local-user-link": "The supplee'd credentials are valid but are nae associatit wi ony uiser on this wiki. Login in a different way, or create a new uiser, an ye will hae an option tae airtin yer previous credentials tae that accoont.",
        "authform-nosession-login": "The authentication wis successfu, but yer brouser canna \"remember\" bein logged in.\n\n$1",
        "authpage-cannot-login": "Unable tae stairt login.",
-       "authpage-cannot-login-continue": "Unable tae continue login. Yer session maist likly timed oot."
+       "authpage-cannot-login-continue": "Unable tae continue login. Yer session maist likly timed oot.",
+       "restrictionsfield-label": "Allaed IP ranges:"
 }
index 9549557..5107682 100644 (file)
@@ -6,7 +6,8 @@
                        "Fayazburiro",
                        "Sindhu",
                        "Mehtab ahmed",
-                       "Macofe"
+                       "Macofe",
+                       "Indus Asia"
                ]
        },
        "tog-underline": "ڳنڍڻي هيٺان لڪير:",
        "login": "داخل ٿيو",
        "login-security": "پنھنجي سڃاڻپ جي خاطري ڪريو",
        "nav-login-createaccount": "داخل ٿيو / کاتو کوليو",
-       "userlogin": "داخل ٿيو / کاتو کوليو",
-       "userloginnocreate": "داخل ٿيو",
        "logout": "خارج ٿيو",
        "userlogout": "خارج ٿيو",
        "notloggedin": "داخل ٿيل نہ آهيو",
        "userlogin-noaccount": "کاتو نہ ٿا رکو؟",
        "userlogin-joinproject": "{{SITENAME}} ۾ شامل ٿيو",
-       "nologin": " کاتو نہ ٿا رکو؟ '''$1'''.",
-       "nologinlink": "نئون کاتو کوليو",
        "createaccount": "کاتو کوليو",
-       "gotaccount": "ڇا اڳي ئي کاتو رکو ٿا؟ '''$1'''.",
-       "gotaccountlink": "داخل ٿيو",
-       "userlogin-resetlink": "پنهنجي داخل ٿيڻ جا تفصيل وساري ويٺا؟",
        "userlogin-resetpassword-link": "ڳجھولفظ وساري ويٺا آهيو؟",
        "userlogin-helplink2": "داخل ٿيڻ ۾ مدد",
        "userlogin-reauth": "اھو پڪ ڪرڻ لاءِ ته توھان {{GENDER:$1|$1}} آھيو توھان کي ٻيھر داخل ٿيڻو پوندو.",
        "createacct-another-email-ph": "برق ٽپال پتو ڄاڻايو",
        "createaccountmail": "ڪو بہ عارضي ڳجھولفظ استعمال ڪريو ۽ ڄاڻايل برقٽپال پتي تي اماڻيو",
        "createacct-realname": "اصل نالو (مرضيءَ موجب)",
-       "createaccountreason": "سبب:",
        "createacct-reason": "سبب",
        "createacct-reason-ph": "توهان ٻيو کاتو ڇو کولي رهيا آهيو",
        "createacct-submit": "پنھنجو کاتو کوليو",
        "recentchanges-legend-heading": "<strong>ڪنجي:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (پڻ ڏسو [[Special:NewPages|نون صفحن جي فھرست]])",
        "recentchanges-submit": "ڏيکاريو",
+       "rcfilters-filterlist-whatsthis": "هي ڇا آهي؟",
+       "rcfilters-highlightbutton-title": "نتيجن کي نمايان (هاءِ لائيٽ) ڪيو",
+       "rcfilters-highlightmenu-title": "رنگ چونڊيو",
        "rcnotefrom": "هيٺ {{PLURAL:$5|تبديلي آهي|تبديليون آهن}} کان <strong>$3, $4</strong> (تائين <strong>$1</strong> ) ڏيکاريل آهن.",
        "rclistfrom": "$2، $3 کان شروع ٿيندڙ نيون تبديليون ڏيکاريو",
        "rcshowhideminor": "$1 معمولي ترميمون",
        "logentry-newusers-create": "يوزر کاتو $1 {{GENDER:$2|سرجيو ويو}}",
        "logentry-upload-upload": "$1 {{GENDER:$2|چاڙهيو}} $3",
        "rightsnone": "(ڪو بہ نہ)",
-       "revdelete-summary": "ترميمي خلاصو",
        "feedback-back": "پوئتي",
        "feedback-cancel": "رد",
        "feedback-close": "ٿي ويو",
index 9c198a6..40e57a9 100644 (file)
        "aboutsite": "O projektu {{SITENAME}}",
        "aboutpage": "Project:O_projektu_{{SITENAME}}",
        "copyright": "Pod licencom / Под лиценцом: $1.",
-       "copyrightpage": "{{ns:project}}:Autorska_prava",
+       "copyrightpage": "{{ns:project}}:Autorska prava",
        "currentevents": "Trenutni događaji",
        "currentevents-url": "Project:Novosti",
        "disclaimers": "Odricanje od odgovornosti",
index fd6462a..f1e0537 100644 (file)
        "hidden-category-category": "လိူင်ႈ ဢၼ်လပ်ႉသိူင်ႇဝႆႉ",
        "category-subcat-count": "{{PLURAL:$2|ၼႂ်းလိူင်ႈဢၼ်ၼႆႉ မီးၵိင်ႇၽႄလိူင်ႈၼႆႉ ၸိူင်ႉၼႆၵွၺ်း|ၼႂ်းလိူင်ႈၼႆႉ မီး This category has the following {{PLURAL:$1|ၵိင်ႇၽႄလိူင်ႈ|$1 ၵိင်ႇၽႄလိူင်ႈတင်းလၢႆး}}, ၼႂ်းၵႃႊ $2 တင်းသဵင်ႈတင်းမူတ်း}}",
        "category-subcat-count-limited": "ၼႂ်းလိူင်ႈၼႆႉ မီးဝႆႉလိူင်ႈၼင်ႇၼႆ {{PLURAL:$1| ၵိင်ႇၽႄလိူင်ႈ |$1 ၵိင်ႇၽႄလိူင်ႈတင်းလၢႆ}}",
-       "category-article-count": "{{PLURAL:$2| á\80\9cá\80­á\80°á\80\84á\80ºá\82\88á\80¢á\81¼á\80ºá\81¼á\82\86á\82\89 á\80\95á\82\83á\80¸á\80\9dá\82\86á\82\89á\81¼á\82\83á\82\88á\80\9cá\80­á\81µá\80ºá\82\88á\81¼á\80\84á\80ºá\82\87á\80\95á\82\83á\82\88á\80\90á\82\82á\80ºá\82\88á\81¼á\82\86á\82\89á\81µá\80½á\81ºá\80ºá\80¸ |á\80\90á\81¢á\80\84á\80ºá\80¸á\80\95á\82\83á\82\88á\80\90á\82\82á\80ºá\82\88á\81¼á\82\86á\82\89{{PLURAL:$1| á\81¼á\82\83á\82\88á\80\9cá\80­á\81µá\80ºá\82\88 }} á\80\99á\80®á\80¸á\81¼á\82\82á\80ºá\80¸á\80\9cá\80­á\80°á\80\84á\80ºá\82\88á\81¼á\82\86á\82\89 á\81µá\82\83á\82\8aá\81¼á\82\82á\80ºá\80¸ $2 á\80\90á\80\84á\80ºá\80¸á\80\9eá\80µá\80\84á\80ºá\82\88á\80\90á\80\84á\80ºá\80¸á\80\99á\80°á\80\90á\80ºá\80¸}}",
+       "category-article-count": "{{PLURAL:$2| á\80\9cá\80­á\80°á\80\84á\80ºá\82\88á\80¢á\81¼á\80ºá\81¼á\82\86á\82\89 á\80\95á\82\83á\80¸á\80\9dá\82\86á\82\89á\81¼á\82\83á\82\88á\80\9cá\80­á\81µá\80ºá\82\88á\81¼á\80\84á\80ºá\82\87á\80\95á\82\83á\82\88á\80\90á\82\82á\80ºá\82\88á\81¼á\82\86á\82\89á\81µá\80½á\81ºá\80ºá\80¸ |á\81¼á\82\82á\80ºá\80¸á\80\9cá\80­á\80°á\80\84á\80ºá\82\88á\80¢á\81¼á\80ºá\81¼á\82\86á\82\89 {{PLURAL:$1| á\81¼á\82\83á\82\88á\80\9cá\80­á\81µá\80ºá\82\88 }} á\80\90á\80\84á\80ºá\80¸á\80\9eá\80µá\80\84á\80ºá\82\88á\80\90á\80\84á\80ºá\80¸á\80\99á\80°á\80\90á\80ºá\80¸ á\80\99á\80®á\80¸á\80\9dá\82\86á\82\89 $2 á\82\81á\80°á\80\9dá\80º}}á\81\8b",
        "category-article-count-limited": "တၢင်းပႃႈတႂ်ႈၼႆႉ  {{PLURAL:$1| ၼႃႈလိၵ်ႈ }} မီးၼႂ်းလိူင်ႈ တေႃႈလဵဝ်ၼႆႉ",
        "category-file-count": "{{PLURAL:$2| လိူင်ႈဢၼ်ၼႆႉ ပႃးဝႆႉၼႃႈလိၵ်ႈၼင်ႇပႃႈတႂ်ႈၼႆႉၵွၺ်း |တၢင်းပႃႈတႂ်ႈၼႆႉ{{PLURAL:$1| ၾႆႇၼႆႉပဵၼ်|$1 ၾၢႆႇၸိူဝ်းၼႆႉပဵၼ် }} မီးၼႂ်းလိူင်ႈၼႆႉ ၵႃႊၼႂ်း $2 တင်းသဵင်ႈတင်းမူတ်း}}",
        "category-file-count-limited": "ဢၼ်ပဵၼ် {{PLURAL:$1|ၾၢႆႇၼႆႉ|$1 ၾၢႆႇၸိူဝ်းၼႆႉ}} မီးဝႆႉတီႈၼႂ်း တွၼ်ႈၵၼ်ၼႆ့။",
        "login": "လွၵ်ႉဢိၼ်ႇ",
        "login-security": "ၼႄႉၼွၼ်း မၢႆၽၢင်ၸဝ်ႈၵဝ်ႇ",
        "nav-login-createaccount": "လွၵ်ႉဢိၼ်ႇ / သၢင်ႈဢၶွင်ႉ",
-       "userlogin": "လွၵ်ႉဢိၼ်ႇ / သၢင်ႈဢၶွင်ႉ",
-       "userloginnocreate": "လွၵ်ႉဢိၼ်ႇ",
        "logout": "လွၵ်ႉဢွၵ်ႉ",
        "userlogout": "လွၵ်ႉဢွၵ်ႉ",
        "notloggedin": "ဢမ်ႇလႆႈၶဝ်ႈဝႆ့",
        "userlogin-noaccount": "ပႆႇပႃႈမီးဢၶွင်ႉႁႃႉ?",
        "userlogin-joinproject": "ႁူမ်ႈ {{SITENAME}}",
-       "nologin": "ပႆႇပႃႈမီးဢၶွင်ႉႁႃႉ? $1",
-       "nologinlink": "ၵေႃႇသၢင်ႈဢၶွင်ႉ",
        "createaccount": "ႁဵတ်းဢၶွင်ႉ",
-       "gotaccount": "မီးဢၶွင်ႉဝႆႉယဝ်ႉႁႃႉ? $1",
-       "gotaccountlink": "လွၵ်ႉဢိၼ်ႇ",
-       "userlogin-resetlink": "လိုမ်းပႅတ်ႈၵႂႃႇ ႁူဝ်ယွႆႈ လွၵ်ႉဢိၼ်ႉၸဝ်ႈၵဝ်ႇယဝ်ႉႁႃႉ?",
        "userlogin-resetpassword-link": "လိုမ်းၵႂႃႇ ၶေႃႈလပ်ႉၸဝ်ႈၵဝ်ႇႁႃႉ?",
        "userlogin-helplink2": "ၸွႆႈထႅမ်တင်း ၶဝ်ႈလွၵ်ႉဢိၼ်ႇ",
        "userlogin-loggedin": "​ၸဝ်ႈၵဝ်ႇပေႃး ၶဝ်ႈၸႂ်ႉဝႆႉ ၼင်ႇ{{GENDER:$1|$1}} ယဝ်ႈ။\nၸႂ်ႉပၼ် လၢႆးၼင်ႇပႃႈတႂ်ႈၼႆႉသေ လွၵ်ႉဢိၼ်ႇၼင်ႇ ၽူႈၸႂ်ႉတိုဝ်းတၢင်ႇၵေႃႉ",
        "createaccountmail": "ၸႂ်ႉပၼ် ၶေႃႈလပ်ႉၸူဝ်ႈၵႅပ်ႉ သူင်ႇၼၼ်ႉၵႂႃႇၸူး ႁဵင်းလိၵ်ႈဢီးမေးလ် ဢၼ်မၵ်းမၼ်ႈဝႆႉ ပၼ်ၼၼ်ႉ။",
        "createaccountmail-help": "ပေႃးဢမ်ႇမီး လွင်ႈလဵပ်ႈႁဵၼ်း ၶေႃႈလပ်ႉၼႆ တေဢမ်ႇၸၢင်ႈဢဝ်ၸႂ်ႉ တႃႇတေၵေႃႇတင်ႈ ဢၶွင်ႉတွၼ်ႈတႃႇ ၵူၼ်းတၢင်ႇၵေႃႉ။",
        "createacct-realname": "ၸိုဝ်ႈတႄႉတႄႉ (ဢဝ်ၸႂ်ဝႃႈ)",
-       "createaccountreason": "လွင်ႈတၢင်း :",
        "createacct-reason": "လွင်ႈတၢင်း :",
        "createacct-reason-ph": "ယွၼ်ႉပိူဝ်ႈသင်လႄႈ ၸဝ်ႈၵဝ်ႇ ၵေႃႇသၢင်ႈဢၶွင်ႉတၢင်ႇဢၼ်",
        "createacct-reason-help": "ၶေႃႈၶၢဝ်ႇၼႄဝႆႉ ၵႃႈတီႈၼႂ်း သဵၼ်ႈ​မၢႆၵေႃႇသၢင်ႈ ဢၶွင်ႉ",
        "rcfilters-filter-editsbyother-label": "ဢၼ်တၢင်ႇၵေႃႉ ၵေႃႉထတ်း",
        "rcfilters-filter-editsbyother-description": "ၵၢၼ်မႄးထတ်း ဢၼ်ၽူႈၸႂ်ႉတိုဝ်း တၢင်ႇၸိူဝ်း ၵေႃသၢင်ႈဝႆႉ (ဢၼ်ဢမ်ႇၸႂ်ႈ ၸဝ်ႈၵဝ်ႇ)",
        "rcfilters-filtergroup-userExpLevel": "ၸၼ်ႉထၢၼ်ႈ တူဝ်ထူပ်း (တွၼ်ႈတႃႈ ၽူႈၸႂ်ႉတိုဝ်း ၸိူဝ်းတၢင်ႇဝႆႉ မႆၽၢင်ၵူၺ်း)",
-       "rcfilters-filter-userExpLevel-newcomer-label": "ၵူၼ်းၼႃႈမႂ်ႇ",
-       "rcfilters-filter-userExpLevel-newcomer-description": "ဢေႇလိူဝ် ၵၢၼ်မႄးထတ်း ႑႐ ဢၼ် လႄႈ လွင်ႈတူင်ႉၼိုင် တႃႇသီႇဝၼ်း",
-       "rcfilters-filter-userExpLevel-learner-label": "ၽူႈလဵပ်ႈႁဵၼ်း",
-       "rcfilters-filter-userExpLevel-learner-description": "ၵၢၼ်တူင်ႉၼိုင်လႄႈ ၵၢၼ်မႄးထတ်း ဝၼ်းမၼ်း ၼမ်လိူဝ်သေ \"ၵူၼ်းၼႃႈမႂ်ႇ\"သေတႃႉ ဝၼ်းမၼ်းတိုၵ်ႉဢေႇလိူဝ်သေ \"ၽူႈၸႂ်ႉတိုဝ်း ၸိူဝ်းမီးတူဝ်ထူပ်း\"။",
-       "rcfilters-filter-userExpLevel-experienced-label": "ၽူႈၸႂ်ႉတိုဝ်း ၸိူဝ်းမီးတူဝ်ထူပ်း",
-       "rcfilters-filter-userExpLevel-experienced-description": "လွင်ႈတူင်ႉၼိုင် ၼမ်လိူဝ် ႓႐ ဝၼ်း လႄႈ လွင်ႈမႄးထတ်း ႕႐႐ ။",
+       "rcfilters-filter-user-experience-level-newcomer-label": "ၵူၼ်းၼႃႈမႂ်ႇ",
+       "rcfilters-filter-user-experience-level-newcomer-description": "ဢေႇလိူဝ် ၵၢၼ်မႄးထတ်း ႑႐ ဢၼ် လႄႈ လွင်ႈတူင်ႉၼိုင် တႃႇသီႇဝၼ်း",
+       "rcfilters-filter-user-experience-level-learner-label": "ၽူႈလဵပ်ႈႁဵၼ်း",
+       "rcfilters-filter-user-experience-level-learner-description": "ၵၢၼ်တူင်ႉၼိုင်လႄႈ ၵၢၼ်မႄးထတ်း ဝၼ်းမၼ်း ၼမ်လိူဝ်သေ \"ၵူၼ်းၼႃႈမႂ်ႇ\"သေတႃႉ ဝၼ်းမၼ်းတိုၵ်ႉဢေႇလိူဝ်သေ \"ၽူႈၸႂ်ႉတိုဝ်း ၸိူဝ်းမီးတူဝ်ထူပ်း\"။",
+       "rcfilters-filter-user-experience-level-experienced-label": "ၽူႈၸႂ်ႉတိုဝ်း ၸိူဝ်းမီးတူဝ်ထူပ်း",
+       "rcfilters-filter-user-experience-level-experienced-description": "လွင်ႈတူင်ႉၼိုင် ၼမ်လိူဝ် ႓႐ ဝၼ်း လႄႈ လွင်ႈမႄးထတ်း ႕႐႐ ။",
        "rcfilters-filtergroup-automated": "ၶဝ်ႈႁူမ်ႈႁင်းၵႂႃႇႁင်းမၼ်း",
        "rcfilters-filter-bots-label": "ပွတ်ႉ",
        "rcfilters-filter-bots-description": "ၶိူင်ႈႁဵတ်းႁင်းၶေႃ ၵေႃႉႁဵတ်းသၢင်ႈဝႆႉ လွင်ႈမႄးထတ်း",
index 45d4c54..2da5182 100644 (file)
        "accmailtitle": "Heslo bolo odoslané.",
        "accmailtext": "Náhodne vytvorené heslo pre používateľa [[User talk:$1|$1]] bolo poslané na $2. Je možné ho zmeniť na stránke ''[[Special:ChangePassword|zmena hesla]]'' po prihlásení.",
        "newarticle": "(Nový)",
-       "newarticletext": "Sledovali ste odkaz na stránku, ktorá zatiaľ neexistuje.\nStránku vytvoríte tak, že začnete písať do poľa nižšie (viac informácií nájdete na stránkach [$1 nápovedy]).\nAk ste sa sem dostali nechtiac, kliknite na tlačidlo <strong>späť</strong> vo svojom prehliadači.",
+       "newarticletext": "Nasledovali ste odkaz, vedúci na stránku, ktorá zatiaľ neexistuje.\nStránku vytvoríte tak, že začnete písať do políčka nižšie (viac informácií nájdete na stránkach [$1 nápovedy]).\nAk ste sa sem dostali nechtiac, kliknite na tlačidlo <strong>späť</strong> vo svojom prehliadači.",
        "anontalkpagetext": "----\n<em>Toto je diskusná stránka anonymného používateľa, ktorý nemá vytvorené svoje konto alebo ho nepoužíva.</em>\nPreto musíme na jeho identifikáciu použiť numerickú IP adresu. Je možné, že takúto IP adresu používajú viacerí používatelia.\nAk ste anonymný používateľ a máte pocit, že vám boli adresované irelevantné diskusné príspevky, [[Special:CreateAccount|vytvorte si konto]] alebo sa [[Special:UserLogin|prihláste]], aby sa zamedzilo budúcim zámenám s inými anonymnými používateľmi.",
        "noarticletext": "Na tejto stránke sa momentálne nenachádza žiadny text.\nMôžete [[Special:Search/{{PAGENAME}}|vyhľadávať názov tejto stránky]] v obsahu iných stránok,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} vyhľadávať v súvisiacich záznamoch] alebo [{{fullurl:{{FULLPAGENAME}}|action=edit}} vytvoriť túto stránku]</span>.",
        "noarticletext-nopermission": "Táto stránka momentálne neobsahuje žiadny text.\nMôžete [[Special:Search/{{PAGENAME}}|hľadať názov tejto stránky]] v texte iných stránok\nalebo <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} hľadať v súvisiacich záznamoch]</span>, ale nemáte oprávnenie túto stránku vytvoriť.",
        "trackingcategories-msg": "Sledovacia kategória",
        "trackingcategories-name": "Názov správy",
        "trackingcategories-desc": "Kritériá pre zaradenie do kategórie",
+       "restricted-displaytitle-ignored": "Stránky s ignorovanými zobrazovanými názvami",
        "noindex-category-desc": "Stránka nie je indexovaná robotmi, pretože obsahuje magické slovo <code><nowiki>__NOINDEX__</nowiki></code> a je v mennom priestore, v ktorom je tento príznak povolený.",
        "index-category-desc": "Stránka obsahuje magické slovo <code><nowiki>__INDEX__</nowiki></code> (a je v mennom prostore, v ktorom je tento príznak povolený), takže je indexovaná robotmi, hoci by normálne nebola.",
        "post-expand-template-inclusion-category-desc": "Stránka je po rozbalení všetkých šablón väčšia než <code>$wgMaxArticleSize</code>, takže niektoré šablóny nemohli byť rozbalené.",
index 89560de..61c06bd 100644 (file)
        "post-expand-template-argument-warning": "'''Opozorilo:'''' Ta stran vsebuje vsaj en argument predloge, ki ima preveliko razširitev.\nNaslednji argumenti so bili izpuščeni.",
        "post-expand-template-argument-category": "Strani z izpuščenimi argumenti predloge",
        "parser-template-loop-warning": "V predlogi je bila odkrita zanka: [[$1]]",
+       "template-loop-category": "Strani z zankami predlog",
+       "template-loop-category-desc": "Stran vsebuje zanko predloge, tj. predlogo, ki rekurzivno kliče sama sebe.",
        "parser-template-recursion-depth-warning": "Prekoračena globina rekurzije predlog ($1)",
        "language-converter-depth-warning": "Prekoračena globina pretvorbe jezikov ($1)",
        "node-count-exceeded-category": "Strani s prekoračenim številom vozlišč",
        "page_first": "prva",
        "page_last": "zadnja",
        "histlegend": "Izbira primerjave: označite okroglo polje ob redakciji za primerjavo in stisnite enter ali gumb na dnu strani.<br />\nLegenda: '''({{int:cur}})''' = primerjava s trenutno redakcijo, '''({{int:last}})''' = primerjava s prejšnjo redakcijo, '''{{int:minoreditletter}}''' = manjše urejanje.",
-       "history-fieldset-title": "Zgodovina poizvedovanj",
+       "history-fieldset-title": "Iskanje redakcij",
        "history-show-deleted": "Samo izbrisana redakcija",
        "histfirst": "najstarejše",
        "histlast": "najnovejše",
        "saveusergroups": "Shrani {{GENDER:$1|uporabnikove|uporabničine}} skupine",
        "userrights-groupsmember": "Član skupine:",
        "userrights-groupsmember-auto": "Posreden član:",
-       "userrights-groups-help": "Spreminjate lahko skupine uporabnika:\n* Obkljukano polje pomeni uporabnika, ki je v skupini\n* Odkljukano polje pomeni uporabnika, ki ni v skupini\n* Zvezdica (*) kaže, da uporabnika ne boste mogli odstraniti iz skupine, ko ga vanjo dodate oz. obratno.\n* Lojtra (#) kaže, da lahko čas poteka te skupine postavite samo nazaj; ne morete ga postaviti naprej.",
+       "userrights-groups-help": "Spreminjate lahko skupine uporabnika:\n* Obkljukano polje pomeni uporabnika, ki je v skupini\n* Odkljukano polje pomeni uporabnika, ki ni v skupini\n* Zvezdica (*) kaže, da uporabnika ne boste mogli odstraniti iz skupine, ko ga vanjo dodate oz. obratno.\n* Lojtra (#) kaže, da lahko čas poteka članstva v tej skupine postavite samo nazaj; ne morete ga postaviti naprej.",
        "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-expiry-options": "1 dan:1 day,1 teden:1 week,1 mesec:1 month,3 mesece:3 months,6 mesecev:6 months,1 leto:1 year",
        "userrights-invalid-expiry": "Čas poteka skupine »$1« ni veljaven.",
        "userrights-expiry-in-past": "Čas poteka skupine »$1« je v preteklosti.",
-       "userrights-cannot-shorten-expiry": "Časa poteka skupine »$1« ne morete prestaviti naprej. Samo uporabniki z dovoljenjem za dodajanje ali odstranitev te supine lahko prestavijo čase poteka naprej.",
+       "userrights-cannot-shorten-expiry": "Časa poteka članstva v skupini »$1« ne morete prestaviti naprej. Samo uporabniki z dovoljenjem za dodajanje ali odstranitev te skupine lahko prestavijo čase poteka naprej.",
        "userrights-conflict": "Spor sprememb uporabniških pravic! Prosimo, da pregledate in potrdite svoje spremembe.",
        "group": "Skupina:",
        "group-user": "Uporabniki",
        "recentchanges": "Zadnje spremembe",
        "recentchanges-legend": "Možnosti zadnjih sprememb",
        "recentchanges-summary": "Na tej strani lahko spremljate najnovejše spremembe wikija.",
-       "recentchanges-noresult": "V podanem obdobju nobena sprememba ne ustreza tem merilom.",
+       "recentchanges-noresult": "V danem obdobju nobena sprememba ne ustreza tem merilom.",
        "recentchanges-feed-description": "Spremljajte zadnje spremembe wikija prek tega vira.",
        "recentchanges-label-newpage": "To urejanje je ustvarilo novo stran",
        "recentchanges-label-minor": "To je manjše urejanje",
        "rcfilters-invalid-filter": "Neveljaven filter",
        "rcfilters-empty-filter": "Ni dejavnih filtrov. Prikazani so vsi prispevki.",
        "rcfilters-filterlist-title": "Filtri",
+       "rcfilters-filterlist-whatsthis": "Kaj je to?",
        "rcfilters-filterlist-feedbacklink": "Podajte povratne informacije o novih (preizkusnih) filtrih",
        "rcfilters-highlightbutton-title": "Označi rezultate",
        "rcfilters-highlightmenu-title": "Izberite barvo",
        "rcfilters-highlightmenu-help": "Izberite barvo za označitev te lastnosti",
        "rcfilters-filterlist-noresults": "Nismo našli nobenega filtra",
+       "rcfilters-noresults-conflict": "Našli nismo nobenih rezultatov, ker si merila za iskanje nasprotujejo",
+       "rcfilters-state-message-subset": "Ta filter nima učinka, saj njegove rezultate {{PLURAL:$2|vključuje naslednji, širši filter|vključujeta naslednja, širša filtra|vključujejo naslednji, širši filtri}} (označite jih, da razlikujete med njimi): $1",
+       "rcfilters-state-message-fullcoverage": "Izbira vseh filtrov v skupini je enako kot izbira nobenega, zato ta filter nima učinka. Skupina vključuje: $1",
        "rcfilters-filtergroup-registration": "Registracija uporabnika",
        "rcfilters-filter-registered-label": "Registriran",
        "rcfilters-filter-registered-description": "Prijavljeni uredniki.",
        "rcfilters-filter-unregistered-label": "Neregistriran",
        "rcfilters-filter-unregistered-description": "Uredniki, ki niso prijavljeni.",
-       "rcfilters-filter-unregistered-conflicts-user-experience-level": "Filter »Neregistrirani« ni dejaven, saj njegov učinek {{PLURAL:$2|izniči naslednji filter|izničita naslednja filtra|izničijo naslednji filtri}} Izkušnje, ki {{PLURAL:$2|najde|najdeta|najdejo}} samo registrirane uporabnike: $1",
+       "rcfilters-filter-unregistered-conflicts-user-experience-level": "Filter je v sporu z {{PLURAL:$2|naslednjim filtrom|naslednjima filtroma|naslednjimi filtri}} Izkušnje, ki {{PLURAL:$2|najde|najdeta|najdejo}} samo registrirane uporabnike: $1",
        "rcfilters-filtergroup-authorship": "Uredi avtorstvo",
        "rcfilters-filter-editsbyself-label": "Vaša lastna urejanja",
        "rcfilters-filter-editsbyself-description": "Vaša urejanja.",
        "rcfilters-filter-editsbyother-label": "Urejanja drugih",
        "rcfilters-filter-editsbyother-description": "Urejanja, ki so jih naredili drugi uporabniki (ne vi).",
        "rcfilters-filtergroup-userExpLevel": "Stopnja izkušenosti (samo za registrirane uporabnike)",
-       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "Filter ni dejaven, saj najde samo registrirane uporabnike in zato filter »Neregistrirani« izniči njegov učinek.",
-       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "Filter »Neregistrirani« je v sporu z enim ali več filtrov Izkušnje. Filtri Izkušnje najdejo samo registrirane uporabnike. Filtri v sporu so zgoraj označeni kot nedejavni.",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "Napredni filtri najdejo samo registrirane uporabnike, zato je ta filter v sporu s filtrom »Neregistrirani«.",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "Filter »Neregistrirani« je v sporu z enim ali več filtri Izkušnje, ki najdejo samo registrirane uporabnike. Filtri v sporu so označeni zgoraj, v območju Dejavni filtri.",
        "rcfilters-filter-user-experience-level-newcomer-label": "Novinci",
        "rcfilters-filter-user-experience-level-newcomer-description": "Manj kot 10 urejanj in 4 dni dejavnosti.",
        "rcfilters-filter-user-experience-level-learner-label": "Učenci",
        "rcfilters-filter-categorization-description": "Zapisi o straneh, ki so bila dodana ali odstranjena iz kategorij.",
        "rcfilters-filter-logactions-label": "Zabeležena dejanja",
        "rcfilters-filter-logactions-description": "Administrativna dejanja, ustvarjanja računov, izbrisi strani, nalaganja ...",
+       "rcfilters-hideminor-conflicts-typeofchange-global": "Filter »Manjša urejanja« je v sporu z enim ali več filtri Vrsta spremembe, ker nekaterih vrst urejanj ni možno označiti kot »manjša«. Filtri v sporu so označeni v območju Dejavni filtri zgoraj.",
+       "rcfilters-hideminor-conflicts-typeofchange": "Nekaterih vrst sprememb ni možno označiti kot »manjše«, zato je ta filter v sporu z naslednjimi filtri Vrsta spremembe: $1",
+       "rcfilters-typeofchange-conflicts-hideminor": "Ta filter Vrsta spremembe je v sporu s filtrom »Manjše urejanje«. Nekaterih vrst sprememb ni možno označiti kot »manjše«.",
        "rcnotefrom": "{{PLURAL:$5|Navedena je sprememba|Navedeni sta spremembi|Navedene so spremembe}} od <strong>$3 $4</strong> dalje (prikazujem jih do <strong>$1</strong>).",
+       "rclistfromreset": "Ponastavi izbiro datuma",
        "rclistfrom": "Prikaži spremembe od $3 $2 naprej",
        "rcshowhideminor": "$1 manjša urejanja",
        "rcshowhideminor-show": "Prikaži",
        "php-uploaddisabledtext": "Nalaganje datotek je onemogočeno v PHP.\nProsimo preverite file_uploads nastavitev.",
        "uploadscripted": "Datoteka vsebuje HTML- ali skriptno kodo, ki bi jo lahko brskalnik razlagal napačno.",
        "upload-scripted-pi-callback": "Ne moremo naložiti datoteke, ki vsebuje navodila za slogovno obdelavo XML.",
+       "upload-scripted-dtd": "Ne morete naložiti datotek SVG, ki vsebujejo nestandardno najavo DTD.",
        "uploaded-script-svg": "V naloženi datoteki SVG smo našli skriptni element »$1«.",
        "uploaded-hostile-svg": "V slogovnem elementu naložene datoteke SVG smo našli nevaren CSS.",
        "uploaded-event-handler-on-svg": "Določevanje atributov za dogodke <code>$1=\"$2\"</code> v datotekah SVG ni dovoljeno.",
        "undeleteviewlink": "ogled",
        "undeleteinvert": "Obrni izbor",
        "undeletecomment": "Razlog:",
-       "undeletedrevisions": "{{PLURAL:$1|obnovljena $1 redakcija|obnovljeni $1 redakciji|obnovljene $1 redakcije|obnovljenih $1 redakcij}}",
-       "undeletedrevisions-files": "$1 {{PLURAL:$1|redakcija|redakciji|redakcije|redakcij}} in $2 {{PLURAL:$2|datoteka|datoteki|datoteke|datotek}} {{PLURAL:$1+$2|obnovljena|obnovljeni|obnovljene|obnovljenih}}",
-       "undeletedfiles": "{{PLURAL:$1|obnovljena je $1 datoteka|obnovljeni sta $1 datoteki|obnovljene so $1 datoteke|obnovljenih je $1 datotek}}",
        "cannotundelete": "Nekatere ali vse obnove so spodletele:\n$1",
        "undeletedpage": "'''Obnovili ste stran $1.'''\n\nNedavna brisanja in obnove so zapisani v [[Special:Log/delete|dnevniku brisanja]].",
        "undelete-header": "Glej [[Special:Log/delete|dnevnik brisanja]] za nedavno izbrisane strani.",
        "newimages-summary": "Ta posebna stran prikazuje najnovejše naložene datoteke.",
        "newimages-legend": "Filter",
        "newimages-label": "Ime datoteke (ali njen del):",
+       "newimages-user": "IP-naslov ali uporabniško ime",
        "newimages-showbots": "Prikaži nalaganja botov",
        "newimages-hidepatrolled": "Skrij nadzorovana nalaganja",
        "noimages": "Nič ni videti.",
        "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-restore": "$1 je {{GENDER:$2|obnovil|obnovila|obnovil(-a)}} stran $3 ($4)",
+       "logentry-delete-restore-nocount": "$1 je {{GENDER:$2|obnovil|obnovila|obnovil(-a)}} stran $3",
+       "restore-count-revisions": "$1 {{PLURAL:$1|redakcija|redakciji|redakcije|redakcij}}",
+       "restore-count-files": "$1 {{PLURAL:$1|datoteka|datoteki|datoteke|datotek}}",
        "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",
        "logentry-delete-event-legacy": "$1 je {{GENDER:$2|spremenil|spremenila|spremenil(-a)}} vidljivost dnevniških dogodkov na $3",
        "special-characters-group-thai": "Tajski",
        "special-characters-group-lao": "Laoški",
        "special-characters-group-khmer": "Kmerski",
+       "special-characters-group-canadianaboriginal": "Kanadsko aboridžinsko",
        "special-characters-title-endash": "navaden pomišljaj",
        "special-characters-title-emdash": "dolgi pomišljaj",
        "special-characters-title-minus": "znak za minus",
        "restrictionsfield-label": "Dovoljeni IP-obsegi:",
        "restrictionsfield-help": "En IP-naslov ali CIDR-območje na vrstico. Da omogočite vse, uporabite:\n<pre>0.0.0.0/0\n::/0</pre>",
        "revid": "redakcija $1",
-       "pageid": "ID strani $1"
+       "pageid": "ID strani $1",
+       "rawhtml-notallowed": "Oznak &lt;html&gt; ni možno uporabljati izven normalnih strani.",
+       "gotointerwiki": "Zapuščate {{GRAMMAR:tožilnik|{{SITENAME}}}}",
+       "gotointerwiki-invalid": "Naveden naslov je neveljaven.",
+       "gotointerwiki-external": "Zapuščate {{GRAMMAR:tožilnik|{{SITENAME}}}}, da obiščete [[$2]], ki je ločena spletna stran.\n\n[$1 Kliknite tukaj, da nadaljujete na $1].",
+       "undelete-cantedit": "Strani ne morete obnoviti, saj vam ni dovoljeno, da jo urejate.",
+       "undelete-cantcreate": "Strani ne morete obnoviti, saj stran s tem imenom ne obstaja in je nimate dovoljenja ustvariti."
 }
index 9268049..08a1a82 100644 (file)
@@ -31,7 +31,8 @@
                        "Liridon",
                        "Ammartivari",
                        "Kosovastar",
-                       "Matma Rex"
+                       "Matma Rex",
+                       "Arianit"
                ]
        },
        "tog-underline": "Nënvizimi i lidhjes:",
@@ -75,7 +76,7 @@
        "tog-diffonly": "Mos trego përmbajtjen e faqes nën diff-e",
        "tog-showhiddencats": "Trego kategoritë e fshehura",
        "tog-norollbackdiff": "Mos trego ndrysh pas kryerjes së një rikthkimi",
-       "tog-useeditwarning": "Më paralajmëro kur unë lë një redaktim faqeje me ndryshime të paruajtura",
+       "tog-useeditwarning": "Më paralajmëro kur lë një redaktim faqeje me ndryshime të paruajtura",
        "tog-prefershttps": "Gjithmonë përdorni një lidhje të sigurt kur të kyçur",
        "underline-always": "Gjithmonë",
        "underline-never": "Asnjëherë",
        "mypreferencesprotected": "Ti nuk ke leje për të ndryshuar preferencat e tua.",
        "ns-specialprotected": "Faqet speciale nuk mund të redaktohen.",
        "titleprotected": "Ky titull është mbrojtur nga [[User:$1|$1]] dhe nuk mund të krijohet.\nArsyeja e dhënë është <em>$2</em>.",
-       "filereadonlyerror": "Nuk është në gjendje që të ndryshojë skedarin \"$1\" sepse depoja e skedarit \"$2\" është në formën vetëm-lexim.\n\nAdministratori i cili e mbylli atë e dha këtë shpjegim: \"$3\".",
+       "filereadonlyerror": "Nuk është në gjendje që të ndryshojë skedarin \"$1\" sepse depoja e skedarit \"$2\" është në formën vetëm-lexim.\n\nAdministratori sistemit i cili e mbylli atë e dha këtë shpjegim: \"$3\".",
        "invalidtitle-knownnamespace": "Titull jo i vlefshëm me hapësirën \"$2\" dhe teksti \"$3\"",
        "invalidtitle-unknownnamespace": "Titull jo i vlefshëm me numrin e panjohur të hapësirës së emrit $1 dhe tekstit \"$2\"",
        "exception-nologin": "I paqasur",
        "login": "Hyni",
        "login-security": "Verifiko identitetin tuaj",
        "nav-login-createaccount": "Hyni ose hapni një llogari",
-       "userlogin": "Hyni / hapni llogari",
-       "userloginnocreate": "Hyni",
        "logout": "Dalje",
        "userlogout": "Dalje",
        "notloggedin": "Nuk keni hyrë brenda",
        "userlogin-noaccount": "Nuk keni një llogari?",
        "userlogin-joinproject": "Bashkohu me ne në {{SITENAME}}",
-       "nologin": "Nuk keni një llogari? '''$1'''.",
-       "nologinlink": "Hapeni",
        "createaccount": "Hap një llogari",
-       "gotaccount": "Keni një llogari? '''$1'''.",
-       "gotaccountlink": "Identifikohuni",
-       "userlogin-resetlink": "Ke harruar të dhënat e tua të identifikimit?",
        "userlogin-resetpassword-link": "Keni harruar fjalëkalimin?",
        "userlogin-helplink2": "Ndihmë rreth identifikimit",
        "userlogin-loggedin": "Ju tashmë jeni i regjistruar si {{GENDER:$1|$1}}.\nPërdore formularin më poshtë për të hyrë si një përdorues tjetër.",
        "createacct-another-email-ph": "Vendos adresën e postës elektronike",
        "createaccountmail": "Përdorni një fjalëkalim të përkohshëm të rastit dhe  dërgojeni atë në adresën e specifikuar te email",
        "createacct-realname": "Emri i vërtetë (me dëshirë)",
-       "createaccountreason": "Arsyeja:",
        "createacct-reason": "Arsyeja",
        "createacct-reason-ph": "Pse ju jeni duke krijuar një llogari tjetër",
        "createacct-submit": "Krijoni llogarinë tuaj",
        "createacct-another-submit": "Krijo një llogari",
+       "createacct-continue-submit": "Vazhdo krijimin e llogarisë",
+       "createacct-another-continue-submit": "Vazhdo krijimin e llogarisë",
        "createacct-benefit-heading": "{{SITENAME}} është bërë nga njerëz si ju.",
        "createacct-benefit-body1": "{{PLURAL:$1|redaktim|redaktime}}",
        "createacct-benefit-body2": "{{PLURAL:$1|faqe|faqe}}",
        "wrongpasswordempty": "Fjalëkalimi juaj ishte bosh. Ju lutemi provoni përsëri.",
        "passwordtooshort": "Fjalëkalimi juaj është i pavlefshëm ose tepër i shkurtër. Ai duhet të ketë së paku {{PLURAL:$1|1 shkronjë|$1 shkronja}} dhe duhet të jetë i ndryshëm nga emri i përdoruesit.",
        "passwordtoolong": "Fjalëkalimet nuk mund të jenë më të gjatë se {{PLURAL:$1|1 karakter|$1 karaktere}}.",
+       "passwordtoopopular": "Fjalëkalimet e zgjedhura rregullisht nuk mund të përdorën. Ju lutemi zgjedhni një fjalëkalim më unik.",
        "password-name-match": "Fjalëkalimi juaj duhet të jetë i ndryshëm nga emri juaj.",
        "password-login-forbidden": "Përdorimi i kësaj nofke dhe fjalëkalimi është i ndaluar.",
        "mailmypassword": "Ridergo fjalekalimin",
        "noemail": "Regjistri nuk ka adresë për përdoruesin \"$1\".",
        "noemailcreate": "Ju duhet të sigurojë një adresë e e-mailit të saktë.",
        "passwordsent": "Një fjalëkalim i ri është dërguar tek adresa e regjistruar për \"$1\". Provojeni përsëri hyrjen mbasi ta keni marrë fjalëkalimin.",
-       "blocked-mailpassword": "IP adresa juaj është bllokuar , si e tillë nuk lejohet të përdor funksionin pë rikthim të fjalkalimit , në mënyrë që të parandalohet abuzimi.",
+       "blocked-mailpassword": "Adresa IP e juaj është bllokuar për redaktim. Për të parandaluar abuzimin, nuk lejohet të përdoret funksioni pë rikthim të fjalëkalimit nga kjo adresë IP.",
        "eauthentsent": "Një email konfirmimi është dërguar në adresën e caktuar  të e-mailit.\nParase te dergohen emaile të tjerë  në llogarinë tuaj, duhet të ndiqni udhëzimet në email, për të konfirmuar se llogaria është  vërtetë e juaja.",
        "throttled-mailpassword": "Një kujtesë e fjalëkalimit është dërguar gjatë {{PLURAL:$1|orës|$1 orëve}} të kaluara. Për t'u mbrojtur nga abuzime vetëm një kujtesë dërgohet çdo {{PLURAL:$1|orë|$1 orë}}.",
        "mailerror": "Gabim duke dërguar postën: $1",
-       "acct_creation_throttle_hit": "Nuk lejoheni të krijoni më llogari pasi keni krijuar {{PLURAL:$1|1|$1}}.",
+       "acct_creation_throttle_hit": "Vizitorët në këtë wiki duke përdorur adresën tuaj IP kanë krijuar {{PLURAL:$1|1 llogari|$1 llogari}} në $2 e fundit, që është maksimumi i lejuar në këtë periudhë kohore.\nSi rezultat, vizitorët duke përdorur këtë adresë IP nuk mund të krijojnë llogari tjetër në këtë moment.",
        "emailauthenticated": "Adresa juaj është vërtetuar më $2 $3.",
        "emailnotauthenticated": "Adresa juaj email nuk është  konfirmuar ende.\nAsnjë email nuk do të dërgohet për ndonjë nga karakteristikat e mëposhtme.",
        "noemailprefs": "Detyrohet një adresë email-i për të përdorur këtë mjet.",
        "createaccount-title": "Hapja e llogarive për {{SITENAME}}",
        "createaccount-text": "Dikush ka përdorur adresën tuaj për të hapur një llogari tek {{SITENAME}} ($4) të quajtur \"$2\" me fjalëkalimin \"$3\".\nDuhet të hyni brenda dhe të ndërroni fjalëkalimin tani nëse ky person jeni ju. Përndryshe shpërfilleni këtë mesazh.",
        "login-throttled": "Keni bërë shumë tentime të njëpasnjëshme në fjalëkalimin e kësaj llogarie. Ju lutemi prisni para se te tentoni përsëri.",
-       "login-abort-generic": "login juaj ishte i pasuksesshëm - Ndërpre",
+       "login-abort-generic": "Regjistrimi juaj ishte i pasuksesshëm - U ndërpre",
        "login-migrated-generic": "Llogaria juaj ka emigruar, dhe emri juaj nuk ekzistojnë më në këtë wiki.",
        "loginlanguagelabel": "Gjuha: $1",
        "suspicious-userlogout": "Kërkesa juaj për të shkëputet u mohua sepse duket sikur është dërguar nga një shfletues të thyer ose caching proxy.",
        "botpasswords-label-cancel": "Anulo",
        "botpasswords-label-delete": "Fshi",
        "botpasswords-label-resetpassword": "Rivendos fjalëkalimin",
+       "botpasswords-label-grants-column": "Lejuar",
        "botpasswords-update-failed": "Dështoi për të përditësuar emrin e bot \"$1\". Ishte fshirë?",
        "resetpass_forbidden": "Fjalëkalimet nuk mund të ndryshohen",
+       "resetpass_forbidden-reason": "Nuk mund të ndërrohet fjalëkalimi: $1",
        "resetpass-no-info": "Duhet të jeni i kyçur që të keni qasje direkte në këtë faqe.",
        "resetpass-submit-loggedin": "Ndrysho fjalëkalimin",
        "resetpass-submit-cancel": "Anulo",
-       "resetpass-wrong-oldpass": "Fjalëkalimi momental ose i përkohshëm nuk është i vlefshëm. Ndoshta tanimë me sukses keni ndërruar fjalëkalimin, ose keni kërkuar fjalëkalim të përkohshëm.",
+       "resetpass-wrong-oldpass": "Fjalëkalimi momental ose i përkohshëm nuk është i vlefshëm. \nNdoshta tanimë me sukses keni ndërruar fjalëkalimin, ose keni kërkuar fjalëkalim të përkohshëm.",
        "resetpass-recycled": "Ju lutemi rivendosni fjalëkalimin tuaj për diçka tjetër përveç fjalëkalimin tuaj të tanishme.",
        "resetpass-temp-emailed": "Ju keni hyrë në me një koditë përkohshme të dërguar me email .\nPër të përfundojë logging in, ju duhet të vendosni një fjalëkalim të ri këtu:",
        "resetpass-temp-password": "Fjalëkalimi i përkohshëm:",
        "resetpass-abort-generic": "Ndryshimi i fjalëkalimi  dështoi nga një zgjerim.",
        "resetpass-expired": "Fjalëkalimin tuaj ka skaduar. Ju lutem vendosni një fjalëkalim të ri për të hyr.",
        "resetpass-expired-soft": "Fjalëkalimi juaj ka skaduar dhe duhet të rivendoset. Ju lutem zgjidhni një fjalëkalim të ri tani, ose klikoni \"{{int:authprovider-resetpass-skip-label}}\" për ta rivendosur më vonë.",
-       "resetpass-validity-soft": "Fjalëkalimi juaj ka skaduar dhe duhet të rivendoset. Ju lutem zgjidhni një fjalëkalim të ri tani, ose klikoni \"{{int:authprovider-resetpass-skip-label}}\" për ta rivendosur më vonë.",
+       "resetpass-validity-soft": "Fjalëkalimi juaj ka skaduar:$1\n\nJu lutem zgjidhni një fjalëkalim të ri tani, ose klikoni \"{{int:authprovider-resetpass-skip-label}}\" për ta rivendosur më vonë.",
        "passwordreset": "Ndrysho fjalkalimin",
        "passwordreset-text-one": "Plotësoni këtë formular për të marrë një fjalëkalim të përkohshëm nëpërmjet postës elektronike.",
        "passwordreset-text-many": "{{PLURAL:$1|Mbush një nga fushat për të marrë një fjalëkalim të përkohshëm nëpërmjet postës elektronike.}}",
        "passwordreset-emailtext-user": "Përdoruesi  $1 në {{SITENAME }} ka kërkuar një kujtesë për të dhënat e llogarisë suaj për {{SITENAME }} ($4). Përdoruesi në vijim {{PLURAL:$3 | llogaria është | llogaritë janë}} të lidhur me këtë postë elektronike: \n\n$2\n\n{{PLURAL:$3 | Ky fjalëkalim i përkohshëm | Këto fjalëkalime të përkohshme}} do të përfundojë në {{PLURAL:$5 | një ditë | $5 ditë}}.\nJu duhet të kyçeni dhe të zgjidhni një fjalëkalim të ri tani. Nëse dikush tjetër e ka bërë këtë kërkesës, ose në qoftë se ju mbani mend fjalëkalimin tuaj origjinal, dhe ju nuk dëshirojni të ndryshoni atë, ju mund të injoroni këtë mesazh dhe do të vazhdoni përdorimin e fjalëkalimit tuaj të vjetër.",
        "passwordreset-emailelement": "Emri i përdoruesit: \n$1\n\nFjalëkalimi i përkohshëm: \n$2",
        "passwordreset-emailsentemail": "Nëse kjo është një adresë emaili e regjistruar për llogarinë tuaj, atëherë një email për rivendosjen e fjalëkalimit do të dërgohet.",
+       "passwordreset-emailsentusername": "Nëse një adresë emaili e regjistruar për llogarinë tuaj, atëherë një email për rivendosjen e fjalëkalimit do të dërgohet.",
+       "passwordreset-invalidemail": "Adresë e-mail-i e pavlefshme",
+       "passwordreset-nodata": "Nuk është dhënë as emri i përdoruesit e as adresa e emailit",
        "changeemail": "Ndrysho ose hiq postën elektronike",
-       "changeemail-header": "Ndrysho llogarinë e adresës së postës elektronike",
+       "changeemail-header": "Plotësoni këtë formular për të ndryshuar adresën tuaj të postës elektronike. Nëse do të donit për të hequr ndërlidhjen e ndonjë adrese email nga llogaria juaj, lëreni bosh adresën e re të email-it kur të dorëzoni formularin.",
        "changeemail-no-info": "Ju duhet të identifikoheni në mënyrë që të keni të drejtë hyrjeje në këtë faqe.",
        "changeemail-oldemail": "Adresa aktuale e emailit:",
        "changeemail-newemail": "Adresa e re e emailit:",
+       "changeemail-newemail-help": "Kjo fushë duhet të lihet bosh në qoftë se dëshironi të hiqni adresën tuaj të emailit. Nuk do të jeni në gjendje për të resetuar fjalëkalimin e harruar dhe nuk do të merrni email nga kjo wiki nëse adresa e postës elektronike është hequr.",
        "changeemail-none": "(asgjë)",
        "changeemail-password": "Fjalëkalimi juaj i {{SITENAME}}:",
        "changeemail-submit": "Ndrysho postën elektronike",
        "sig_tip": "Firma juaj me gjithë kohë",
        "hr_tip": "vijë horizontale (përdoreni rallë)",
        "summary": "Përmbledhje:",
-       "subject": "Subjekt/titull:",
+       "subject": "Subjekt:",
        "minoredit": "Ky është një redaktim i vogël",
        "watchthis": "Vëzhgoje këtë faqe",
        "savearticle": "Kryej ndryshimet",
        "anonpreviewwarning": "\"Ju nuk jeni identifikuar. Ruajtja e ndryshimeve do të bëjë që adresa juaj IP të regjistrohet në historikun e redaktimeve të kësaj faqeje.\"",
        "missingsummary": "'''Vërejtje:''' Ju nuk keni lënë shënim për redaktimet e kryera.\nNëse klikoni \"{{int:savearticle}}\" përsëri, redaktimet tuaja do të ruhen pa shënim.",
        "missingcommenttext": "Ju lutemi bëni një koment më poshtë.",
-       "missingcommentheader": "'''Kujdes:''' Ju nuk keni dhënë një titull për këtë koment.\nNëse kryeni ndryshimet redaktimi juaj do të ruhet pa titull.",
-       "summary-preview": "Shqyrto përmbledhjen:",
-       "subject-preview": "Shqyrto titullin/subjektin:",
+       "missingcommentheader": "<strong>Kujdes:</strong>'''Nuk keni dhënë një titull për këtë koment.\nNëse klikoni \"{{int:savearticle}}\" prapë, redaktimi juaj do të ruhet pa titull.",
+       "summary-preview": "Parapamje e përmbledhjes së redaktimit:",
+       "subject-preview": "Parapamje e subjektit:",
        "blockedtitle": "Përdoruesi është bllokuar",
        "blockedtext": "'''Llogaria juaj ose adresa e IP është bllokuar'''\n\nBllokimi u bë nga $1 dhe arsyeja e dhënë ishte '''$2'''.\n\n*Fillimi i bllokimit: $8\n*Skadimi i bllokimit: $6\n*I bllokuari i shënjestruar: $7\n\nMund të kontaktoni $1 ose një nga [[{{MediaWiki:Grouppage-sysop}}|administruesit]] e tjerë për të diskutuar bllokimin.\n\nVini re se nuk mund t'i dërgoni email përdoruesit nëse nuk keni një adresë të saktë të dhënë tek [[Special:Preferences|parapëlqimet e përdoruesit]] ose nëse kjo është një nga mundësitë që ju është bllokuar.\n\nAdresa e IP-së që keni është $3 dhe numri i identifikimit të bllokimit është #$5. Përfshini këto dy të dhëna në çdo ankesë.",
        "autoblockedtext": "IP adresa juaj është bllokuar automatikisht sepse ishte përdorur nga një përdorues tjetër i cili ishte bllokuar nga $1.\nArsyeja e dhënë për këtë është:\n\n:''$2''\n\n* Fillimi i bllokimit: $8\n* Kalimi i kohës së bllokimit: $6\n* Zgjatja e bllokimit: $7\n\nJu mund të kontaktoni $1 ose një tjetër [[{{MediaWiki:Grouppage-sysop}}|administrues]] për ta diskutuar bllokimin.\n\nVini re : që nuk mund ta përdorni mundësinë \"dërgo porosi elektronike\" përveç nëse keni një postë elektronike të vlefshme të regjistruar në [[Special:Preferences|preferencat tuaja]] dhe nuk jeni bllokuar nga përdorimi i saj.\n\nIP adresa juaj e tanishme është $3 dhe ID e bllokimit është #$5.\nJu lutemi përfshini këto detaje në të gjitha kërkesat që i bëni.",
+       "systemblockedtext": "Emri juaj i përdoruesit ose adresa e IP-së janë bllokuar automatikisht nga MediaWiki. \nArsyeja e dhënë është:\n\n:<em>$2</em>\n\n* Fillimi i bllokimit: $8\n* Kalimi i kohës së bllokimit: $6\n* Zgjatja e bllokimit: $7\n\nAdresa juaj e IP-së është $3.\nJu lutemi jepni të gjitha këto detaje në çfarëdo pyetje që bëni.",
        "blockednoreason": "nuk është dhënë asnjë arsye",
        "whitelistedittext": "Ju duhet të $1 për të redaktuar faqet.",
        "confirmedittext": "Ju duhet së pari ta vërtetoni e-mail adresen para se të redaktoni. Ju lutem plotësoni dhe vërtetoni e-mailin tuaj  te [[Special:Preferences|parapëlqimet]] e juaja.",
        "accmailtext": "Një fjalëkalim i krijuar në mënyrë të rastësishme për [[User talk:$1|$1]] u dërgua në $2.\n\nFjalëkalimi për këtë llogari mund të ndryshohet në faqen ''[[Special:ChangePassword|ndrysho fjalëkalimin]]'' pasi të jeni identifikuar.",
        "newarticle": "(I ri)",
        "newarticletext": "Ti ke ndjekur nje lidhje drejt një faqeje që nuk ekziston.\nPër ta krijuar këtë faqe, fillo të shkruash në kutinë e mëposhtme (shih [$1 faqen e ndihmës] për më shumë informacion).\nNëse ti ke mbërritur këtu gabimisht, atëherë kliko butonin '''pas''' të shfletuesit tënd.",
-       "anontalkpagetext": "----'' Kjo është një faqe diskutimi për një përdorues anonim i cili nuk ka krijuar akoma një llogari, ose qe nuk e përdor atë. \n Prandaj, ne duhet të përdorim adresën IP numerike për identifikimin e tij. \nKjo adresë IP mund të përdoret nga disa përdorues.\n Në qoftë se jeni një përdorues anonim dhe mendoni se ndaj jush janë bërë komente të parëndësishme, ju lutem [[Special:CreateAccount|krijoni një llogari]] ose [[Special:UserLogin|identifikohuni]] për të shmangur konfuzionin në të ardhmen me përdorues të tjerë anonim .''",
+       "anontalkpagetext": "----\n<em>Kjo është një faqe diskutimi për një përdorues anonim i cili nuk ka krijuar akoma një llogari, ose qe nuk e përdor atë.</em> \nPrandaj, ne duhet të përdorim adresën IP numerike për identifikimin e tij. \nKjo adresë IP mund të përdoret nga disa përdorues.\nNë qoftë se jeni një përdorues anonim dhe mendoni se ndaj jush janë bërë komente të parëndësishme, ju lutem [[Special:CreateAccount|krijoni një llogari]] ose [[Special:UserLogin|identifikohuni]] për të shmangur konfuzionin në të ardhmen me përdorues të tjerë anonim.",
        "noarticletext": "Momentalisht nuk ka tekst në këtë faqe.\nJu mund [[Special:Search/{{PAGENAME}}|ta kërkoni këtë titull]] në faqe tjera,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} të kërkoni ngjarjet e ngjashme në regjistër],\nose [{{fullurl:{{FULLPAGENAME}}|action=edit}} të krijoni këtë faqe]</span>.",
        "noarticletext-nopermission": "Për momentin faqja e kërkuar është bosh.\nJu mund të [[Special:Search/{{PAGENAME}}|kërkoni këtë titiull]] në faqet e tjera, ose të <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} këtkoni regjistrat e ngjashëm]</span>, por ju nuk mundeni ta krijoni këtë faqe.",
        "missing-revision": "Inspektimi #$1 i faqes me emrin \"{{FULLPAGENAME}}\" nuk ekziston.\n\nKjo zakonisht shkaktuar duke ndjekur një lidhje të vjetër tek një faqe që është fshirë. Hollësitë mund të gjenden në [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} regjistrin e fshirjeve].",
        "page_first": "I parë",
        "page_last": "Së fundmi",
        "histlegend": "Legjenda: <strong>({{int:cur}})</strong> = ndryshimet me versionin e tanishëm, <strong>({{int:last}})</strong> = ndryshimet me versionin e parardhshëm, <strong>{{int:minoreditletter}}</strong> = redaktim i vogël.",
-       "history-fieldset-title": "Shfleto historikun",
-       "history-show-deleted": "Vetëm versionet të grisur",
+       "history-fieldset-title": "Kërko versionin",
+       "history-show-deleted": "Vetëm versionet e grisura",
        "histfirst": "më të vjetër",
        "histlast": "më të rinj",
        "historysize": "({{PLURAL:$1|1 B|$1 B}})",
        "revdelete-confirm": "Ju lutem konfirmoni që keni ndër mënd ta bëni këtë, që i kuptoni pasojat, dhe që ju po veproni në përputhje me [[{{MediaWiki:Policy-url}}|politiken]].",
        "revdelete-suppress-text": "Shuarje duhet'''vetëm'''të përdoret për rastet e mëposhtme: \n * Potencialisht e informacionit shpifës \n * Informacion i pa kriter personal \n *: Adresat në shtëpi''dhe numrat e telefonit, numrat e sigurimeve shoqërore, etj''",
        "revdelete-legend": "Vendosni kufizimet për versionin:",
-       "revdelete-hide-text": "Fshihe tekstin e versionit",
+       "revdelete-hide-text": "Teksti i versionit",
        "revdelete-hide-image": "Fshih përmbajtjen skedës",
-       "revdelete-hide-name": "Fshihe veprimin dhe shënjestrën",
-       "revdelete-hide-comment": "fshih komentin e redaktimit",
+       "revdelete-hide-name": "Fshihe cakun dhe parametrat",
+       "revdelete-hide-comment": "Përmbledhje e redaktimit",
        "revdelete-hide-user": "Nofta e redaktuesit/Adresa IP",
        "revdelete-hide-restricted": "Ndalo të dhëna nga administrues si dhe të tjerë",
        "revdelete-radio-same": "(Mos ndryshoni)",
        "revdelete-unsuppress": "Hiq kufizimet nga versionet e restauruara",
        "revdelete-log": "Arsyeja:",
        "revdelete-submit": "Aplikoni tek {{PLURAL:$1|revision|versionet}} e zgjedhura",
-       "revdelete-success": "'''Dukshmëria e versioneve u vendos me sukses.'''",
+       "revdelete-success": "Dukshmëria e versioneve u freskua.",
        "revdelete-failure": "' ' 'Dukshmëria e rivizionit nuk mund të përditëohet\"\n$1",
-       "logdelete-success": "'''Dukshmëria e regjistrave u vendos me sukses.'''",
+       "logdelete-success": "U vendos dukshmëria e regjistrave.",
        "logdelete-failure": "'''Dukshmëria nuk u vendos:'''\n$1",
        "revdel-restore": "Ndrysho dukshmërinë",
        "pagehist": "Historiku i faqes",
        "searchprofile-advanced-tooltip": "Kërkimi në hapësina",
        "search-result-size": "$1 ({{PLURAL:$2|1 fjalë|$2 fjalë}})",
        "search-result-category-size": "{{PLURAL:$1|1 anëtar|$1 anëtarë}} ({{PLURAL:$2|1 nën-kategori|$2 nën-kategori}}, {{PLURAL:$3|1 skedë|$3 skeda}})",
-       "search-redirect": "(përcjellim $1)",
+       "search-redirect": "(përcjellim nga $1)",
        "search-section": "(seksioni $1)",
        "search-category": "(kategoria $1)",
        "search-suggest": "Mos kishit në mendje: $1",
        "search-interwiki-caption": "Projekte simotra",
-       "search-interwiki-default": "$1 përfundime:",
+       "search-interwiki-default": "Rezultatet nga $1:",
        "search-interwiki-more": "(më shumë)",
        "search-relatedarticle": "Të ngjashme",
        "searchrelated": "të ngjashme",
        "prefs-watchlist-token": "Lista mbikqyrëse shenjë:",
        "prefs-misc": "Të ndryshme",
        "prefs-resetpass": "Ndrysho fjalëkalimin",
-       "prefs-changeemail": "Ndrysho postën elektronike",
+       "prefs-changeemail": "Ndrysho ose hiq adresën e postës elektronike",
        "prefs-setemail": "Vendos adresën e postës elektronike",
        "prefs-email": "Opsionet e emailit",
        "prefs-rendering": "Pamja",
        "saveprefs": "Ruaj parapëlqimet",
-       "restoreprefs": "Rikthe të gjitha të dhënat e mëparshme",
+       "restoreprefs": "Rikthe të gjitha të dhënat e parazgjedhura (në të gjitha pjesët)",
        "prefs-editing": "Redaktimi",
        "searchresultshead": "Kërkimi",
-       "stub-threshold": "Kufiri për formatin e <a href=\"#\" class=\"stub\">lidhjeve cung</a> (B):",
+       "stub-threshold": "Kufiri për formatimin e lidhjeve cung ($1):",
        "stub-threshold-sample-link": "shembull",
        "stub-threshold-disabled": "Çaktivizuar",
        "recentchangesdays": "Numri i ditëve të treguara në ndryshime së fundmi:",
        "gender-female": "Ajo redakton faqet wiki",
        "prefs-help-gender": "Vendosja e këtij parapëlqimi nuk është e detyrueshme.\nSoftueri përdor vlerat e tij për t'ju adresuar dhe për t'ju përmendur ju te të tjerët duke përdorur gjininë e duhur gramatikore.\nKy informacion do të jetë publik.",
        "email": "Email",
-       "prefs-help-realname": "* Emri i vërtetë nuk është i domosdoshëm: Nëse e jipni do të përmendeni si kontribues për punën që ke bërë.",
+       "prefs-help-realname": "Emri i vërtetë nuk është i domosdoshëm. \n\nNëse e jepni, mund të përmendeni si kontribuues për punën që keni bërë.",
        "prefs-help-email": "Dhënia e adresës së emailit është opsionale, por ju mundëson dërgimin e fjalëkalimit të ri të nëse e harroni atë.",
        "prefs-help-email-others": "Mundeni gjithashtu të zgjidhni të kontaktoheni nga të tjerët përmes faqeve tuaja të diskutimit ose përdoruesit pa e treguar identitetin.",
        "prefs-help-email-required": "Nevojitet e-mail adresa .",
        "prefs-signature": "Firma",
        "prefs-dateformat": "Formati i datës",
        "prefs-timeoffset": "Diferenca kohore",
-       "prefs-advancedediting": "Opsionet e avancuar",
+       "prefs-advancedediting": "Opcionet e përgjithshme",
        "prefs-editor": "redaktor",
        "prefs-preview": "Parapamje",
        "prefs-advancedrc": "Opsione të avancuara",
        "prefs-displayrc": "Shfaq opsionet",
        "prefs-displaywatchlist": "Shfaq opsionet",
        "prefs-diffs": "Ndryshimet",
-       "userrights": "Ndrysho privilegjet e përdoruesve",
-       "userrights-lookup-user": "Ndrysho grupet e përdoruesit",
+       "userrights": "Privilegjet e përdoruesit",
+       "userrights-lookup-user": "Zgjedh një përdorues",
        "userrights-user-editname": "Fut emrin e përdoruesit:",
-       "editusergroup": "Redakto grupet e përdoruesve",
+       "editusergroup": "Ngarko grupet e përdoruesve",
        "editinguser": "Duke ndryshuar privilegjet e {{GENDER:$1|përdoruesit|përdorueses}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Anëtarësimi tek grupet",
-       "saveusergroups": "Ruaj Grupin e Përdoruesve",
+       "userrights-editusergroup": "Ndrysho grupet e {{GENDER:$1|përdoruesit}}",
+       "saveusergroups": "Ruaj grupet e përdoruesit",
        "userrights-groupsmember": "{{GENDER:$2|Anëtar i|Anëtare e}}:",
        "userrights-groupsmember-auto": "{{GENDER:$2|Anëtar i nënkuptuar i|Anëtare e nënkuptuar e}}:",
        "userrights-groups-help": "Mund të ndryshoni anëtarësimin e {{GENDER:$1|këtij përdoruesi|kësaj përdorueseje}} në grupe:\n* Kutia e zgjedhur shënon që {{GENDER:$1|përdoruesi|përdoruesja}} është {{GENDER:$1|anëtar|anëtare}} në atë grup.\n* Kutia e pazgjedhur shënon që {{GENDER:$1|përdoruesi|përdoruesja}} nuk është {{GENDER:$1|anëtar|anëtare}} në atë grup.\n* Një * tregon që nuk mund ta hiqni grupin pasi ta keni shtuar (dhe anasjelltas).",
        "userrights-nodatabase": "Regjistri $1 nuk ekziston ose nuk është vendor.",
        "userrights-changeable-col": "Grupe që mund të ndryshoni",
        "userrights-unchangeable-col": "Grupe që s'mund të ndryshoni",
+       "userrights-expiry-current": "Skadon $1",
+       "userrights-expiry-none": "Nuk skadon",
+       "userrights-expiry": "Skadon:",
+       "userrights-expiry-existing": "Koha ekzistuese e skadimit: $3, $2",
+       "userrights-expiry-othertime": "Kohë tjetër:",
        "userrights-conflict": "Konflikt në ndryshimin e të drejtave të përdoruesit! Të lutem të rishiko dhe konfirmo ndryshimet e tua.",
        "group": "Grupi:",
        "group-user": "Përdorues",
        "group-bot-member": "{{GENDER:$1|robot|robote}}",
        "group-sysop-member": "{{GENDER:$1|administrues|administruese}}",
        "group-bureaucrat-member": "{{GENDER:$1|burokrat|burokrate}}",
-       "group-suppress-member": "{{GENDER:$1|kujdestar|kujdestare}}",
+       "group-suppress-member": "{{GENDER:$1|fshehës|fshehëse}}",
        "grouppage-user": "{{ns:project}}:Përdorues",
        "grouppage-autoconfirmed": "{{ns:project}}:Përdorues të vërtetuar automatikisht",
        "grouppage-bot": "{{ns:project}}:Robotë",
        "right-reupload-shared": "Mos pranoni skeda në media magazinën e përbashkët në nivel lokal",
        "right-upload_by_url": "Ngarko skedë nga ndonjë URL",
        "right-purge": "Pastro \"cache\" e site-it për një faqe pa konfirmim",
-       "right-autoconfirmed": "Redakto faqet gjysmë të mbrojtura",
+       "right-autoconfirmed": "Të mos afektohesh nga limitimet e bazuara në IP",
        "right-bot": "Trajtohu si një proces automatik",
        "right-nominornewtalk": "Nuk kanë redaktimet e vogla për faqet e diskutimit të shkaktuar mesazhe të reja e shpejtë",
        "right-apihighlimits": "Vendosni kufijtë më të lartë në pyetjet API",
        "right-deletedtext": "Shiko tekstin dhe ndryshimet e grisura ndërmjet versioneve të grisura",
        "right-browsearchive": "Kërko faqe të grisura",
        "right-undelete": "Rikthe faqen",
-       "right-suppressrevision": "Rishiko dhe rikthe versionet e fshehura nga administratorët",
+       "right-suppressrevision": "Shiko, fshih dhe çfshih versionit specifike të faqeve nga cilido përdorues",
        "right-suppressionlog": "Shiko hyrjet private",
        "right-block": "Blloko përdoruesit tjerë nga editimi",
        "right-blockemail": "Blloko përdoruesin që të mos dërgojë postë elektronike",
        "right-ipblock-exempt": "Anashkalo bllokimet e IP-ve, auto-bllokimet dhe linjën e bllokimeve",
        "right-unblockself": "Zhblloko veten",
        "right-protect": "Ndrysho nivelin mbrojtës dhe redakto faqet e mbrojtura",
-       "right-editprotected": "Redakto faqet e mbrojtura (pa ndryshuar mbrojtjen)",
+       "right-editprotected": "Redakto faqet e mbrojtura si \"{{int:protect-level-sysop}}\"",
        "right-editsemiprotected": "Redakto faqet e mbrojtura, si \"{{int:protect-level-autoconfirmed}}\"",
        "right-editcontentmodel": "Redakto modelin e përmbajtjes së një faqeje",
        "right-editinterface": "Ndrysho parapamjen e përdoruesit",
        "right-siteadmin": "Mbyll ose hap bazën e të dhënave",
        "right-override-export-depth": "Eksoprto faqet duke përfshirë e lidhura deri në një thellësi prej 5",
        "right-sendemail": "Dërgo e-mail tek përdoruesit e tjerë",
-       "right-managechangetags": "Krijoni dhe fshini [[Special:Tags|tags]] nga baza e të dhënave",
+       "right-managechangetags": "Krijoni dhe ç'(aktivizoni) [[Special:Tags|etiketa]]",
        "right-applychangetags": "Aplikoni [[Special:Tags|tags]] së bashku me ndryshimet",
        "right-changetags": "Shtoni dhe të largoni në mënyrë arbitrare [[Special:Tags|tags]] në rishikimet individuale dhe regjistrimet e historikut",
        "grant-group-email": "Dërgoni email",
        "grant-editmywatchlist": "Redaktoni listën tuaj mbikqyrëse",
        "grant-editpage": "Redaktoni faqet ekzistuese",
        "grant-editprotected": "Redakto faqet e mbrojtura",
+       "grant-sendemail": "Dërgo e-mail te përdoruesit tjerë",
        "newuserlogpage": "Regjistri i llogarive",
        "newuserlogpagetext": "Ky është një regjistër i llogarive të fundit që janë hapur",
        "rightslog": "Regjistri i privilegjeve të përdoruesit",
        "rightslogtext": "Ky është një regjistër për ndryshimet e privilegjeve të përdoruesit.",
        "action-read": "lexo këtë faqe",
        "action-edit": "redakto këtë faqe",
-       "action-createpage": "krijo faqe",
-       "action-createtalk": "krijo faqe diskutimi",
+       "action-createpage": "krijo këtë faqe",
+       "action-createtalk": "krijo këtë faqe diskutimi",
        "action-createaccount": "krijo këtë llogari përdoruesi",
        "action-history": "shiko historinë e kësaj faqeje",
        "action-minoredit": "shëno këtë redaktim si të vogël",
        "action-upload_by_url": "ngarko këtë skedë nga një URL",
        "action-writeapi": "përdor API-në e shkrimit",
        "action-delete": "grise këtë faqe",
-       "action-deleterevision": "grise këtë revizion",
-       "action-deletedhistory": "shiko historinë e kësaj faqeje të grisur",
+       "action-deleterevision": "gris versionet",
+       "action-deletedhistory": "shiko historinë e grisur të një faqeje",
        "action-browsearchive": "kërko faqe të grisura",
-       "action-undelete": "Restauro këtë faqe",
-       "action-suppressrevision": "rishiko dhe rikthe këtë revizion të fshehur",
+       "action-undelete": "restauro faqe",
+       "action-suppressrevision": "rishiko dhe rikthe versione të fshehura",
        "action-suppressionlog": "shiko këtë regjistër privat",
        "action-block": "blloko përdoruesin",
        "action-protect": "ndrysho nivelin e mbrojtjes për këtë faqe",
        "recentchanges-legend-heading": "<strong>Legjenda:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (shiko gjithashtu [[Special:NewPages|listën e faqeve të reja]])",
        "recentchanges-submit": "Shfaq",
+       "rcfilters-filtergroup-registration": "Regjistrimi i përdoruesit",
+       "rcfilters-filter-registered-label": "Regjistruar",
+       "rcfilters-filter-registered-description": "Redaktorët e kyçur",
+       "rcfilters-filter-unregistered-label": "Ç'regjistruar",
+       "rcfilters-filtergroup-authorship": "Ndrysho autorsinë",
+       "rcfilters-filter-editsbyself-label": "Redaktimet tuaja",
+       "rcfilters-filter-editsbyself-description": "Redaktimet nga ju.",
+       "rcfilters-filter-editsbyother-label": "Redaktimet nga të tjerët",
+       "rcfilters-filter-editsbyother-description": "Redaktimet e krijuara nga përdoruesit tjerë (jo ti).",
+       "rcfilters-filter-user-experience-level-newcomer-label": "Të rinjtë",
+       "rcfilters-filter-user-experience-level-newcomer-description": "Më pak se 10 redaktime dhe 4 ditë aktivitet.",
+       "rcfilters-filter-user-experience-level-learner-label": "Nxënës",
+       "rcfilters-filter-user-experience-level-experienced-label": "Përdorues me përvojë",
+       "rcfilters-filtergroup-automated": "Kontribute automatike",
+       "rcfilters-filter-bots-label": "Bot",
+       "rcfilters-filter-bots-description": "Redaktime të bëra nga vegla automatike.",
+       "rcfilters-filter-humans-label": "Njeri (jo bot)",
+       "rcfilters-filter-humans-description": "Redaktimet e bëra nga redaktorët njerëz.",
+       "rcfilters-filtergroup-reviewstatus": "Statusi i rishikimit",
+       "rcfilters-filter-patrolled-label": "Patrolluar",
+       "rcfilters-filter-patrolled-description": "Redaktimet të markuara si të patrolluara",
+       "rcfilters-filter-unpatrolled-label": "E papatrolluar",
+       "rcfilters-filter-unpatrolled-description": "Redaktimet e pashënuara si të patrolluara.",
+       "rcfilters-filtergroup-significance": "Rëndësia",
+       "rcfilters-filter-minor-label": "Redaktime të vogëla",
+       "rcfilters-filter-minor-description": "Redaktimet që autori i ka shënuar si të vogla",
+       "rcfilters-filter-major-label": "Redaktimet jo të vogla",
+       "rcfilters-filter-major-description": "Redaktimet jo të shënuara si të vogla.",
+       "rcfilters-filtergroup-changetype": "Lloji i ndryshimit",
+       "rcfilters-filter-pageedits-label": "Redaktimet e faqes",
+       "rcfilters-filter-pageedits-description": "Redaktimet e përmbajtjes wiki, diskutimeve, përshkrimit të kategorive...",
+       "rcfilters-filter-newpages-label": "Krijimet e faqeve",
+       "rcfilters-filter-newpages-description": "Redaktimet që krijojnë faqe të reja.",
+       "rcfilters-filter-categorization-label": "Ndryshimet e kategorive",
+       "rcfilters-filter-categorization-description": "Regjistri i faqeve të shtuara ose hequra nga kategoritë.",
+       "rcfilters-filter-logactions-label": "Veprimet e regjistruara",
+       "rcfilters-filter-logactions-description": "Veprimet administrative, krijimet e llogarive, fshirjet e faqeve, ngarkimet...",
        "rcnotefrom": "Më poshtë {{PLURAL:$5|është shfaqur ndryshimi|janë shfaqur ndryshimet}} që nga <strong>$3, $4</strong> (deri në <strong>$1</strong>).",
        "rclistfrom": "Tregon ndryshime së fundmi duke filluar nga $3 $2",
        "rcshowhideminor": "$1 redaktimet e vogla",
        "rcshowhidemine": "$1 redaktimet e mia",
        "rcshowhidemine-show": "Shfaq",
        "rcshowhidemine-hide": "Fshih",
+       "rcshowhidecategorization": "$1 kategorizim i faqes",
        "rcshowhidecategorization-show": "Shfaq",
        "rcshowhidecategorization-hide": "Fshih",
        "rclinks": "Trego $1 ndryshime gjatë $2 ditëve<br />$3",
        "recentchangeslinked-summary": "Kjo është një listë e ndryshimeve së fundmi të faqeve të lidhura nga faqja e dhënë (ose bëjnë pjesë tek kategoria e dhënë).\nFaqet [[Special:Watchlist|nën mbikqyrjen tuaj]] duken të '''theksuara'''.",
        "recentchangeslinked-page": "Emri i faqes:",
        "recentchangeslinked-to": "Trego ndryshimet e faqeve që lidhen tek faqja e dhënë",
+       "recentchanges-page-added-to-category": "[[:$1]] shtuar në kategori",
+       "recentchanges-page-removed-from-category": "[[:$1]] u hoq nga kategoria",
+       "autochange-username": "Ndryshim automatik i MediaWiki-t",
        "upload": "Ngarkoni skeda",
        "uploadbtn": "Ngarkoje",
        "reuploaddesc": "Kthehu tek formulari i dhënies.",
        "uploaderror": "Gabim dhënie",
        "upload-recreate-warning": "'''Kujdes: Një skedarë me atë emër është fshirë apo lëvizur.'''\n\nRegjistri i fshirjes dhe lëvizjes për këtë faqe për lehtësim ofrohen këtu:",
        "uploadtext": "Përdorni formularin e mëposhtëm për të ngarkuar skeda.\nPër të parë ose kërkuar skeda të ngarkuara më parë, shkoni tek [[Special:FileList|lista e ngarkimeve të skedave]],\n(ri)ngarkimet janë gjithashtu të regjistruara tek [[Special:Log/upload|regjistri i ngarkimeve]], grisjet tek [[Special:Log/delete|regjistri i grisjeve]].\n\nPër të përfshirë një skedë në një faqe, përdorni një nga format e mëposhtme:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Skeda.jpg]]</nowiki></code>''' për të përdorur versionin e plotë të skedës\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Skeda.png|200px|thumb|left|alt text]]</nowiki></code>''' për të përdorur nje interpretim prej 200 piksel në të majtë me 'alt tekst' si përshkrim\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Skeda.ogg]]</nowiki></code>''' për të lidhur skedën direkt, pa e shfaqur atë",
-       "upload-permitted": "Llojet e lejuara të skedave: $1.",
-       "upload-preferred": "Llojet e parapëlqyera të skedave: $1.",
-       "upload-prohibited": "Llojet e ndaluara të skedave: $1.",
+       "upload-permitted": "Skedarët e lejuar {{PLURAL:$2|tipi|tipet}}: $1.",
+       "upload-preferred": "{{PLURAL:$2|Tipi|tipet}} e parapëlqyera të skedave: $1.",
+       "upload-prohibited": "{{PLURAL:$2|Lloji|Llojet}} e ndaluara të skedave: $1.",
        "uploadlogpage": "Regjistri i ngarkimeve",
        "uploadlogpagetext": "Më poshtë është një listë e skedave më të reja që janë ngarkuar.\nTë gjithë orët janë me orën e shërbyesit.",
        "filename": "Emri i skedës",
        "backend-fail-writetemp": "Nuk mund të shkruajë te skeda e përkohshme.",
        "backend-fail-closetemp": "Nuk mund të mbyllë skedën e përkohshme.",
        "backend-fail-read": "Nuk mund të lexojë skedën $1.",
-       "backend-fail-create": "Nuk mund të krijojë skedën $1.",
+       "backend-fail-create": "Nuk mund të krijonte skedën \"$1\".",
        "backend-fail-maxsize": "Nuk mund të shkruante skedarin \"$1\" sepse ai është më i madh se {{PLURAL:$2|një bajt|$2 bajtë}}",
-       "backend-fail-readonly": "Shërbimi i depos \"$1\" është për momentin vetëm-për-lexim. Arsyeja e dhënë është: \"''$2''\"",
+       "backend-fail-readonly": "Shërbimi i depos \"$1\" është për momentin vetëm-për-lexim. Arsyeja e dhënë është: <em>$2</em>",
        "backend-fail-synced": "Skedari \"$1\" është në një gjendje të parregullt brenda proceseve të depos së brendshme",
        "backend-fail-connect": "Nuk u arrit lidhja me shërbimin e depos \"$1\".",
        "backend-fail-internal": "Një problem i panjohur ndodhi në shërbimin e depos \"$1\".",
        "uploadstash-summary": "Kjo faqe ofron qasje tek skedat të cilat janë ngarkuar (ose janë në proçes ngarkimi) por që nuk janë publikuat akoma në wiki. Këto skeda nuk janë të dukshme për këdo përveç për përdoruesin që i ka ngarkuar ato.",
        "uploadstash-clear": "Spastro skedat e fshehura",
        "uploadstash-nofiles": "Ju nuk keni skeda të fshehura.",
-       "uploadstash-badtoken": "Kryerja e këtij veprimi ishte e pasuksesshme, ndoshta sepse kredencialet e tua redaktuese kanë skaduar. Provo përsëri.",
+       "uploadstash-badtoken": "Kryerja e këtij veprimi ishte e pasuksesshme, ndoshta sepse kredencialet e tua redaktuese kanë skaduar. Provoni përsëri.",
        "uploadstash-errclear": "Spastrimi i skedave ishte i pasuksesshëm.",
        "uploadstash-refresh": "Rifreskoni listën e skedave",
        "invalid-chunk-offset": "Kompensim cope i pavlefshëm",
        "nolicense": "Asnjë nuk është zgjedhur",
        "licenses-edit": "Redakto opsionet e licencës",
        "license-nopreview": "(Nuk ka parapamje)",
-       "upload_source_url": " (URL e vlefshme, publikisht e përdorshme)",
-       "upload_source_file": " (skeda në kompjuterin tuaj)",
+       "upload_source_url": "(skedari i zgjedhur nga një URL e vlefshme, publikisht e qasshme)",
+       "upload_source_file": "(skeda e zgjedhur në kompjuterin tuaj)",
        "listfiles-delete": "fshije",
        "listfiles-summary": "Kjo faqe speciale tregon tërë skedat e ngarkuara.\nFillimisht skedat e ngarkuara së fundmi jepen më sipër.\nShtypni kolonat e tjera për të ndryshuar radhitjen.",
        "listfiles_search_for": "Kërko për emrin e figurës:",
        "filedelete-maintenance": "Grisja dhe restaurimi i skedave është çaktivizuar përkohësisht gjatë mirëmbajtjes.",
        "filedelete-maintenance-title": "Nuk mund të grisë skedën",
        "mimesearch": "Kërkime MIME",
-       "mimesearch-summary": "Kjo faqe lejon kërkimin e skedave sipas llojit MIME. Kërkimi duhet të jetë i llojit: contenttype/subtype, p.sh. <code>image/jpeg</code>.",
+       "mimesearch-summary": "Kjo faqe lejon kërkimin e skedave sipas llojit MIME. Kërkimi duhet të jetë i llojit: contenttype/subtype ose contentzype/*, p.sh. <code>image/jpeg</code>.",
        "mimetype": "Lloji MIME:",
        "download": "shkarkim",
        "unwatchedpages": "Faqe të pambikqyrura",
        "doubleredirects": "Përcjellime dopjo",
        "doubleredirectstext": "Kjo faqe liston faqet përcjellëse tek faqet e tjera përcjellëse.\nSecili rresht përmban lidhjet tek përcjellimi i parë dhe përcjellimi i dytë, gjithashtu synimin e përcjellimit të dytë, që është zakonisht faqja synuese '''e vërtetë''', që faqja w parë duhej të ishte përcjellëse e kësaj faqeje.\n<del>Kalimet nga</del> hyrjet janë zgjidhur.",
        "double-redirect-fixed-move": "[[$1]] u zhvendos.\n\nËshtë përditësuar automatikisht dhe tani përcjellet tek [[$2]]",
-       "double-redirect-fixed-maintenance": "Duke zgjidhur përcjellimin e dyfishtë nga [[$1]] tek [[$2]].",
+       "double-redirect-fixed-maintenance": "Duke rregulluar përcjellimin e dyfishtë nga [[$1]] tek [[$2]] si mirëmbajtje.",
        "double-redirect-fixer": "Rregullues zhvendosjesh",
        "brokenredirects": "Përcjellime të prishura",
        "brokenredirectstext": "Përcjellimet që vijojnë lidhen tek një artikull që s'ekziston:",
        "wantedtemplates": "Stampat e dëshiruara",
        "mostlinked": "Artikuj më të lidhur",
        "mostlinkedcategories": "Kategori më të lidhura",
-       "mostlinkedtemplates": "Stampa më të lidhur",
+       "mostlinkedtemplates": "Faqet më të përfshira",
        "mostcategories": "Artikuj më të kategorizuar",
        "mostimages": "Figura më të lidhura",
        "mostrevisions": "Artikuj më të redaktuar",
        "apisandbox-dynamic-parameters-add-label": "Shto parametër:",
        "apisandbox-dynamic-parameters-add-placeholder": "Emri i parametrit",
        "apisandbox-results": "Rezultatet",
+       "apisandbox-continue": "Vazhdo",
+       "apisandbox-continue-clear": "Pastro",
+       "apisandbox-param-limit": "Shkruaj <kbd>max</kbd> për të përdorur maksimumin e limitit",
+       "apisandbox-multivalue-all-namespaces": "$1 (të gjitha hapësirat)",
+       "apisandbox-multivalue-all-values": "$1 (të gjitha vlerat)",
        "booksources": "Burime librash",
        "booksources-search-legend": "Kërkim burimor librash",
        "booksources-search": "Kërko",
        "specialloguserlabel": "Performuesi:",
        "speciallogtitlelabel": "Objektivi (titulli ose përdoruesi):",
        "log": "Regjistrat",
+       "logeventslist-submit": "Shfaq",
        "all-logs-page": "Të gjitha regjistrat",
        "alllogstext": "Kjo faqe tregon të gjithë regjistrat e mundshëm të {{SITENAME}}.\nJu mund të kufizoni pamje sipas tipit të regjistrit, emrit të përdoruesit (shumë i ndjeshëm), dhe faqes në çështje (edhe rastet e ndjeshme)",
        "logempty": "Nuk ka asnjë përputhje në regjistër.",
        "log-title-wildcard": "Kërko tituj që fillojnë me këtë tekst",
        "showhideselectedlogentries": "Paraqit/fshih shënimet e përzgjedhura të regjistruara.",
+       "checkbox-all": "Të gjitha",
+       "checkbox-none": "Asnjë",
+       "checkbox-invert": "E kundërta",
        "allpages": "Të gjitha faqet",
        "nextpage": "Faqja tjetër ($1)",
        "prevpage": "Faqja e mëparshme ($1)",
        "cachedspecial-viewing-cached-ts": "Ju jeni duke e parë një version të ruajtur të kësaj faqe, që mund të mos jetë tërësisht e pranishme.",
        "cachedspecial-refresh-now": "Shikoni të fundit.",
        "categories": "Kategori",
+       "categories-submit": "Shfaq",
        "categoriespagetext": "{{PLURAL:$1|kategoria në vijim përmban|kategoritë në vikim përmbajnë}} faqe ose media.\n[[Special:UnusedCategories|Kategoritë e pa përdorura]] nuk janë të paraqitura këtu.\nShikoni edhe [[Special:WantedCategories|kategoritë e dëshiruara]].",
        "categoriesfrom": "Paraqit kategoritë duke filluar në:",
        "deletedcontributions": "Kontribute të grisura",
        "listgrouprights-removegroup-self": "Hiqni {{PLURAL:$2|grupin|grupet}} nga llogaria: $1",
        "listgrouprights-addgroup-self-all": "Shtoni të gjitha grupet tek llogaria",
        "listgrouprights-removegroup-self-all": "Hiq të gjitha grupet nga llogaria",
+       "trackingcategories-msg": "Kategoria përcjellëse",
+       "trackingcategories-name": "Emri i porosisë",
+       "trackingcategories-desc": "Kriteret për përfshirje në kategori",
        "mailnologin": "S'ka adresë dërgimi",
        "mailnologintext": "Duhet të keni [[Special:UserLogin|hyrë brenda]] dhe të keni një adresë të saktë në [[Special:Preferences|parapëlqimet]] tuaja për tu dërguar email përdoruesve të tjerë.",
        "emailuser": "Email {{GENDER:{{PAGENAME}}|përdoruesit|përdorueses}}",
+       "emailuser-title-target": "Dërgo email te ky përdorues",
        "emailuser-title-notarget": "Email për përdoruesin",
        "emailpagetext": "Mund të përdorni formularin e mëposhtëm për të dërguar e-mail tek ky përdorues.\nAdresa e email-it që shkruat tek [[Special:Preferences|preferencat tuaja]] do të duket si \"Nga\" adresa e email-it, pra marrësi do të ketë mundësinë t'ju përgjigjet direkt.",
        "defemailsubject": "{{SITENAME}} emaili nga përdoruesi \"$1\"",
        "mywatchlist": "Lista mbikqyrëse",
        "watchlistfor2": "Për $1 $2",
        "nowatchlist": "Nuk keni asnjë faqe në listën mbikqyrëse.",
-       "watchlistanontext": "Ju lutemi $1 për të parë redaktimet e artikujve në listë tuaj mbikqyrëse.",
+       "watchlistanontext": "Ju lutemi kyçuni për të parë ose redaktuar njësitë në listën tuaj mbikëqyrëse.",
        "watchnologin": "Nuk keni hyrë brënda",
        "addwatch": "Shto tek lista mbikqyrëse",
-       "addedwatchtext": "Faqja \"[[:$1]]\"  i është shtuar [[Special:Watchlist|listës mbikqyrëse]] tuaj. Ndryshimet e ardhshme të kësaj faqeje dhe faqes së diskutimit të saj do të jepen më poshtë, dhe emri i faqes do të duket i '''trashë''' në [[Special:RecentChanges|listën e ndryshimeve së fundmi]] për t'i dalluar më kollaj.\n\nNë qoftë se dëshironi të hiqni një faqe nga lista mbikqyrëse më vonë, shtypni \"çmbikqyre\" në tabelën e sipërme.",
+       "addedwatchtext": "\"[[:$1]]\"  dhe faqja e saj e diskutimit i është shtuar [[Special:Watchlist|listës tuaj të mbikëqyrjes]].",
+       "addedwatchtext-talk": "\"[[:$1]]\" dhe faqja e saj e ndërlidhur janë shtuar [[Special:Watchlist|listës tuaj të mbikëqyrjes]].",
+       "addedwatchtext-short": "Faqja \"$1\" i është shtuar listës tuaj të mbikëqyrjes.",
        "removewatch": "Largo nga lista mbikqyrëse",
-       "removedwatchtext": "Faqja \"[[:$1]]\" është hequr nga [[Special:Watchlist|lista mbikqyrëse e juaj]].",
+       "removedwatchtext": "\"[[:$1]]\" dhe faqja e saj e diskutimit janë hequr nga [[Special:Watchlist|lista juaj mbikëqyrëse]].",
+       "removedwatchtext-talk": "\"[[:$1]]\" dhe faqja e saj e ndërlidhur janë hequr nga [[Special:Watchlist|lista juaj e mbikëqyrjes]].",
+       "removedwatchtext-short": "Faqja \"$1\" janë hequr nga lista juaj e mbikëqyrjes.",
        "watch": "Mbikqyre",
        "watchthispage": "Mbikqyre këtë faqe",
        "unwatch": "Çmbikqyre",
        "unwatchthispage": "Mos e mbikqyr",
        "notanarticle": "Nuk është artikull",
        "notvisiblerev": "Revizioni është grisur",
-       "watchlist-details": "{{PLURAL:$1|$1 faqe|$1 faqe}} nën mbikqyrje duke mos numëruar faqet e diskutimit.",
-       "wlheader-enotif": "Njoftimi me email është lejuar.",
-       "wlheader-showupdated": "Faqet që kanë ndryshuar nga vizita juaj e fundit do të tregohen të '''trasha'''",
-       "wlnote": "Më poshtë {{PLURAL:$1|është ndryshimi i fundit|janë '''$1''' ndryshimet e fundit}} në {{PLURAL:$2|orën e fundit|'''$2''' orët e fundit}}, që nga $3, $4.",
-       "wlshowlast": "Trego $1 orët $2 ditët",
+       "watchlist-details": "{{PLURAL:$1|$1 faqe|$1 faqe}} nën mbikëqyrje duke mos numëruar faqet e diskutimit.",
+       "wlheader-enotif": "Është aktivizuar njoftimi me email.",
+       "wlheader-showupdated": "Faqet që kanë ndryshuar nga vizita juaj e fundit do të tregohen të <strong>trasha<strong>.",
+       "wlnote": "Më poshtë {{PLURAL:$1|është ndryshimi i fundit|janë <strong>$1</strong>''' ndryshimet e fundit}} në {{PLURAL:$2|orën e fundit|<strong>$2</strong>''' orët e fundit}}, që nga $3, $4.",
+       "wlshowlast": "Trego $1 orët $2 ditët e fundit",
+       "watchlist-hide": "Fshih",
+       "watchlist-submit": "Shfaq",
+       "wlshowtime": "Periudha e kohës për ta treguar:",
+       "wlshowhideminor": "redaktime të vogla",
+       "wlshowhidebots": "botët",
+       "wlshowhideliu": "përdorues të regjistruar",
+       "wlshowhideanons": "përdorues anonim",
+       "wlshowhidepatr": "redaktime të patrulluara",
+       "wlshowhidemine": "redaktimet e mia",
+       "wlshowhidecategorization": "kategorizim i faqes",
        "watchlist-options": "Mundësitë e listës mbikqyrëse",
        "watching": "Duke mbikqyrur...",
        "unwatching": "Mos e mbikqyr më...",
        "watcherrortext": "Është paraqitur një gabim përderisa ndryshuat parametrat e listës suaj mbikqyrëse për \"$1\".",
        "enotif_reset": "Shëno të gjitha faqet e vizituara",
        "enotif_impersonal_salutation": "Përdorues i {{SITENAME}}",
+       "enotif_subject_deleted": "{{SITENAME}} faqja $1 është fshirë nga $2",
        "enotif_subject_created": "{{SITENAME}} faqja $1 është {{GJINIA:$2|krijuar}} nga $2",
+       "enotif_subject_moved": "{{SITENAME}} faqja $1 është lëvizuar nga $2",
+       "enotif_subject_restored": "{{SITENAME}} faqja $1 është rikthyer nga $2",
+       "enotif_subject_changed": "{{SITENAME}} faqja $1 është ndryshuar nga $2",
+       "enotif_body_intro_deleted": "{{SITENAME}} faqja $1 është fshirë në $PAGEEDITDATE nga $2, shiko $3.",
        "enotif_lastvisited": "Shikoni $1 për të gjitha ndryshimet që prej vizitës tuaj të fundit.",
        "enotif_lastdiff": "Shikoni $1 për ndryshime.",
        "enotif_anon_editor": "përdorues anonim $1",
-       "enotif_body": "I Nderuar $WATCHINGUSERNAME,\n\n\nKjo {{SITENAME}} faqe $PAGETITLE eshte $CHANGEDORCREATED on $PAGEEDITDATE by $PAGEEDITOR, see $PAGETITLE_URL per versioni mo i ri.\n\n$NEWPAGE\n\nEditor's summary: $PAGESUMMARY $PAGEMINOREDIT\nKontakto:\nmail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nThere will be no other notifications in case of further changes unless you visit this page.\nYou could also reset the notification flags for all your watched pages on your watchlist.\n\nYour friendly {{SITENAME}} notification system\n\n--\nTo change your email notification settings, visit\n{{canonicalurl:{{#special:Preferences}}}}\n\nTo change your watchlist settings, visit\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nTo delete the page from your watchlist, visit\n$UNWATCHURL\n\nFeedback and further assistance:\n$HELPPAGE\n\nFaqja $PAGETITLE tek {{SITENAME}} është $CHANGEDORCREATED më $PAGEEDITDATE nga $PAGEEDITOR, shikoni $PAGETITLE_URL për versionin e tanishëm.\n\n$NEWPAGE\n\nPërmbledhja e redaktorit: $PAGESUMMARY $PAGEMINOREDIT\n\nMund të lidheni me redaktorin nëpërmjet:\nemail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nNuk do të ketë njoftime të tjera për ndryshimet e ardhshme përveç nëse e vizitoni faqen. Gjithashtu mund të ktheni gjendjen e njoftimeve për të gjitha faqet nën mbikqyrje.\n\n             Miku juaj njoftues nga {{SITENAME}}\n\n--\nPër të ndryshuar parapëlqimet e mbikqyrjes shikoni {{canonicalurl:Special:Watchlist/edit}}\n\nPër të larguar faqen nga lista juaj mbikqyrëse, shikoni \n$UNWATCHURL\n\nPër të na dhënë përshtypjet tuaja ose për ndihmë të mëtejshme:\n{{canonicalurl:{{MediaWiki:Helpage}}}}",
+       "enotif_body": "I nderuar $WATCHINGUSERNAME, \n\nKjo {{SITENAME}} faqe $PAGETITLE është $CHANGEDORCREATED më $PAGEEDITDATE nga $PAGEEDITOR, shikoni $PAGETITLE_URL për versionin më të ri.\n\n$NEWPAGE\n\nPërmbledhja e redaktorit: $PAGESUMMARY $PAGEMINOREDIT\nKontakto:\nemail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nNuk do të ketë njoftime të tjera për ndryshimet e ardhshme përveç nëse e vizitoni faqen. Gjithashtu mund të ktheni gjendjen e njoftimeve për të gjitha faqet nën mbikëqyrje.\n\nMiku juaj njoftues nga {{SITENAME}}\n\n--\nPër të ndryshuar parapëlqimet e mbikëqyrjes, shikoni {{canonicalurl:Special:Watchlist/edit}}\n\nPër të larguar faqen nga lista juaj e mbikëqyrjes, shikoni\n$UNWATCHURL\n\nPër përshtypje dhe ndihmë të mëtejshme:\n$HELPPAGE",
        "created": "u krijua",
        "changed": "ndryshuar",
        "deletepage": "Grise faqen",
        "exbeforeblank": "përmbajtja para boshatisjes ishte: '$1'",
        "delete-confirm": "Grise \"$1\"",
        "delete-legend": "Grise",
-       "historywarning": "'''Kujdes:''' Kjo faqe të cilën po e grisni ka histori me rreth $1 \n{{PLURAL:$1|version|redaktime}}:",
+       "historywarning": "'''Kujdes:''' Kjo faqe të cilën po e grisni ka histori me $1 \n{{PLURAL:$1|redaktim|redaktime}}:",
+       "historyaction-submit": "Shfaq",
        "confirmdeletetext": "Jeni duke grisur një faqe me tërë historinë e saj. Ju lutemi konfirmoni që po e bëni qëllimisht, që i kuptoni pasojat, dhe që po veproni në përputhje me [[{{MediaWiki:Policy-url}}]].",
        "actioncomplete": "Veprimi u krye",
        "actionfailed": "Veprimi dështoi",
        "alreadyrolled": "Nuk mund të rikthehej redaktimi i fundit i [[:$1]] nga [[User:$2|$2]] ([[User talk:$2|diskuto]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]); dikush tjetër e ka redaktuar ose rikthyer këtë faqe tashmë.\n\nRedaktimi i fundit është bërë nga [[User:$3|$3]] ([[User talk:$3|diskuto]]{{nt:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Përmbledhja e redaktimit ishte: <em>$1</em>.",
        "revertpage": "Ndryshimet e [[Special:Contributions/$2|$2]] ([[User talk:$2|diskutimet]]) u kthyen mbrapsht, artikulli tani ndodhet në versionin e fundit nga [[User:$1|$1]].",
-       "revertpage-nouser": "U rikthyen redaktimet nga (përdoruesi i larguar) në versionin e fundit nga [[User:$1|$1]]",
-       "rollback-success": "Ndryshimet e $1 u kthyen mbrapsh; artikulli ndodhet tek verzioni i $2.",
+       "revertpage-nouser": "U rikthyen redaktimet nga një përdorues i fshehur në versionin e fundit nga {{GENDER:$1|[[User:$1|$1]]}}",
+       "rollback-success": "U kthyen mbrapsht redaktimet e {{GENDER:$3|$1}}; \nu kthye te versioni i fundit nga {{GENDER:$4|$2}}.",
        "sessionfailure-title": "Dështim sesioni",
        "sessionfailure": "Duket se ka një problem me seancën tuaj hyrëse; ky veprim është anuluar për tu mbrojtur nga ndonjë veprim dashakeq kundrejt shfletimit tuaj. Ju lutemi kthehuni mbrapsh, rifreskoni faqen prej nga erdhët dhe provojeni përsëri veprimin.",
        "changecontentmodel-title-label": "Titulli i faqes",
        "changecontentmodel-reason-label": "Arsyeja:",
+       "changecontentmodel-submit": "Ndrysho",
        "protectlogpage": "Regjistri i mbrojtjeve",
        "protectlogtext": "Më poshtë është lista e kyçjeve dhe çkyçjeve të faqes.\nShih listën e [[Special:ProtectedPages|faqeve të mbrojtura]] nga lista e mbrojtjeve të faqeve tani në veprim.",
        "protectedarticle": "mbrojti [[$1]]",
        "protect-locked-access": "Llogaria juaj nuk ka privilegjet e nevojitura për të ndryshuar nivelin e mbrojtjes. Kufizimet e kësaj faqeje janë '''$1''':",
        "protect-cascadeon": "Kjo faqe është e mbrojtur pasi është përfshirë {{PLURAL:$1|këtë faqe që është|këto faqe që janë}} nën mbrojtje \"ujëvarë\".\nMund të ndryshoni nivelin e mbrojtjes të kësaj faqeje por kjo nuk do të ndryshojë mbrojtjen \"ujëvarë\".",
        "protect-default": "Lejoni të gjithë përdoruesit",
-       "protect-fallback": "Kërko leje \"$1\"",
-       "protect-level-autoconfirmed": "Blloko përdoruesit e rinj dhe ata pa llogari",
-       "protect-level-sysop": "Lejo vetëm administruesit",
+       "protect-fallback": "Lejo vetëm përdoruesit me leje \"$1\"",
+       "protect-level-autoconfirmed": "Lejo vetëm përdoruesit e vet-konfirmuar",
+       "protect-level-sysop": "Lejo vetëm administatorët",
        "protect-summary-cascade": "të varura",
        "protect-expiring": "skadon me $1 (UTC)",
        "protect-expiring-local": "Skadon $1",
        "undeletepagetext": "{{PLURAL:$1|Faqja në vazhdim është grisur, por akoma është|$1 Faqet në vazhdim janë grisur, por akoma janë}} në arkiv dhe mund të rikthehen.\nArkivi, kohëpaskohe është e mundur të pastrohet.",
        "undelete-fieldset-title": "Rikthe revizionet",
        "undeleteextrahelp": "Per tu rregeluar histori, zbardh gjith kutit '''''{{int:undeletebtn}}'''''.\nTo perform a selective restoration, check the boxes corresponding to the revisions to be restored, and click '''''{{int:undeletebtn}}'''''.",
-       "undeleterevisions": "$1 {{PLURAL:$1|version u fut|versione u futën}} në arkiv",
+       "undeleterevisions": "$1 {{PLURAL:$1|versioni|versionet}} u fshinë",
        "undeletehistory": "Nëse restauroni një faqe, të gjitha versionet do të restaurohen në histori.\nNëse një faqe e re me të njëjtin titull është krijuar pas grisjes, versionet e restauruara do të paraqiten më mbrapa në histori.",
        "undeleterevdel": "Restaurimi nuk do të performohet n.q.s. do të rezultojë në majë të versioneve të faqes apo skedës duke u grisur pjesërisht.\nNë raste të tilla, ju duhet të çzgjidhni ose shfaqni versionet më të reja të grisura.",
        "undeletehistorynoadmin": "Kjo faqe është grisur. Arsyeja për grisjen është dhënë tek përmbledhja më poshtë bashkë me hollësitë e përdoruesve që e kanë redaktuar.",
        "undeleteviewlink": "Pamje",
        "undeleteinvert": "Selektim anasjelltas",
        "undeletecomment": "Arsyeja:",
-       "undeletedrevisions": "$1 {{PLURAL:$1|version u restaurua|versione u restauruan}}",
-       "undeletedrevisions-files": "$1 {{PLURAL:$1|version|versione}} dhe $2 {{PLURAL:$2|skedë|skeda}} janë restauruar",
-       "undeletedfiles": "$1 {{PLURAL:$1|skedë u restaurua|skeda u restauruan}}",
-       "cannotundelete": "Restaurimi dështoi; dikush tjetër mund ta ketë restauruar faqen para jush.",
+       "cannotundelete": "Disa ose krejt çfshirjet dështuan:\n$1",
        "undeletedpage": "'''$1 është restauruar'''\n\nShikoni [[Special:Log/delete|regjistrin e grisjeve]] për grisjet dhe restaurimet së fundmi.",
        "undelete-header": "Shikoni [[Special:Log/delete|regjistrin e grisjeve]] për faqet e grisura së fundmi.",
        "undelete-search-title": "Kërko faqet e grisura",
        "contributions-title": "Kontributet e përdoruesit për $1",
        "mycontris": "Kontributet",
        "anoncontribs": "Kontribute",
-       "contribsub2": "Për $1 ($2)",
+       "contribsub2": "Për {{GENDER:$3|$1}} ($2)",
        "nocontribs": "Nuk ka asnjë ndryshim që përputhet me këto kritere.",
        "uctop": "(aktual)",
        "month": "Nga muaji (dhe më herët):",
        "sp-contributions-newbies-sub": "Për newbies",
        "sp-contributions-newbies-title": "Kontributet e përdoruesit për kontot e reja",
        "sp-contributions-blocklog": "Regjistri i bllokimeve",
-       "sp-contributions-suppresslog": "Anëtar me Kontribute të kufizuara",
-       "sp-contributions-deleted": "kontributet e grisura",
+       "sp-contributions-suppresslog": "u fshehën kontributet e {{GENDER:$1|user}}",
+       "sp-contributions-deleted": "kontributet e grisura të {{GENDER:$1|user}}",
        "sp-contributions-uploads": "ngarkimet",
        "sp-contributions-logs": "Regjistrat",
        "sp-contributions-talk": "Diskutoni",
        "sp-contributions-search": "Kërko tek kontributet",
        "sp-contributions-username": "IP Addresa ose Përdoruesi:",
        "sp-contributions-toponly": "Trego vetëm redaktimet që janë versionet më të fundit",
+       "sp-contributions-hideminor": "Fshih redaktimet e vogla",
        "sp-contributions-submit": "Kërko",
        "whatlinkshere": "Lidhjet këtu",
        "whatlinkshere-title": "Faqe që lidhen tek $1",
        "whatlinkshere-hidelinks": "$1 lidhjet",
        "whatlinkshere-hideimages": "$1 lidhjet me skedat",
        "whatlinkshere-filters": "Filtra",
+       "whatlinkshere-submit": "Shko",
        "autoblockid": "Autobllokim #$1",
        "block": "Blloko përdoruesin",
        "unblock": "Zhblloko përdoruesin",
-       "blockip": "Blloko përdorues",
+       "blockip": "Blloko {{GENDER:$1|user}}",
        "blockip-legend": "Blloko përdoruesin",
        "blockiptext": "Përdorni formularin e mëposhtëm për të hequr lejen e shkrimit për një përdorues ose IP specifike.\nKjo duhet bërë vetëm në raste vandalizmi, dhe në përputhje me [[{{MediaWiki:Policy-url}}|rregullat e {{SITENAME}}-s]].\nPlotësoni arsyen specifike më poshtë (p.sh., tregoni faqet specifike që u vandalizuan).",
        "ipaddressorusername": "Adresë IP ose emër përdoruesi",
        "ipb-confirm": "Konfirmo bllokimin",
        "badipaddress": "Nuk ka asnjë përdorues me atë emër",
        "blockipsuccesssub": "Bllokimi u bë me sukses",
-       "blockipsuccesstext": "Përdoruesi/IP-Adresa [[Special:Contributions/$1|$1]] u bllokua.<br />\nShiko te [[Special:BlockList|Lista e përdoruesve dhe e IP adresave të bllokuara]] për të çbllokuar Përdorues/IP.",
+       "blockipsuccesstext": "[[Special:Contributions/$1|$1]] është bllokuar.<br />\nShiko [[Special:BlockList|listen e bllokimeve]] për të rishikuar bllokimet.",
        "ipb-blockingself": "Ju jeni duke bllokuar vetëveten ! Jeni te sigurte qe doni te bëni këtë?",
        "ipb-confirmhideuser": "Ju jeni gati për të bllokuar një përdorues që ka aktivizuar statusin \"përdorues i fshehur\". Kjo do të shtyp emrin e përdoruesit në të gjitha listat regjistrimet. Jeni të sigurtë që doni ta bëni këtë?",
        "ipb-edit-dropdown": "Redakto arsyet e bllokimit",
        "ipb-unblock": "Çblloko përdorues dhe IP të bllokuara",
        "ipb-blocklist": "Përdorues dhe IP adresa të bllokuara",
        "ipb-blocklist-contribs": "Kontributet për {{GENDER:$1|$1}}",
+       "ipb-blocklist-duration-left": "kanë mbetë $1",
        "unblockip": "Zhblloko përdoruesin",
        "unblockiptext": "Përdor formularin e më poshtëm për t'i ridhënë leje shkrimi\nnjë përdoruesi ose IP adreseje të bllokuar.",
        "ipusubmit": "Hiqni këtë bllokim",
        "change-blocklink": "ndryshoje bllokun",
        "contribslink": "kontribute",
        "emaillink": "dërgo e-mail",
-       "autoblocker": "Bllokuar automatikisht sepse adresa juaj IP është përdorur së fundmi nga \"[[User:$1|$1]]\".\nArsyeja e dhënë për bllokimin e $1 është: \"$2\"",
+       "autoblocker": "Bllokuar automatikisht sepse adresa juaj IP është përdorur rishtas nga \"[[User:$1|$1]]\".\nArsyeja e dhënë për bllokimin e $1 është \"$2\"",
        "blocklogpage": "Regjistri i bllokimeve",
        "blocklog-showlog": "Ky përdorues ka qenë bllokuar më parë.\nRegjistri i bllokimeve është poshtë për referncë:",
        "blocklog-showsuppresslog": "Ky përdorues ka qenë i bllokuar dhe i fshehur më parë.\nRegjistri i bllokimeve është poshtë për referncë:",
        "block-log-flags-hiddenname": "emri i përdoruesit i fshehur",
        "range_block_disabled": "Mundësia e administruesve për të bllokuar me shtrirje është çaktivizuar.",
        "ipb_expiry_invalid": "Afati i kohës është gabim.",
+       "ipb_expiry_old": "Data e skadencës është në të shkuarën.",
        "ipb_expiry_temp": "Bllokimet e përdoruesve të fshehur duhet të jenë të përhershme.",
-       "ipb_hide_invalid": "Nuk mund ta prishni këtë llogari; mund të ketë shumë redaktime.",
+       "ipb_hide_invalid": "Nuk mund ta prishni këtë llogari; ka më shumë se {{PLURAL:$1|një redaktim|$1 redaktime}}.",
        "ipb_already_blocked": "\"$1\" është i bllokuar",
        "ipb-needreblock": "$1 është i bllokuar.\nDëshironi t'i ndryshoni parametrat?",
        "ipb-otherblocks-header": "{{PLURAL:$1|Bllokim tjetër|Bllokime të tjera}}",
        "proxyblockreason": "IP adresa juaj është bllokuar sepse është një ndërmjetëse e hapur. Ju lutem lidhuni me kompaninë e shërbimeve të Internetit që përdorni dhe i informoni për këtë problem sigurije.",
        "sorbsreason": "Adresa IP e juaj është radhitur si ndërmjetëse e hapur tek lista DNSBL.",
        "sorbs_create_account_reason": "Adresa IP e juaj është radhitur si ndërmjetëse e hapur tek lista DNSBL që përdoret nga {{SITENAME}}. Nuk ju lejohet të hapni një llogari.",
+       "softblockrangesreason": "Kontributet anonime nuk lejohen nga adresa IP e juaj ($1)",
        "cant-see-hidden-user": "Përdoruesi që po përpiqeni të bllokoni është i bllokuar dhe i fshehur.\nPërderisa ju nuk keni të drejtën e fshehjes së përdoruesve, ju nuk mund të shikoni ose redaktoni bllokimet e përdoruesit.",
        "ipbblocked": "Ti nuk mund t'i bllokosh ose zhbllokosh përdoruesit e tjerë, sepse je vet i bllokuar",
        "ipbnounblockself": "Ju nuk mund të zhbllokoni veten tuaj",
        "movenotallowedfile": "Nuk keni leje për të lëvizur skeda.",
        "cant-move-user-page": "Ju nuk keni të drejat për të lzhvendosur faqet e përdoruesve (përveç nën-faqeve).",
        "cant-move-to-user-page": "Ju nuk keni të drejta për të zhvendosur një faqe tek një faqe përdoruesi (përvç tek një nën-faqe përdoruesi).",
-       "newtitle": "Tek titulli i ri",
+       "newtitle": "Titull i ri:",
        "move-watch": "Mbikqyre këtë faqe",
        "movepagebtn": "Zhvendose faqen",
        "pagemovedsub": "Zhvendosja doli me sukses",
        "movenosubpage": "Kjo faqe nuk ka nën-faqe.",
        "movereason": "Arsyeja:",
        "revertmove": "ktheje",
-       "delete_and_move_text": "==Nevojitet grisje==\n\nFaqja \"[[:$1]]\" ekziston, dëshironi ta grisni për të mundësuar zhvendosjen?",
+       "delete_and_move_text": "Faqja e destinimit \"[[:$1]]\" ekziston. Dëshironi ta grisni për të mundësuar zhvendosjen?",
        "delete_and_move_confirm": "Po, fshi këtë faqe",
        "delete_and_move_reason": "U gris për të liruar vendin për përcjellim të \"[[$1]]\"",
        "selfmove": "Nuk munda ta zhvendos faqen sepse titulli i ri është i njëjtë me të vjetrin.",
        "move-leave-redirect": "Lini një përcjellim prapa",
        "protectedpagemovewarning": "'''Kujdes''': Kjo faqe është mbrojtur, kështu që vetëm përdoruesit me privilegje administratorësh mund ta zhvendosin atë.\nVeprimi i fundit mbi këtë faqe është poshtë për referncë:",
        "semiprotectedpagemovewarning": "'''Kujdes''': Kjo faqe është mbrojtur, kështu që vetëm përdoruesit e regjistruar mund ta zhvendosin atë.\nVeprimi i fundit mbi këtë faqe është poshtë për referncë:",
-       "move-over-sharedrepo": "== Skeda ekziston ==\n[[:$1]] ekziston në një magazinë të përbashkët. Zhvendosja e një skede tek ky titull do të mbishkruajë skedën e përbashkët.",
+       "move-over-sharedrepo": "[[:$1]] ekziston në një magazinë të përbashkët. Zhvendosja e një skede te ky titull do të mbishkruaj skedën e përbashkët.",
        "file-exists-sharedrepo": "Emri i zgjedhur i skedës është në përdorim në një magazinë të përbashkët.\nJu lutemi zgjidhni në emët tjetër.",
        "export": "Eksportoni faqe",
        "exporttext": "Mund të eksportoni tekstin dhe historinë e redaktimit e një faqeje ose disa faqesh të mbështjesha në XML; kjo mund të importohet në një wiki tjetër që përdor softuerin MediaWiki (tani për tani, ky opsion nuk është përfshirë tek {{SITENAME}}).\n\nPër të eksportuar faqe, thjesht shtypni një emër për çdo rresht, ose krijoni lidhje të tipit [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] si [[{{MediaWiki:Mainpage}}]].",
        "thumbnail_gd-library": "Konfigurim librarie GD i paplotë: mungon funksoni $1",
        "thumbnail_image-missing": "Skeda duket se mungon: $1",
        "import": "Importoni faqe",
-       "importinterwiki": "Import ndër-wiki",
+       "importinterwiki": "Importo nga një wiki tjetër",
        "import-interwiki-text": "Zgjidhni një wiki dhe titull faqeje për të importuar.\nDatat e versioneve dhe emrat e redaktuesve do të ruhen.\nTë gjitha veprimet e importit transwiki janë të regjistruara tek [[Special:Log/import|registri i importimeve]].",
        "import-interwiki-sourcewiki": "Burimi wiki:",
        "import-interwiki-sourcepage": "Burimi i faqes:",
        "importcantopen": "Nuk mund të hapë skedën e importuar",
        "importbadinterwiki": "Lidhje e prishur interwiki",
        "importsuccess": "Importim i sukseshëm!",
-       "importnosources": "Nuk ka asnjë burim importi të përcaktuar dhe ngarkimet historike të drejtpërdrejta janë ndaluar.",
+       "importnosources": "Nuk janë përcaktuar wiki-t nga të cilat mund të importohet dhe ngarkimet historike të drejtpërdrejta janë ndaluar.",
        "importnofile": "Nuk u ngarkua asnjë skedë importi.",
        "importuploaderrorsize": "Ngarkimi ose importimi i skedës dështoi.\nSkeda është më e madhe se madhësia e lejuar.",
        "importuploaderrorpartial": "Ngarkimi ose importimi i skedës dështoi.\nSkeda u ngarkua vetëm pjesërisht.",
        "importuploaderrortemp": "Ngarkimi ose importimi i skedës dështoi.\nNjë dosje e përkohëshme mungon.",
        "import-parse-failure": "Dështim i analizës së importit XML",
        "import-noarticle": "S'ka faqe për tu importuar!",
-       "import-nonewrevisions": "Të gjitha versionet kanë qenë të importuara më parë.",
+       "import-nonewrevisions": "Nuk u importua asnjë version (të gjitha ose ishin prezent ose u kaluan per shkak të gabimeve).",
        "xml-error-string": "$1 në vijën $2, kol $3 (bite $4): $5",
        "import-upload": "Ngarko të dhëna XML",
        "import-token-mismatch": "Humbje e të dhënave të sesionit.\nJu lutemi provoni përsëri.",
        "import-error-edit": "Faqja \"$1\" nuk është importuar sepse ju nuk lejoheni ta redaktoni atë.",
        "import-error-create": "Faqja \"$1\" nuk është importuar sepse ju nuk lejoheni ta krijoni atë.",
        "import-error-interwiki": "Faqja \"$1\" nuk është importuar sepse emri i saj është rezervuar për lidhje të jashtme (interwiki)",
-       "import-error-special": "Faqja \"$1\" nuk është importuar sepse ajo i përket një hapësire të veçantë që nuk i lejon faqet.",
-       "import-error-invalid": "Faqja \"$1\" nuk është importuar sepse emri i saj është i palejueshëm.",
+       "import-error-special": "Faqja \"$1\" nuk është importuar sepse ajo i përket një hapësire të veçantë që nuk lejon faqe.",
+       "import-error-invalid": "Faqja \"$1\" nuk është importuar sepse emri me të cilin do të importohej është i palejueshëm në këtë wiki.",
        "importlogpage": "Regjistri i importeve",
        "importlogpagetext": "Importimet administrative të faqeve me historik redaktimi nga wiki-t e tjera.",
-       "import-logentry-upload-detail": "$1 {{PLURAL:$1|version|versione}}",
-       "import-logentry-interwiki-detail": "$1 {{PLURAL:$!1|version|versione}} nga $2",
+       "import-logentry-upload-detail": "$1 {{PLURAL:$1|version|versione}} u importuan",
+       "import-logentry-interwiki-detail": "$1 {{PLURAL:$!1|version|versione}} u importuan nga $2",
        "javascripttest": "Duke testuar JavaScript",
        "javascripttest-qunit-intro": "Shiko [$1 dokumentacionin e testimit] në mediawiki.org.",
-       "tooltip-pt-userpage": "Faqja jote e përdoruesit",
+       "tooltip-pt-userpage": "{{GENDER:|Faqja juaj}} e përdoruesit",
        "tooltip-pt-anonuserpage": "Faqja e përdoruesve anonim nga kjo adresë IP",
-       "tooltip-pt-mytalk": "Faqja jote e diskutimeve",
+       "tooltip-pt-mytalk": "Faqja juaj e diskutimit",
        "tooltip-pt-anontalk": "Faqja e diskutimeve të përdoruesve anonim për këtë adresë IP",
-       "tooltip-pt-preferences": "Parapëlqimet tua",
+       "tooltip-pt-preferences": "Parapëlqimet tua",
        "tooltip-pt-watchlist": "Lista e faqeve nën mbikqyrjen tuaj.",
        "tooltip-pt-mycontris": "Lista e kontributeve tua",
        "tooltip-pt-login": "Identifikimi nuk është i detyrueshëm, megjithatë ne jua rekomandojmë.",
        "tooltip-t-recentchangeslinked": "Lista e ndryshimeve të faqeve që lidhen tek kjo faqe",
        "tooltip-feed-rss": "Burimi ushqyes \"RSS\" për këtë faqe",
        "tooltip-feed-atom": "Burimi ushqyes \"Atom\" për këtë faqe",
-       "tooltip-t-contributions": "Shiko listën e kontributeve për përdoruesin në fjalë",
-       "tooltip-t-emailuser": "Dërgoni një email {{GENDER:{{PAGENAME}}|përdoruesit|përdorueses}}",
+       "tooltip-t-contributions": "Një listë e kontributeve nga ky përdorues",
+       "tooltip-t-emailuser": "Dërgoni një email te ky përdorues",
        "tooltip-t-upload": "Ngarko skeda",
        "tooltip-t-specialpages": "Lista e të gjitha faqeve speciale.",
        "tooltip-t-print": "Version i shtypshëm i kësaj faqeje",
        "lastmodifiedatby": "Kjo faqe është redaktuar së fundit më $2, $1 nga $3.",
        "othercontribs": "Bazuar në punën e: $1",
        "others": "të tjerë",
-       "siteusers": "{{SITENAME}} {{PLURAL:$2|përdorues|përdorues}} $1",
+       "siteusers": "{{SITENAME}} {{PLURAL:$2|përdoruesi|përdoruesit}} $1",
        "anonusers": "{{SITENAME}} {{PLURAL:$2|përdoruesi anonim|përdoruesit anonimë}} $1",
        "creditspage": "Statistika e faqes",
        "nocredits": "Për këtë faqe nuk ka informacione.",
        "pageinfo-category-pages": "Numri i faqeve",
        "pageinfo-category-subcats": "Numri i nënkategorive",
        "pageinfo-category-files": "Numri i skedave",
+       "pageinfo-user-id": "ID e përdoruesit",
        "markaspatrolleddiff": "Shënoje si të patrulluar",
        "markaspatrolledtext": "Shënoje këtë artikull të patrulluar",
        "markedaspatrolled": "Shënoje të patrulluar",
        "patrol-log-page": "Regjistri i patrollimeve",
        "patrol-log-header": "Këto janë të dhëna të revizioneve të patrulluara.",
        "log-show-hide-patrol": "$1 regjistri i patrollimeve",
+       "confirm-markpatrolled-button": "Në rregull",
        "deletedrevision": "Gris versionin e vjetër $1",
        "filedeleteerror-short": "Gabim gjatë grisjes së skedës: $1",
        "filedeleteerror-long": "U hasën gabime gjatë grisjes së skedës:\n\n$1",
        "scarytranscludetoolong": "[Adresa URL eshte teper e gjate]",
        "deletedwhileediting": "Kujdes! Kjo faqe është grisur pasi keni filluar redaktimin!",
        "confirmrecreate": "Përdoruesi [[User:$1|$1]] ([[User talk:$1|diskutime]]) grisi këtë artikull mbasi ju filluat ta redaktoni për arsyen:\n: ''$2''\nJu lutem konfirmoni nëse dëshironi me të vertetë ta rikrijoni këtë artikull.",
-       "confirmrecreate-noreason": "Përdoruesi [[User:$1|$1]] ([[User talk:$1|talk]]) ka fshirë këtë faqe pasi ju filluat ta redaktoni. Ju lutem konfirmoni që ju vërtet doni të ri-krijoni këtë faqe.",
+       "confirmrecreate-noreason": "Përdoruesi [[User:$1|$1]]([[User talk:$1|talk]]) ka fshirë këtë faqe pasi ju filluat ta redaktoni. Ju lutem konfirmoni që vërtet doni të ri-krijoni këtë faqe.",
        "recreate": "Rikrijo",
        "confirm_purge_button": "Shko",
        "confirm-purge-top": "Pastro ''cache''-in për këtë faqe?",
        "confirm-watch-top": "Shto këtë faqe në listën mbikqyrëse tuajen?",
        "confirm-unwatch-button": "Në rregull",
        "confirm-unwatch-top": "Largo këtë faqe nga lista juaj mbikqyrëse ?",
+       "confirm-rollback-button": "Në rregull",
+       "confirm-rollback-top": "Rikthe redaktimet në këtë faqe?",
        "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← faqja e mëparshme",
        "imgmultipagenext": "faqja tjetër →",
        "imgmultigo": "Shko!",
        "imgmultigoto": "Shko tek faqja $1",
        "img-lang-default": "(gjuha e parazgjedhur)",
+       "img-lang-go": "Shko",
        "ascending_abbrev": "ngritje",
        "descending_abbrev": "zbritje",
        "table_pager_next": "Faqja tjetër",
        "watchlistedit-raw-done": "Lista mbikëqyrëse u aktualizua.",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 titull u shtua|$1 tituj u shtuan}}:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 titull u largua|$1 tituj u larguan}}:",
+       "watchlistedit-clear-title": "Pastro listën e mbikëqyrjes",
+       "watchlistedit-clear-legend": "Pastro listën e mbikëqyrjes",
+       "watchlistedit-clear-explain": "Të gjithë titujt do të hiqen nga lista juaj e mbikëqyrjes",
+       "watchlistedit-clear-titles": "Titujt:",
+       "watchlistedit-clear-done": "Lista mbikëqyrëse u fshi.",
+       "watchlisttools-clear": "Pastro listën e mbikëqyrjes",
        "watchlisttools-view": "Shih ndryshimet e rëndësishme",
        "watchlisttools-edit": "Shih dhe redakto listën mbikqyrëse.",
        "watchlisttools-raw": "Redaktoje drejtpërdrejt listën",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|diskutimet]])",
+       "timezone-local": "Lokal",
        "duplicate-defaultsort": "'''Kujdes:''' Renditja kryesore e çelësit \"$2\" refuzon renditjen e mëparshme kryesore të çelësit \"$1\".",
        "version": "Versioni",
        "version-extensions": "Zgjerime të instaluara",
        "version-hook-subscribedby": "Abonuar nga",
        "version-version": "($1)",
        "version-license": " Liçenca MediaWiki",
+       "version-ext-license": "Licenca",
+       "version-ext-colheader-name": "Shtojca",
+       "version-skin-colheader-name": "Pamja",
+       "version-ext-colheader-version": "Versioni",
+       "version-ext-colheader-license": "Licenca",
+       "version-ext-colheader-description": "Përshkrimi",
+       "version-ext-colheader-credits": "Autorët",
+       "version-license-title": "Licenca për $1",
+       "version-credits-title": "Atribuuimi për $1",
        "version-poweredby-credits": "Ky wiki është mundësuar nga '''[https://www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
        "version-poweredby-others": "të tjerë",
+       "version-poweredby-translators": "përkthyesit e translatewiki.net",
+       "version-credits-summary": "Dëshirojmë t'i mirënjohim personat në vazhdim për kontributin e tyre [[Special:Version|MediaWiki]].",
        "version-license-info": "MediaWiki është një softuer i lirë; ju mund ta shpërndani dhe redakatoni atë nën kushtet GNU General Public License si e publikuar nga fondacioni Free Software; ose versioni 2 i licensës, ose çdo version më i vonshëm.\n\nMediaWiki është shpërndarë me shpresën se do të jetë i dobishëm, por PA ASNJË GARANCI; as garancinë e shprehur të SHITJES apo PËRDORIMIT PËR NJË QËLLIM TË CAKTUAR. Shikoni GNU General Public License  për më shumë detaje.\n\nJu duhet të keni marrë [{{SERVER}}{{SCRIPTPATH}}/COPYING një kopje të GNU General Public License] së bashku me këtë program; nëse jo, shkruani tek Free Software Foundation, Inc., 51 Rruga Franklin, Kati i pestë, Boston, MA 02110-1301, ShBA ose [//www.gnu.org/licenses/old-licenses/gpl-2.0.html lexojeni atë online].",
        "version-software": "Softuerët e instaluar",
        "version-software-product": "Produkti",
        "version-software-version": "Versioni",
+       "version-entrypoints": "URL-të hyrëse",
+       "version-entrypoints-header-entrypoint": "Pika hyrëse",
        "version-entrypoints-header-url": "URL",
+       "version-libraries": "Libraritë e instaluara",
+       "version-libraries-library": "Librari",
+       "version-libraries-version": "Versioni",
+       "version-libraries-license": "Licenca",
+       "version-libraries-description": "Përshkrimi",
+       "version-libraries-authors": "Autorët",
+       "redirect-submit": "Shko",
+       "redirect-lookup": "Kërko:",
+       "redirect-value": "Vlera:",
+       "redirect-user": "ID e përdoruesit",
+       "redirect-page": "ID-ja e faqes",
+       "redirect-revision": "Versioni i faqes",
+       "redirect-file": "Emri i skedës",
+       "redirect-not-exists": "Vlera nuk u gjet",
        "fileduplicatesearch": "Kërkoni për skeda të dyfishta",
        "fileduplicatesearch-summary": "Kërkoni për dyfishime të skedave në bazë të vlerës përmbledhëse («hash»).",
        "fileduplicatesearch-filename": "Emri i skedës:",
        "fileduplicatesearch-result-n": "Skeda \"$1\" ka {{PLURAL:$2|1 dyfishim|$2 dyfishime}}.",
        "fileduplicatesearch-noresults": "Nuk u gjet asnjë skedë me emrin \"$1\".",
        "specialpages": "Faqet speciale",
-       "specialpages-note": "* Faqet speciale normale.\n* <strong class=\"mw-specialpagerestricted\">Faqet speciale të kufizuara.</strong>\n* <span class=\"mw-specialpagecached\">Faqet speciale të fshehtat (mund të jenë vjetëruar).</span>",
+       "specialpages-note-top": "Legjenda",
+       "specialpages-note": "* Faqet speciale normale.\n* <span class=\"mw-specialpagerestricted\">Faqet speciale të kufizuara.</span>",
        "specialpages-group-maintenance": "Përmbledhje mirëmbajtjeje",
        "specialpages-group-other": "Faqe speciale të tjera",
-       "specialpages-group-login": "Hyrje dhe hapje llogarie",
+       "specialpages-group-login": "Hyrë / hap llogari",
        "specialpages-group-changes": "Ndryshimet më të fundit dhe regjistrat",
        "specialpages-group-media": "Përmbledhje media dhe ngarkime",
        "specialpages-group-users": "Përdoruesit dhe privilegjet",
        "specialpages-group-highuse": "Faqe të shumëpërdorura",
        "specialpages-group-pages": "Lista e faqeve",
        "specialpages-group-pagetools": "Mjetet e faqes",
-       "specialpages-group-wiki": "Mjetet dhe të dhënat wiki",
+       "specialpages-group-wiki": "Të dhënat dhe veglat",
        "specialpages-group-redirects": "Përcjellime tek faqet speciale",
        "specialpages-group-spam": "Mjetet për spam",
+       "specialpages-group-developer": "Veglat e zhvilluesit",
        "blankpage": "Faqe e zbrazët",
        "intentionallyblankpage": "Kjo faqe me qëllim është lënë e zbrazët",
        "external_image_whitelist": "#Lëreni këtë rresht ashtu siç është<pre>\n#Vendosni shprehje fragmentesh të rregullta (vetëm pjesën që shkon ndërmjet //) poshtë\n#Këto do të krahasohen me URL-të  e figurave të jashtme\n#Ato që përputhen do të shfaqen si figura, të tjerat do të shfaqen vetëm si një lidhje\n#Rreshtat që fillojnë me # trajtohen si komente\n#Kjo është shumë e ndjeshme\n\n#Vendosini të fragmentet sipër këtij rreshti. Lëreni këtë rresht ashtu siç është</pre>",
        "tags-tag": "Emri i etiketës",
        "tags-display-header": "Pamja në listat e ndryshimeve",
        "tags-description-header": "Përshkrimi i plotë i kuptimit",
+       "tags-source-header": "Burimi",
+       "tags-active-header": "Aktiv?",
        "tags-hitcount-header": "Ndrzshimet e etikuara",
+       "tags-actions-header": "Veprimet",
+       "tags-active-yes": "Po",
+       "tags-active-no": "Jo",
+       "tags-source-extension": "Definuar nga softueri",
+       "tags-source-none": "Nuk përdorët më",
        "tags-edit": "redakto",
+       "tags-delete": "fshi",
+       "tags-activate": "aktivizo",
+       "tags-deactivate": "ç'aktivizo",
        "tags-hitcount": "$1 {{PLURAL:$1|ndryshim|ndryshime}}",
+       "tags-create-heading": "Krijoni një etiketë të re",
+       "tags-create-tag-name": "Emri i etiketës:",
        "tags-create-reason": "Arsyeja:",
+       "tags-create-submit": "Krijoni",
+       "tags-delete-title": "Gris etiketën",
        "tags-delete-reason": "Arsyeja:",
        "tags-activate-reason": "Arsyeja:",
+       "tags-activate-submit": "Aktivizo",
        "tags-deactivate-reason": "Arsyeja:",
        "tags-edit-reason": "Arsyeja:",
        "comparepages": "Krahasoni faqet",
        "compare-revision-not-exists": "Rishikimi që ju specifikuat nuk ekziston",
        "dberr-problems": "Na vjen keq! Kjo faqe po has vështirësi teknike.",
        "dberr-again": "Pritni disa minuta dhe provoni të ringarkoni faqen.",
-       "dberr-info": "(Nuk mund të lidhet me serverin bazë e të dhënave : $1)",
+       "dberr-info": "(Nuk mund të qaset në bazën e të dhënave: $1)",
        "dberr-usegoogle": "Ju mund të provoni të kërkoni përmes Googles në ndërkohë.",
        "dberr-outofdate": "Vini re se indekset e tyre të përmbajtjes tona mund të jetë e vjetëruar.",
        "dberr-cachederror": "Kjo është një kopje e faqes së kërkuar dhe mund të jetë e vjetëruar.",
        "htmlform-submit": "Dërgo",
        "htmlform-reset": "Zhbëj ndryshimin",
        "htmlform-selectorother-other": "Gjitha",
+       "htmlform-date-placeholder": "VVVV-MM-DD",
+       "htmlform-time-placeholder": "OO:MM:SS",
+       "htmlform-datetime-placeholder": "VVVV-MM-DD OO:MM:SS",
+       "htmlform-title-not-exists": "$1 nuk ekziston.",
+       "htmlform-user-not-exists": "<strong>$1</strong> nuk ekziston.",
        "logentry-delete-delete": "$1 {{GENDER:$2|grisi}} faqen $3",
        "logentry-delete-restore": "$1 {{GENDER:$2|riktheu}} faqen $3",
        "logentry-delete-event": "$1 {{GENDER:$2|ndryshoi}} dukshmërinë e {{PLURAL:$5|e një ngjarjeje regjistri|$5 ngjarjeve regjistri}} në $3: $4",
        "logentry-rights-autopromote": "$1 është {{GENDER:$2|promovuar}} automatikisht nga $4 në $5",
        "logentry-upload-upload": "$1 {{GENDER:$2|ngarkoi}} $3",
        "rightsnone": "(asgjë)",
-       "revdelete-summary": "përmbledhja redaktimit",
        "feedback-adding": "Duke shtuar përshtypjen te faqja...",
+       "feedback-back": "Prapa",
        "feedback-bugcheck": "Shumë mirë! Thjesht kontrolloni që nuk është një nga [$1 problemet e njohura].",
        "feedback-bugnew": "E kontrollova. Raporto një problem të ri",
        "feedback-bugornote": "Nëse jeni gati për të përshkruar një problem teknik me detaje ju lutemi [$1 raportoni një problem].\nPërndryshe, ju mund të formularin e thjeshtë më poshtë. Komenti juaj do të shtohet te faqja \"[$3 $2]\"\", së bashku me emrin tuaj të përdoruesit dhe shfletuesin të cilin jeni duke përdorur.",
        "feedback-cancel": "Anulo",
        "feedback-close": "Përfunduar",
+       "feedback-dialog-title": "Dërgo përshtypjet",
        "feedback-error1": "Gabim: Rezultat i panjohur nga API",
        "feedback-error2": "Gabim: Redaktimi dështoi",
        "feedback-error3": "Gabim: Nuk ka përgjigje nga API",
        "feedback-submit": "Dërgo",
        "feedback-thanks": "Faleminderit! Përshtypja juaj është postuar në faqen \"[$2 $1]\".",
        "feedback-thanks-title": "Ju faleminderit!",
-       "searchsuggest-search": "Kërko",
+       "searchsuggest-search": "Kërko {{SITENAME}}",
        "searchsuggest-containing": "përmban ...",
        "api-error-badtoken": "Gabim i brendshëm: Shenjë e keqe.",
        "api-error-emptypage": "Nuk lejohet krijimi i faqeve të reja bosh.",
        "api-error-stashfailed": "Gabim i brendshëm: Serveri nuk arriti të ruajë skedën e përkohshme.",
-       "api-error-unknown-warning": "Paralajmërim i panjohur: $1",
+       "api-error-unknown-warning": "Paralajmërim i panjohur: \"$1\".",
        "api-error-unknownerror": "Gabim i papërcaktuar: \"$1\".",
        "duration-seconds": "$1 {{PLURAL:$1|sekondë|sekonda}}",
        "duration-minutes": "$1 {{PLURAL:$1|minutë|minuta}}",
        "expand_templates_title": "Titulli i faqes për rrethanën, si {{FULLPAGENAME}} etj.:",
        "expand_templates_input": "Teksti me stampa:",
        "expand_templates_output": "Parapamja",
+       "expand_templates_xml_output": "Rezultat XML",
        "expand_templates_ok": "Shko",
        "expand_templates_remove_comments": "Hiq komentet",
+       "expand_templates_preview": "Parapamje",
+       "pagelanguage": "Ndrysho gjuhën e faqës",
+       "pagelang-name": "Faqja",
+       "pagelang-language": "Gjuha",
+       "pagelang-use-default": "Përdor gjuhën e parazgjedhur",
+       "pagelang-select-lang": "Zgjedh gjuhën",
+       "pagelang-reason": "Arsyeja",
+       "pagelang-submit": "Dërgo",
+       "pagelang-nonexistent-page": "Faqja $1 nuk ekziston.",
+       "right-pagelang": "Ndrysho gjuhën e faqës",
+       "action-pagelang": "ndrysho gjuhën e faqës",
+       "mediastatistics-table-mimetype": "Lloji MIME",
+       "mediastatistics-table-extensions": "Shtojcat e mundshme",
+       "mediastatistics-table-count": "Numri i skedave",
+       "mediastatistics-table-totalbytes": "Madhësia e kombinuar",
+       "mediastatistics-header-unknown": "I panjohur",
+       "mediastatistics-header-bitmap": "Imazh bitmap",
+       "mediastatistics-header-drawing": "Vizatime (imazhe vektor)",
+       "mediastatistics-header-audio": "Zërim",
+       "mediastatistics-header-video": "Video",
+       "mediastatistics-header-multimedia": "Media e pasur",
+       "mediastatistics-header-office": "Zyrë",
+       "mediastatistics-header-text": "Tekstor",
+       "mediastatistics-header-executable": "Të ekzekutueshmet",
+       "mediastatistics-header-archive": "Formate të komprimuara",
+       "mediastatistics-header-total": "Të gjitha skedat",
        "special-characters-group-latin": "Latinisht",
        "special-characters-group-latinextended": "Latanisht, zgjeruar",
        "special-characters-group-ipa": "Alfabeti Fonetik Ndërkombëtar (IPA)",
        "special-characters-group-symbols": "Simbolet",
        "special-characters-group-greek": "Grezisht",
+       "special-characters-group-greekextended": "Greke e zgjeruar",
        "special-characters-group-cyrillic": "Cirilik",
        "special-characters-group-arabic": "Arabisht",
+       "special-characters-group-arabicextended": "Arabishte e zgjeruar",
        "special-characters-group-persian": "Persisht",
        "special-characters-group-hebrew": "Hebraisht",
        "special-characters-group-bangla": "Bengalisht",
+       "special-characters-group-tamil": "Tamil",
        "special-characters-group-telugu": "Telugu",
        "special-characters-group-sinhala": "Singhalisht",
        "special-characters-group-gujarati": "Guxharati",
+       "special-characters-group-devanagari": "Devanagari",
        "special-characters-group-thai": "Thai",
        "special-characters-group-lao": "Lao",
        "special-characters-group-khmer": "Khmer",
+       "special-characters-title-endash": "viza e gjatë",
+       "special-characters-title-emdash": "viza më e gjatë",
+       "special-characters-title-minus": "shenja minus",
+       "mw-widgets-dateinput-no-date": "Nuk u zgjedh data",
        "mw-widgets-dateinput-placeholder-day": "VVVV-MM-DD",
-       "mw-widgets-dateinput-placeholder-month": "VVVV-MM"
+       "mw-widgets-dateinput-placeholder-month": "VVVV-MM",
+       "mw-widgets-mediasearch-input-placeholder": "Kërko media",
+       "mw-widgets-mediasearch-noresults": "Nuk është gjetur asnjë rezultat.",
+       "log-action-filter-all": "Të gjitha",
+       "log-action-filter-block-block": "Blloko",
+       "authmanager-email-label": "Email",
+       "authmanager-email-help": "Adresa e emailit:",
+       "authmanager-realname-label": "Emri i vërtetë",
+       "authmanager-realname-help": "Emri i vërtetë i përdoruesit",
+       "authmanager-provider-temporarypassword": "Fjalëkalim i përkohshëm",
+       "authprovider-resetpass-skip-label": "Kapërce",
+       "changecredentials": "Ndërro kredencialet",
+       "changecredentials-submit": "Ndërro kredencialet",
+       "changecredentials-invalidsubpage": "$1 nuk është tip i vlefshëm i kredencialit.",
+       "changecredentials-success": "Kredencialet tuaja kanë ndryshuar.",
+       "removecredentials": "Hiq kredencialet",
+       "removecredentials-submit": "Hiq kredencialet",
+       "removecredentials-invalidsubpage": "$1 nuk është tip i vlefshëm i kredencialit.",
+       "removecredentials-success": "Kredencialet tuaja kanë ndryshuar.",
+       "credentialsform-provider": "Tipi i kredencialit:",
+       "credentialsform-account": "Emri i llogarisë:",
+       "cannotlink-no-provider-title": "Nuk ka llogari të lidhshme",
+       "cannotlink-no-provider": "Nuk ka llogari të lidhshme.",
+       "linkaccounts": "Lidh llogari",
+       "linkaccounts-success-text": "Llogaria është lidhur.",
+       "linkaccounts-submit": "Lidh llogari",
+       "unlinkaccounts": "Ndaj llogaritë",
+       "unlinkaccounts-success": "Llogaria është ndarë.",
+       "restrictionsfield-badip": "Adresë ose varg IP-je e parregulltë: $1",
+       "restrictionsfield-label": "Vargu i lejuar i IP-së:",
+       "revid": "versioni $1",
+       "pageid": "ID e faqes $1",
+       "rawhtml-notallowed": "&lt;html&gt; etiketat nuk mund të përdorën jashtë faqeve normale."
 }
index 465d6fa..9ea137f 100644 (file)
        "toc": "Садржај",
        "showtoc": "прикажи",
        "hidetoc": "сакриј",
-       "collapsible-collapse": "скупи",
-       "collapsible-expand": "прошири",
+       "collapsible-collapse": "Скупи",
+       "collapsible-expand": "Ð\9fрошири",
        "confirmable-confirm": "Да ли {{GENDER:$1|сте}} сигурни?",
        "confirmable-yes": "Да",
        "confirmable-no": "Не",
        "recentchanges-summary": "Пратите скорашње измене на овој страници.",
        "recentchanges-noresult": "Нема промена у задатом времену за задате критеријуме.",
        "recentchanges-feed-description": "Пратите скорашње измене уз помоћ овог довода.",
-       "recentchanges-label-newpage": "Ð\9dова страница",
-       "recentchanges-label-minor": "Ð\9cања измена",
+       "recentchanges-label-newpage": "Ð\9eвом Ð¸Ð·Ð¼ÐµÐ½Ð¾Ð¼ Ð½Ð°Ð¿Ñ\80авÑ\99ена Ñ\98е Ð½ова страница",
+       "recentchanges-label-minor": "Ð\9eво Ñ\98е Ð¼ања измена",
        "recentchanges-label-bot": "Ову измену је направио бот",
        "recentchanges-label-unpatrolled": "Ова измена још није патролирана",
        "recentchanges-label-plusminus": "Промена величине странице у бајтовима",
        "zip-bad": "Датотека је оштећена или је нечитљива ZIP датотека.\nБезбедносна провера не може да се изврши како треба.",
        "zip-unsupported": "Датотека је формата ZIP који користи могућности које не подржава Медијавики.\nБезбедносна провера не може да се изврши како треба.",
        "uploadstash": "Тајно складиште",
-       "uploadstash-summary": "Ð\9eва Ñ\81Ñ\82Ñ\80аниÑ\86а Ð¿Ñ\80Ñ\83жа Ð¿Ñ\80иÑ\81Ñ\82Ñ\83п Ð´Ð°Ñ\82оÑ\82екама ÐºÐ¾Ñ\98е Ñ\81Ñ\83 Ð¿Ð¾Ñ\81лаÑ\82е (или Ñ\81е Ñ\88аÑ\99Ñ\83), Ð°Ð»Ð¸ Ñ\98оÑ\88 Ð½Ð¸Ñ\81Ñ\83 Ð¾Ð±Ñ\98авÑ\99ене. Ð\9eве Ð´Ð°Ñ\82оÑ\82еке Ñ\81Ñ\83 Ð²Ð¸Ð´Ñ\99иве Ñ\81амо ÐºÐ¾Ñ\80иÑ\81никÑ\83 ÐºÐ¾Ñ\98и Ð³Ð° Ñ\98е Ð¿Ð¾Ñ\81лао.",
+       "uploadstash-summary": "Ð\9eва Ñ\81Ñ\82Ñ\80аниÑ\86а Ð¿Ñ\80Ñ\83жа Ð¿Ñ\80иÑ\81Ñ\82Ñ\83п Ð´Ð°Ñ\82оÑ\82екама ÐºÐ¾Ñ\98е Ñ\81Ñ\83 Ð¾Ñ\82пÑ\80емÑ\99ене Ð¸Ð»Ð¸ Ñ\81е Ð¾Ñ\82пÑ\80емаÑ\98Ñ\83, Ð°Ð»Ð¸ Ñ\98оÑ\88 Ð½Ð¸Ñ\81Ñ\83 Ð¾Ð±Ñ\98авÑ\99ене. Ð\9eве Ð´Ð°Ñ\82оÑ\82еке Ð½Ð¸Ñ\81Ñ\83 Ð²Ð¸Ð´Ñ\99иве Ð½Ð¸ÐºÐ¾Ð¼Ðµ, Ð¾Ñ\81им ÐºÐ¾Ñ\80иÑ\81никÑ\83 ÐºÐ¾Ñ\98и Ð¸Ñ\85 Ñ\98е Ð¾Ñ\82пÑ\80емио.",
        "uploadstash-clear": "Очисти сакривене датотеке",
        "uploadstash-nofiles": "Немате сакривене датотеке.",
        "uploadstash-badtoken": "Извршавање дате радње није успело, разлог томе може бити истек времена за уређивање. Покушајте поново.",
        "undeleteviewlink": "погледај",
        "undeleteinvert": "Обрни избор",
        "undeletecomment": "Разлог:",
-       "undeletedrevisions": "{{PLURAL:$1|измена враћено}} $1",
-       "undeletedrevisions-files": "$1 {{PLURAL:$1|измена|измене|измена}} и $2 {{PLURAL:$2|датотека је враћена|датотеке су враћене|датотека је враћено}}",
-       "undeletedfiles": "{{PLURAL:$1|датотека враћено}} $1",
        "cannotundelete": "Враћање једне или свих ставник није успјело:\n$1",
        "undeletedpage": "<strong>Страница $1 је враћена</strong>\n\nПогледајте [[Special:Log/delete|дневник брисања]] за записе о скорашњим брисањима и враћањима.",
        "undelete-header": "Погледајте [[Special:Log/delete|историјат брисања]] за недавно обрисане странице.",
        "logentry-rights-rights": "$1 је {{GENDER:$2|променио|променила}} чланство групе за {{GENDER:$6|$3}} из $4 у $5",
        "logentry-rights-rights-legacy": "$1 је {{GENDER:$2|променио|променила}} чланство групе за $3",
        "logentry-rights-autopromote": "$1 је аутоматски {{GENDER:$2|унапређен|унапређена}} из $4 у $5",
-       "logentry-upload-upload": "$1 Ñ\98е {{GENDER:$2|поÑ\81лао|поÑ\81лала}} $3",
-       "logentry-upload-overwrite": "$1 Ñ\98е {{GENDER:$2|поÑ\81лао|поÑ\81лала}} нову верзију $3",
-       "logentry-upload-revert": "$1 Ñ\98е {{GENDER:$2|поÑ\81лао|поÑ\81лала}} $3",
+       "logentry-upload-upload": "$1 Ñ\98е {{GENDER:$2|оÑ\82пÑ\80емио|оÑ\82пÑ\80емила}} $3",
+       "logentry-upload-overwrite": "$1 Ñ\98е {{GENDER:$2|оÑ\82пÑ\80емио|оÑ\82пÑ\80емила}} нову верзију $3",
+       "logentry-upload-revert": "$1 Ñ\98е {{GENDER:$2|оÑ\82пÑ\80емио|оÑ\82пÑ\80емила}} $3",
        "log-name-managetags": "Дневник уређивања ознака",
        "log-description-managetags": "Овај дневник садржи списак измена у вези [[Special:Tags|ознака]]. Дневник садржи само радње извршене од стране администратора, уноси за ознаке направљене или обрисане од стране вики софтвера се не налазе у овом дневнику.",
        "logentry-managetags-create": "$1 је {{GENDER:$2|направио|направила}} ознаку „$4“",
index 6ff1b87..141dea8 100644 (file)
@@ -23,7 +23,8 @@
                        "Сербијана",
                        "Xð",
                        "Matma Rex",
-                       "Mega Aleksandar"
+                       "Mega Aleksandar",
+                       "Asmen"
                ]
        },
        "tog-underline": "Podvlačenje veza:",
        "toc": "Sadržaj",
        "showtoc": "prikaži",
        "hidetoc": "sakrij",
-       "collapsible-collapse": "skupi",
-       "collapsible-expand": "proširi",
+       "collapsible-collapse": "Skupi",
+       "collapsible-expand": "Proširi",
        "confirmable-confirm": "Da li {{GENDER:$1|ste}} sigurni?",
        "confirmable-yes": "Da",
        "confirmable-no": "Ne",
        "title-invalid-interwiki": "Zatraženi naslov stranice sadrži \"interwiki\" vezu koja ne može biti upotrebljenja za naslove.",
        "title-invalid-talk-namespace": "Zatraženi naslov strane se odnosi na stranicu za razgovor koja ne može da postoji.",
        "title-invalid-characters": "Traženi naslov ima nevažeće karaktere: „$1“.",
+       "title-invalid-relative": "Naslov ima relativan put. Relativni naslovi (./, ../) su nevažeći, zato što će često biti nedostupni kroz korisnički pretraživač.",
+       "title-invalid-magic-tilde": "Naslov stranice koju ste tražili je nevažeći jer sadrži magični niz tildi (<nowiki>~~~</nowiki>)",
+       "title-invalid-too-long": "Naslov stranice koju ste tražili je predugačak. Ne sme da bude duži od $1 {{PLURAL:$1|bajt|bajtovi}} u UTF-8 znacima.",
+       "title-invalid-leading-colon": "Naslov stranice koju ste tražili sadrži dvotačku na početku.",
        "perfcached": "Sledeći podaci su keširani i mogu biti zastareli. Keš sadrži najviše {{PLURAL:$1|jedan rezultat|$1 rezultata|$1 rezultata}}.",
        "perfcachedts": "Sledeći podaci su keširani i poslednji put su ažurirani $2 u $3. U kešu {{PLURAL:$4|1=je dostupan najviše jedan rezultat|su dostupna najviše $4 rezultata|je dostupno najviše $4 rezultata}}.",
        "querypage-no-updates": "Ažuriranje ove stranice je trenutno onemogućeno.\nPodaci koji se ovde nalaze mogu biti zastareli.",
        "viewsource": "Izvorni kod",
        "viewsource-title": "Izvorni tekst stranice $1",
        "actionthrottled": "Radnja je usporena",
-       "actionthrottledtext": "U cilju borbe protiv nepoželjnih poruka, ograničene su vam izmene u određenom vremenu, a upravo ste prešli to ograničenje. Pokušajte ponovo za nekoliko minuta.",
+       "actionthrottledtext": "Kao meru protiv zloupotrebe, ograničeno vam je izvođenje ove radnje previše puta u kratkom vremenskom periodu, a vi ste premašili ovo ograničenje.\nMolimo pokušajte ponovo za nekoliko minuta.",
        "protectedpagetext": "Ova stranica je zaključana za izmene i druge radnje.",
        "viewsourcetext": "Možete čitati i kopirati sadržaj ove stranice.",
        "viewyourtext": "Možete da pogledate i kopirate izvorni tekst <strong>vaših izmena</strong> na ovoj stranici.",
        "recentchanges-summary": "Pratite skorašnje izmene na ovoj stranici.",
        "recentchanges-noresult": "Nema promena u zadatom vremenu za zadate kriterijume.",
        "recentchanges-feed-description": "Pratite skorašnje izmene uz pomoć ovog dovoda.",
-       "recentchanges-label-newpage": "Nova stranica",
-       "recentchanges-label-minor": "Manja izmena",
+       "recentchanges-label-newpage": "Ovom izmenom napravljena je nova izmena",
+       "recentchanges-label-minor": "Ovo je manja izmena",
        "recentchanges-label-bot": "Ovu izmenu je napravio bot",
        "recentchanges-label-unpatrolled": "Ova izmena još nije patrolirana",
        "recentchanges-label-plusminus": "Promena veličine stranice u bajtovima",
        "zip-bad": "Datoteka je oštećena ili je nečitljiva ZIP datoteka.\nBezbednosna provera ne može da se izvrši kako treba.",
        "zip-unsupported": "Datoteka je formata ZIP koji koristi mogućnosti koje ne podržava Medijaviki.\nBezbednosna provera ne može da se izvrši kako treba.",
        "uploadstash": "Tajno skladište",
-       "uploadstash-summary": "Ova stranica pruža pristup datotekama koje su poslate (ili se šalju), ali još nisu objavljene. Ove datoteke su vidljive samo korisniku koji ga je poslao.",
+       "uploadstash-summary": "Ova stranica pruža pristup datotekama koje su otpremljene ili se otpremaju, ali još nisu objavljene. Ove datoteke nisu vidljive nikome, osim korisniku koji ih je otpremio.",
        "uploadstash-clear": "Očisti sakrivene datoteke",
        "uploadstash-nofiles": "Nemate sakrivene datoteke.",
        "uploadstash-badtoken": "Izvršavanje date radnje nije uspelo. Razlog tome može biti istek vremena za uređivanje. Pokušajte ponovo.",
        "undeleteviewlink": "pogledaj",
        "undeleteinvert": "Obrni izbor",
        "undeletecomment": "Razlog:",
-       "undeletedrevisions": "{{PLURAL:$1|izmena vraćeno}} $1",
-       "undeletedrevisions-files": "$1 {{PLURAL:$1|izmena|izmene|izmena}} i $2 {{PLURAL:$2|datoteka je vraćena|datoteke su vraćene|datoteka je vraćeno}}",
-       "undeletedfiles": "{{PLURAL:$1|datoteka vraćeno}} $1",
        "cannotundelete": "Vraćanje nije uspelo:\n$1",
        "undeletedpage": "<strong>Stranica $1 je vraćena</strong>\n\nPogledajte [[Special:Log/delete|dnevnik brisanja]] za zapise o skorašnjim brisanjima i vraćanjima.",
        "undelete-header": "Pogledajte [[Special:Log/delete|istorijat brisanja]] za nedavno obrisane stranice.",
        "hebrew-calendar-m6": "Adar",
        "hebrew-calendar-m6a": "Adar I",
        "hebrew-calendar-m6b": "Adar II",
-       "hebrew-calendar-m7": "Nisan",
+       "hebrew-calendar-m7": "Nisane",
        "hebrew-calendar-m8": "Ijar",
        "hebrew-calendar-m9": "Sivan",
        "hebrew-calendar-m10": "Tamuz",
        "hebrew-calendar-m6-gen": "Adar",
        "hebrew-calendar-m6a-gen": "Adar I",
        "hebrew-calendar-m6b-gen": "Adar II",
-       "hebrew-calendar-m7-gen": "Nisan",
+       "hebrew-calendar-m7-gen": "Nisane",
        "hebrew-calendar-m8-gen": "Ijar",
        "hebrew-calendar-m9-gen": "Sivan",
        "hebrew-calendar-m10-gen": "Tamuz",
        "logentry-rights-rights": "$1 je {{GENDER:$2|promenio|promenila}} članstvo grupe za {{GENDER:$6|$3}} iz $4 u $5",
        "logentry-rights-rights-legacy": "$1 je {{GENDER:$2|promenio|promenila}} čalnstvo grupe za $3",
        "logentry-rights-autopromote": "$1 je automatski {{GENDER:$1|unapređen|unapređena}} iz $4 u $5",
-       "logentry-upload-upload": "$1 je {{GENDER:$2|poslao|poslala}} $3",
-       "logentry-upload-overwrite": "$1 je {{GENDER:$2|poslao|poslala}} novu verziju $3",
-       "logentry-upload-revert": "$1 je {{GENDER:$2|poslao|poslala}} $3",
+       "logentry-upload-upload": "$1 je {{GENDER:$2|otpremio|otpremila}} $3",
+       "logentry-upload-overwrite": "$1 je {{GENDER:$2|otpremio|otpremila}} novu verziju $3",
+       "logentry-upload-revert": "$1 je {{GENDER:$2|otpremio|otpremila}} $3",
        "log-name-managetags": "Dnevnik uređivanja oznaka",
        "log-description-managetags": "Ovaj dnevnik sadrži spisak izmena u vezi [[Special:Tags|oznaka]]. Dnevnik sadrži samo radnje izvršene od strane administratora, unosi za oznake napravljene ili obrisane od strane viki softvera se ne nalaze u ovom dnevniku.",
        "logentry-managetags-create": "$1 je {{GENDER:$2|napravio|napravila}} oznaku „$4“",
index f191865..92c0899 100644 (file)
                        "Urhixidur",
                        "לערי ריינהארט",
                        "아라",
-                       "Macofe"
+                       "Macofe",
+                       "Uchup19"
                ]
        },
        "tog-underline": "Gurat-handapan tutumbu",
-       "tog-hideminor": "Sumputkeun éditan minor dina nu anyar robah",
+       "tog-hideminor": "Sumputkeun éditan minor dina anyar robah",
        "tog-hidepatrolled": "Sumputkeun anu geus diroris ti béréndélan nu anyar robah",
        "tog-newpageshidepatrolled": "Sumputkeun nu geus diroris tina béréndélan kaca anyar",
        "tog-extendwatchlist": "Legaan béréndélan ngarah sakabéh parobahanana kaawaskeun",
@@ -38,7 +39,7 @@
        "tog-enotifrevealaddr": "Témbongkeun alamat surélék kuring dina surat émbaran",
        "tog-shownumberswatching": "Témbongkeun jumlah nu ngawaskeun",
        "tog-oldsig": "Paraf nu geus aya:",
-       "tog-fancysig": "Témbongkeun paraf salaku wikitext (tanpa tumbu otomatis)",
+       "tog-fancysig": "Témbongkeun tanda tangan salaku wikitext (tanpa tutumbu otomatis)",
        "tog-uselivepreview": "Paké pratayang langsung",
        "tog-forceeditsummary": "Mun kotak ringkesan éditan masih kosong, béjaan!",
        "tog-watchlisthideown": "Sumputkeun éditan kuring dina daptar awaskeuneun",
        "tog-prefershttps": "Salawasna paké sambungan aman nalika asup log",
        "underline-always": "Salawasna",
        "underline-never": "Ulah",
-       "underline-default": "Buhunna kulit atawa panyungsi",
-       "editfont-style": "Gaya aksara dina kotak éditan:",
-       "editfont-default": "Luyu jeung buhunna panyungsi",
-       "editfont-monospace": "Aksara monospasi",
+       "underline-default": "Kalakop atawa panyungsi bawaan",
+       "editfont-style": "Gaya tulisan komputer dina kotak éditan:",
+       "editfont-default": "Bawaan panyungsi",
+       "editfont-monospace": "Tulisan monospasi",
        "editfont-sansserif": "Aksara Sans-serif",
        "editfont-serif": "Aksara Serif",
        "sunday": "Minggu",
@@ -68,7 +69,7 @@
        "thursday": "Kemis",
        "friday": "Jumaah",
        "saturday": "Saptu",
-       "sun": "Ming",
+       "sun": "Min",
        "mon": "Sen",
        "tue": "Sal",
        "wed": "Reb",
        "category-subcat-count-limited": "Ieu kategori ngawengku {{PLURAL:$1|subkategori|$1 subkategori}}.",
        "category-article-count": "{{PLURAL:$2|Ieu kategori ngan ngawengku nu di handap.|{{PLURAL:$1|kaca|$1 kaca}} ti $2 di handap asup kana ieu kategori.}}",
        "category-article-count-limited": "{{PLURAL:$1|Kaca|$1 kaca}} di handap kaasup kana kategori.",
-       "category-file-count": "{{PLURAL:$2|Kategori didieu ngan boga gambar ieu.|Tembongkeun {{PLURAL:$1|gambar|$1 gambar}} nukaasup dina kategori ieu ti kabeh $2.}}",
-       "category-file-count-limited": "Kategori didieu ngabogaan {{PLURAL:$1|gambar|$1 gambar}} ieu.",
+       "category-file-count": "{{PLURAL:$2|Ieu kategori ngan boga berkas di handap.|{{PLURAL:$1|berkas|$1 berkas}} di handap aya dina ieu kategori, ti jumlah $2.}}",
+       "category-file-count-limited": "{{PLURAL:$1|berkas|$1 berkas}} di handap aya dina kategori ieu.",
        "listingcontinuesabbrev": "(samb.)",
        "index-category": "Kaca nu diindéks",
        "noindex-category": "Kaca nu teu diindéks",
        "faq": "NLD",
        "faqpage": "Project:NLD",
        "actions": "Peta",
-       "namespaces": "Spasi ngaran",
+       "namespaces": "Ngaranspasi",
        "variants": "Varian",
-       "navigation-heading": "Ménu navigasi",
+       "navigation-heading": "Menu navigasi",
        "errorpagetitle": "Kasalahan",
        "returnto": "Balik deui ka $1.",
        "tagline": "Ti {{SITENAME}}",
        "help": "Pitulung",
-       "search": "Sungsi",
-       "searchbutton": "Sungsi",
+       "search": "Paluruh",
+       "searchbutton": "Paluruh",
        "go": "Jung",
        "searcharticle": "Jung",
        "history": "Jujutan kaca",
        "history_short": "Jujutan",
+       "history_small": "jujutan",
        "updatedmarker": "dirobah saprak pamungkas datangna kuring",
        "printableversion": "Vérsi citakeun",
        "permalink": "Tutumbu permanén",
        "talk": "Sawala",
        "views": "Témbongan",
        "toolbox": "Parabot",
+       "tool-link-userrights": "Robah kelompok {{GENDER:$1|pamaké}}",
+       "tool-link-userrights-readonly": "Témbong kelompok {{GENDER:$1|pamaké}}",
+       "tool-link-emailuser": "Kirim surélék ka ieu {{GENDER:$1|pamaké}}",
        "userpage": "Témbongkeun kaca pamaké",
        "projectpage": "Témbongkeun kaca proyék",
        "imagepage": "Tempo kaca gambar",
        "protectedpage": "Kaca nu dikonci",
        "jumpto": "Luncat ka:",
        "jumptonavigation": "pituduh",
-       "jumptosearch": "sungsi",
+       "jumptosearch": "paluruh",
        "view-pool-error": "Punten, serverna keur pinuh.\nLoba teuing nu nyoba muka ieu kaca.\nMangga cobian sanés waktos.\n\n$1",
        "generic-pool-error": "Hampura, serverna keur pinuh.\nLoba teuing nu nyoba muka ieu sumberdaya.\nAntosan sakedap, engké cobaan deui.",
        "pool-timeout": "Béakeun waktu nungguan konci",
        "versionrequired": "Butuh MediaWiki vérsi $1",
        "versionrequiredtext": "Butuh MediaWiki vérsi $1 pikeun migunakeun ieu kaca. Mangga tingal [[Special:Version|kaca vérsi]]",
        "ok": "Heug",
-       "retrievedfrom": "Disalin ti \"$1\"",
+       "retrievedfrom": "Dicomot ti \"$1\"",
        "youhavenewmessages": "Anjeun boga $1 ($2).",
        "youhavenewmessagesfromusers": "{{PLURAL:$4|Anjeun boga}} $1 ti {{PLURAL:$3|pamaké séjén|$3 pamaké}} ($2).",
        "youhavenewmessagesmanyusers": "Anjeun boga $1 ti pamaké lian ($2).",
        "nstab-category": "Kategori",
        "mainpage-nstab": "Tepas",
        "nosuchaction": "Teu aya peta kitu",
-       "nosuchactiontext": "Peta nu diketik na URL teu dipikawanoh ku wiki.\nKadé bisi salah ketik atawa nuturkeun tumbu nu salah.\nHal ieu bisa ogé kulantaran ayana kutu (bug) dina sopwér nu dipaké ku {{SITENAME}}.",
+       "nosuchactiontext": "Peta nu diketik dina URL henteu sah.\nKadé bisi salah ketik atawa nuturkeun tutumbu anu salah.\nHal ieu bisa ogé kulantaran ayana kutu (bug) dina sopwér anu dipaké ku {{SITENAME}}.",
        "nosuchspecialpage": "Teu aya kaca husus nu kitu",
        "nospecialpagetext": "<strong>Anjeun ménta kaca husus nu teu dipikawanoh.</strong>\nKaca husus anu bener bisa ditempo béréndélanana dina [[Special:SpecialPages|{{int:specialpages}}]].",
        "error": "Kasalahan",
        "title-invalid-talk-namespace": "Judul kaca anu dipénta nujul ka kaca obrolan anu teu mungkin aya.",
        "title-invalid-characters": "Judul kaca anu dipénta ngandung karakter anu henteu sah: \"$1\".",
        "title-invalid-relative": "Judul ngandung jalur rélatip. Judul kaca rélatip (./, ../) henteu sah, kusabab bakal mindeng teu kahontal nalika dibuka maké browser pamaké.",
-       "title-invalid-magic-tilde": "Judul kaca anu dipénta ngandung sékuéns gelombang sulap (<nowiki>~~~</nowiki>).",
+       "title-invalid-magic-tilde": "Judul kaca anu dipénta ngandung tilda anu teu sah (<nowiki>~~~</nowiki>).",
        "title-invalid-too-long": "Judul kaca anu dipundut panjang teuing. Ulah leuwih ti $1 {{PLURAL:$1|bit}} dina panyandi UTF-8.",
        "title-invalid-leading-colon": "Judul kaca anu dipénta dimimitian ku kolon anu henteu sah.",
        "perfcached": "Data di handap ieu mangrupa 'cache' sahingga bisa jadi henteu mutahir. 'Cache' nyadiakeun paling loba {{PLURAL:$1|hiji hasil|$1 hasil}}.",
        "virus-scanfailed": "nyekén gagal (kode $1)",
        "virus-unknownscanner": "antivirus teu dipikawanoh:",
        "logouttext": "<strong>Anjeun ayeuna geus kaluar log.<strong>\n\nMangkahadé, sababaraha kaca bakal tetep némbongkeun saolah-olah asup kénéh log nepi ka anjeun ngosongkeun ''cache'' dina panyungsi.",
+       "cannotlogoutnow-title": "Teu bisa kaluar log ayeuna",
+       "cannotlogoutnow-text": "Kaluar log teu mungkin bisa nalika keur ngagunakeun $1.",
        "welcomeuser": "Bagéa, $1!",
        "welcomecreation-msg": "Akun anjeun geus dijieun.\nLamun minat, Anjeun bisa ngarobah [[Special:Preferences|préferénsi]] {{SITENAME}}.",
        "yourname": "Sandiasma:",
        "createacct-yourpasswordagain-ph": "Asupkeun deui kecap sandi",
        "userlogin-remembermypassword": "Jaga ngarah angger asup log",
        "userlogin-signwithsecure": "Paké sambungan aman",
+       "cannotlogin-title": "Teu bisa asup log",
+       "cannotlogin-text": "Asup log teu mungkin bisa",
+       "cannotloginnow-title": "Teu bisa asup log ayeuna",
+       "cannotloginnow-text": "Kaluar log teu mungkin bisa nalika keur ngagunakeun $1.",
+       "cannotcreateaccount-title": "Teu bisa nyieun akun",
        "yourdomainname": "Domain anjeun",
        "password-change-forbidden": "Anjeun teu bisa ngarobah kecap sandi dina ieu wiki.",
-       "externaldberror": "Aya kasalahan dina pangkalan data oténtikasi luar, atawa anjeun mémang teu diwenangkeun pikeun ngaropéa rekening luar anjeun.",
+       "externaldberror": "Aya kasalahan dina pangkalan data oténtikasi luar, atawa anjeun mémang teu diwenangkeun pikeun ngaropéa akun luar anjeun.",
        "login": "Asup log",
        "nav-login-createaccount": "Nyieun akun/asup log",
-       "userlogin": "Asup log / jieun akun",
-       "userloginnocreate": "Asup log",
        "logout": "Kaluar log",
        "userlogout": "Kaluar log",
        "notloggedin": "Can asup log",
        "userlogin-noaccount": "Teu boga akun?",
        "userlogin-joinproject": "Ngiluan {{SITENAME}}",
-       "nologin": "Teu boga akun? '''$1'''.",
-       "nologinlink": "Jieun akun",
        "createaccount": "Jieun akun",
-       "gotaccount": "Geus boga akun? '''$1'''.",
-       "gotaccountlink": "Asup log",
-       "userlogin-resetlink": "Poho akun sorangan?",
        "userlogin-resetpassword-link": "Poho kecap sandi?",
        "userlogin-helplink2": "Pitulung asup log",
        "userlogin-loggedin": "Anjeun geus asup log salaku {{GENDER:$1|$1}}.\nPaké pormulir di handap pikeun asup log salaku pamaké séjén.",
        "createacct-another-email-ph": "Asupkeun alamat surélék",
        "createaccountmail": "Paké kecap sandi acak sarta kirim ka alamat surélék",
        "createacct-realname": "Ngaran asli (teu wajib)",
-       "createaccountreason": "Alesan:",
        "createacct-reason": "Alesan",
        "createacct-reason-ph": "Naha bet nyieun akun séjén",
        "createacct-submit": "Jieun akun anjeun",
-       "createacct-another-submit": "Jieun akun séjén",
+       "createacct-another-submit": "Jieun akun",
        "createacct-benefit-heading": "{{SITENAME}} téh dijieun ku jalma-jalma siga anjeun.",
        "createacct-benefit-body1": "{{PLURAL:$1|édit|édit}}",
        "createacct-benefit-body2": "{{PLURAL:$1|kaca|kaca}}",
        "userexists": "Sandiasma nu diasupkeun geus aya nu maké.\nMangga pilih sandiasma nu séjén.",
        "loginerror": "Kasalahan asup log",
        "createacct-error": "Nyieun akun éror",
-       "createaccounterror": "Teu bisa nyieun rekening: $1",
-       "nocookiesnew": "Rekening pamaké geus dijieun, tapi anjeun can asup log. {{SITENAME}} maké ''cookies'' pikeun ngasupkeun log pamaké. Anjeun boga ''cookies'' nu ditumpurkeun. Mangga fungsikeun, teras asup log migunakeun ngaran pamaké sarta sandi nu anyar.",
+       "createaccounterror": "Teu bisa nyieun akun: $1",
+       "nocookiesnew": "Akun pamaké geus dijieun, tapi anjeun can asup log. {{SITENAME}} maké ''cookies'' pikeun ngalog pamaké. Anjeun boga ''cookies'' nu ditumpurkeun. Mangga fungsikeun, teras asup log migunakeun sandiasma sarta kecap sandi anu anyar.",
        "nocookieslogin": "{{SITENAME}} migunakeun ''cookies'' pikeun ngasupkeun pamaké kana log. Anjeun boga ''cookies'' nu ditumpurkeun. Mangga pungsikeun sarta cobian deui.",
        "nocookiesfornew": "Akun pamaké teu bisa dijieun, kusabab sumberna teu bisa dipastikeun.\nPariksa kukisna bisi tumpur, terus cobaan muat ulang ieu kaca.",
        "noname": "Anjeun teu nuliskeun ngaran pamaké nu sah.",
-       "loginsuccesstitle": "Asup log geus hasil",
+       "loginsuccesstitle": "Geus asup log",
        "loginsuccess": "Anjeun ayeuna geus asup log ka {{SITENAME}} salaku \"$1\".",
-       "nosuchuser": "Euweuh pamaké nu ngaranna \"$1\".\nNgaran pamaké ngabedakeun hurup kapital.\nPariksa éjahanana, atawa paké formulir di handap pikeun [[Special:CreateAccount|nyieun rekening anyar]].",
+       "nosuchuser": "Euweuh pamaké nu ngaranna \"$1\".\nNgaran pamaké ngabedakeun gedé leutikna hurup.\nPariksa éjahanana, atawa [[Special:CreateAccount|nyieun akun anyar]].",
        "nosuchusershort": "Taya pamaké nu ngaranna \"$1\", pariksa éjahanana!",
        "nouserspecified": "Anjeun kudu ngeusian ngaran landihan.",
        "login-userblocked": "Ieu pamaké keur dipeungpeuk, teu diwenangkeun asup log.",
        "wrongpasswordempty": "Sandina can kaeusian. Cobaan deui!",
        "passwordtooshort": "Sandina kudu diwangun ku sahanteuna {{PLURAL:$1|1 karakter|$1 karakter}}.",
        "passwordtoolong": "Kecap sandi teu bisa leuwih ti {{PLURAL:$1|1 karakter|$1 karakter}}.",
-       "password-name-match": "Sandi anjeun kudu béda ti landihan.",
+       "password-name-match": "Kecap sandi anjeun kudu béda ti sandiasma.",
        "password-login-forbidden": "Sandiasma jeung sandina teu bisa dipaké.",
        "mailmypassword": "Setél ulang kecap sandi",
        "passwordremindertitle": "Pangéling sandi ti {{SITENAME}}",
        "noemail": "Teu aya alamat surélék karékam pikeun \"$1\".",
        "noemailcreate": "Anjeun kudu nyadiakeun alamat surélék anu bener",
        "passwordsent": "Sandi anyar geus dikirim ka alamat surélék nu kadaptar pikeun \"$1\". Mangga asup log deui satutasna katarima.",
-       "blocked-mailpassword": "Alamat IP anjeun dipeungpeuk tina kabisa ngédit, sarta moal bisa maké fungsi ganti kecap sandi ngarah hanteu disalahgunakeun.",
+       "blocked-mailpassword": "Alamat IP anjeun dipeungpeuk tina kabisa ngédit. Pikeun nyingkahan panyalahgunaan, Anjeun teu dimeunangkeun pikeun mermanakeun kecap sandi liwat ieu alamat IP.",
        "eauthentsent": "Surélék konfirmasi geus dikirim ka alamat bieu.\nMéméh aya surat séjén asup ka akunna, anjeun kudu nuturkeun pituduh dina surélékna pikeun mastikeun yén akun éta téh bener boga anjeun.",
        "throttled-mailpassword": "Surélék pikeun ngarobah kecap sandi geus dikirim {{PLURAL:$1|jam|$1 jam}} kaliwat.\nNgarah hanteu disalahgunakeun, ngan hiji surélék anu bakal dikirim saban {{PLURAL:$1|jam|$1 jam}}.",
        "mailerror": "Kasalahan ngirim surat: $1",
-       "acct_creation_throttle_hit": "Punten,pamaké alamat IP anjeun geus nyieun {{PLURAL:$1|1 rekening|$1 rekening}} dina sapoé ieu. mangrupa jumlah nu di idinan dina sapoé.\nanjeun teu bisa nyieun deui samentara waktu.",
+       "acct_creation_throttle_hit": "Anu ngaranjang ka ieu wiki maké alamat IP anjeun geus nyieun {{PLURAL:$1|1 akun|$1 akun}} salila $2, mangrupa jumlah anu diidinan dina sapoé.\nKu kituna, anu ngaranjang maké ieu alamat IP samentawis mah moal bisa nyieun akun deui heula.",
        "emailauthenticated": "Alamat surélék anjeun geus dikonfirmasi $2 tabuh $3.",
        "emailnotauthenticated": "Alamat surélék anjeun can dikonfirmasi.\nMoal aya surélék nu bakal dikirim pikeun fitur-fitur di handap ieu.",
        "noemailprefs": "Teu aya alamat surélék, fitur di handap moal bisa jalan.",
        "invalidemailaddress": "Alamat surélék teu bisa ditarima sabab formatna salah.\nMangga lebetkeun alamat nu formatna bener atawa kosongkeun baé.",
        "cannotchangeemail": "Alamat surat-é akun hanteu bisa dirobah di ieu wiki.",
        "emaildisabled": "Ieu loka teu bisa ngirim surélék.",
-       "accountcreated": "Rekening geus dijieun.",
+       "accountcreated": "Akun geus dijieun",
        "accountcreatedtext": "Akun pamaké [[{{ns:Pamaké}}:$1|$1]] ([[{{ns:Obrolan pamaké}}:$1|obrolan]]) geus dijieun.",
-       "createaccount-title": "Nyieun rekening keur {{SITENAME}}",
-       "createaccount-text": "Aya nu nyieun rekening pikeun alamat surélék anjeun di {{SITENAME}} ($4) maké landihan \"$2\" sarta sandi \"$3\". Anjeun kudu asup log sarta ngaganti sandina ayeuna kénéh.\n\nMun ieu rekening balukar ayana éror, teu kudu diwaro.",
+       "createaccount-title": "Nyieun akun pikeun {{SITENAME}}",
+       "createaccount-text": "Aya nu nyieun akun pikeun alamat surélék anjeun di {{SITENAME}} ($4) maké sandiasma \"$2\" kalawan kecap sandi \"$3\". Anjeun kudu asup log sarta ngaganti kecap sandina.\n\nMun ieu akun dijieun alatan éror, ulah diwaro.",
        "login-throttled": "Anjeun geus loba teuing nyobaan asup log.\nTungguan $1, laju cobaan deui.",
-       "login-abort-generic": "Login gagal - Dibolaykeun",
+       "login-abort-generic": "Asup log anjeun gagal - Dibolaykeun",
        "login-migrated-generic": "Akun anjeun geus pindah, ku kituna sandiasma anjeun geus leungit ti ieu wiki.",
        "loginlanguagelabel": "Basa: $1",
        "suspicious-userlogout": "Pamundut anjeun pikeun kaluar log ditolak ku sabab sigana dikirim ku pangaprak buntu atawa ''cache'' proxi.",
        "createacct-another-realname-tip": "Ngaran asli hanteu diwajibkeun.\nLamun anjeun milih ngeusian, ieu ngaran bakal dipaké pikeun nandaan kontribusi anjeun.",
        "pt-login": "Asup log",
        "pt-login-button": "Asup log",
+       "pt-login-continue-button": "Tuluykeun asup log",
        "pt-createaccount": "Jieun akun",
        "pt-userlogout": "Kaluar log",
        "php-mail-error-unknown": "Kasalahan nu teu kanyahoan dina fungsi PHP surélék().",
        "changepassword": "Robah sandi",
        "resetpass_announce": "Pikeun nganggeuskeun asup log, anjeun kudu nyieun kecap sandi anyar.",
        "resetpass_text": "<!-- Tambahkeun téks di dieu -->",
-       "resetpass_header": "Ganti sandi rekening",
+       "resetpass_header": "Robah kecap sandi akun",
        "oldpassword": "Sandi heubeul",
        "newpassword": "Sandi anyar:",
        "retypenew": "Ketik ulang sandi",
        "resetpass_submit": "Setél log asup katut sandina",
        "changepassword-success": "Kecap sandi Anjeun geus laksana dirobah!",
        "changepassword-throttled": "Anjeun geus loba teuing nyobaan asup log.\nTungguan $1 méméh nyobaan deui.",
+       "botpasswords": "Kecap sandi bot",
+       "botpasswords-label-appid": "Ngaran bot:",
+       "botpasswords-label-create": "Jieun",
+       "botpasswords-label-update": "Anyarkeun",
+       "botpasswords-label-cancel": "Bolay",
+       "botpasswords-label-delete": "Pupus",
+       "botpasswords-label-resetpassword": "Balikeun deui kecap sandi",
        "resetpass_forbidden": "Sandi henteu bisa dirobah",
        "resetpass-no-info": "Anjeun kudu asup log pkeun bisa muka ieu kaca sacara langsung.",
-       "resetpass-submit-loggedin": "Ganti kecap sandi rekening",
+       "resetpass-submit-loggedin": "Robah kecap sandi",
        "resetpass-submit-cancel": "Bolay",
        "resetpass-wrong-oldpass": "Salah sandi.\nBisa jadi anjeun geus ngaganti sandina atawa ménta sandi saheulaanan anu anyar.",
        "resetpass-recycled": "Mangga ganti kecap sandi anjeun ku nu anyar.",
        "passwordreset-emaildisabled": "Fitur surélék ditumpurkeun di ieu wiki.",
        "passwordreset-username": "Sandiasma:",
        "passwordreset-domain": "Domain:",
-       "passwordreset-capture": "Témbongkeun surat-é hasilna?",
-       "passwordreset-capture-help": "Upama anjeun nyéntang ieu kotak, surélék (anu ngirimkeun kecap sandi saheulaanan) bakal ditémbongkeun ka anjeun sarta dikirimkeun ka pamakéna.",
        "passwordreset-email": "Alamat surélék:",
        "passwordreset-emailtitle": "Wincikan akun di {{SITENAME}}",
        "passwordreset-emailtext-ip": "Aya (sigana anjeun, ti alamat IP $1) ménta nyetél ulang kecap sandi pikeun {{SITENAME}} ($4). {{PLURAL:$3|Akun}} di handap tumali jeung alamat ieu surélék:\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 teu rumasa nyieun ieu paménta, atawa lamun geus inget sandi aslina sarta moal dirobah, ieu surat teu kudu diwaro.",
        "minoredit": "Ieu éditan minor",
        "watchthis": "Awaskeun kaca ieu",
        "savearticle": "Simpen",
+       "savechanges": "Simpen parobahan",
+       "publishpage": "Pedalkeun kaca",
+       "publishchanges": "Pedalkeun parobahan",
        "preview": "Pramidang",
        "showpreview": "Témbongkeun pramidang",
        "showdiff": "Témbongkeun parobahan",
        "missingsummary": "'''Pépéling:''' Anjeun can ngeusian sari éditan. Mun anjeun ngaklik deui Simpen, éditan anjeun bakal disimpen tanpa sari éditan",
        "selfredirect": "<strong>Awas:</strong> Anjeun ngalihkeun ieu kaca ka asalna.\nAnjeun sigana salah ngasupkeun tujul alihan, atawa ngédit kaca anu salah.\nUpama anjeun ngaklik deui \"{{int:savearticle}}\", alihanana bakal angger dijieun.",
        "missingcommenttext": "Mangga tulis koméntar di handapeun ieu.",
-       "missingcommentheader": "'''Pépéling''': Anjeun can ngeusian judul pikeun ieu koméntar.\nMun anjeun ngaklik deui \"{{int:savearticle}}\", éditan anjeun bakal disimpen tanpa koméntar.",
+       "missingcommentheader": "<strong>Pépéling</strong>: Anjeun can ngeusian judul pikeun ieu koméntar.\nMun anjeun ngaklik deui \"{{int:savearticle}}\", éditan anjeun bakal disimpen tanpa koméntar.",
        "summary-preview": "Ringkesan pramidang:",
        "subject-preview": "Sawangan subyek/tajuk:",
        "previewerrortext": "Aya éror nalika nyobaan nyawang robahan anjeun.",
        "noarticletext": "Kiwari can aya téks dina ieu kaca.\nAnjeun bisa [[Special:Search/{{PAGENAME}}|nyusud judul ieu kaca]] dina kaca séjén,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} nyusud log nu tumali],\natawa [{{fullurl:{{FULLPAGENAME}}|action=edit}} nyieun ieu kaca]</span>.",
        "noarticletext-nopermission": "Kiwari can aya téks dina ieu kaca.\nAnjeun bisa [[Special:Search/{{PAGENAME}}|nyusud judul ieu kaca]] dina kaca séjén,atawa <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} nyusud log nu tumali]</span>, tapi teu wenang pikeun nyieun ieu kaca.",
        "missing-revision": "Révisi #$1 kaca \"{{FULLPAGENAME}}\" teu aya.\n\nKajadian ieu biasana kusabab nuturkeun tutumbu jujutan kaca anu geus dihapus.\nWincikanana bisa ditempo di [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log hapusan].",
-       "userpage-userdoesnotexist": "Rekening pamaké \"<nowiki>$1</nowiki>\" tacan kadaptar. Mangga tilikan lamun anjeun hoyong ngadamel/ngédit kaca ieu.",
-       "userpage-userdoesnotexist-view": "Rekening pamaké \"$1\" teu aya dina daptar.",
+       "userpage-userdoesnotexist": "Akun pamaké \"<nowiki>$1</nowiki>\" tacan kadaptar. Mangga riksa lamun anjeun hoyong ngadamel/ngédit ieu kaca.",
+       "userpage-userdoesnotexist-view": "Akun pamaké \"$1\" teu aya dina daptar.",
        "blocked-notice-logextract": "Ieu pamaké keur dipeungpeuk.\nPikeun rujukan, éntri log panungtung dipidangkeun di handap:",
        "clearyourcache": "<strong>Catet:</strong> Sanggeus nyimpen, anjeun kudu narabas singgahan panyungsi anjeun pikeun nempo parobahanana.\n* <strong>Firefox/Safari:</strong> Tahan <em>Shift</em> bari ngaklik <em>Reload</em>, atawa pencét boh <em>Ctrl-F5</em> atawa <em>Ctrl-R</em> (<em>⌘-R</em> dina Mac)\n* <strong>Google Chrome:</strong> Pencét <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> dina Mac)\n* <strong>Internet Explorer:</strong> Tahan <em>Ctrl</em> bari ngaklik <em>Refresh</em>, atawa pencét <em>Ctrl-F5</em>\n* <strong>Opera:</strong> Kosongkeun singgahan dina <em>Tools → Preferences</em>",
        "usercssyoucanpreview": "Tip:''' Paké tombol \"{{int:showpreview}}\" pikeun nyobaan CSS anyar anjeun méméh nyimpen.",
        "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",
-       "cantcreateaccount-text": "Nyieun rekening ti ieu alamat IP ('''$1''') dipeungpeuk ku [[User:$3|$3]].\n\nAlesanana $3 cenah ''$2''.",
+       "cantcreateaccount-text": "Nyieun akun ti ieu alamat IP ('''$1''') dipeungpeuk ku [[User:$3|$3]].\n\nAlesana $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",
        "nohistory": "Teu aya jujutan édit pikeun kaca ieu.",
        "searchprofile-advanced-tooltip": "Paluruh di rohang ngaran anu tangtu",
        "search-result-size": "$1 ({{PLURAL:$2|1 kecap|$2 kecap}})",
        "search-result-category-size": "{{PLURAL:$1|1 anggota|$1 anggota}} ({{PLURAL:$2|1 subkatégori|$2 subkatégori}}, {{PLURAL:$3|1 berkas|$3 berkas}})",
-       "search-redirect": "(alihan $1)",
+       "search-redirect": "(dipindahkeun ti $1)",
        "search-section": "(bagean $1)",
        "search-category": "(kategori $1)",
        "search-file-match": "(cocog jeung eusi berkas)",
        "mypreferences": "Préferénsi",
        "prefs-edits": "Jumlah éditan:",
        "prefsnologintext2": "Mangga asup log pikeun ngarobah préferénsi anjeun.",
-       "prefs-skin": "Kulit",
+       "prefs-skin": "Kalakop",
        "skin-preview": "Pramidang",
        "datedefault": "Tanpa préferénsi",
        "prefs-labs": "Fitur Labs",
        "saveprefs": "Simpen préferénsi",
        "restoreprefs": "Larapkeun setélan buhun (sakabéh bab)",
        "prefs-editing": "Ukuran kotak téks",
-       "rows": "Baris",
-       "columns": "Kolom",
        "searchresultshead": "Aturan hasil néang",
        "stub-threshold": "Wates ambang pikeun format <a href=\"#\" class=\"stub\">tumbu taratas</a> (bit):",
        "stub-threshold-disabled": "Tumpur",
        "yourrealname": "Ngaran anjeun*",
        "yourlanguage": "Basa antarbeungeut",
        "yourvariant": "Varian basa eusi:",
-       "yournick": "Landihan anjeun (pikeun tawis leungeun)",
+       "yournick": "Tanda tangan:",
        "prefs-help-signature": "Pamanggih dina kaca sawala/obrolan kudu ditandaan \"<nowiki>~~~~</nowiki>\" nu bakal robah jadi tanda tangan anjeun jeung titimangsana.",
        "badsig": "Parafna teu valid; pariksa tag HTML-na geura.",
        "badsiglength": "Tawis leungeun panjang teuing. Kuduna kurang ti $1 {{PLURAL:$1|karaktér|karaktér}}.",
        "prefs-diffs": "Béda",
        "userrights": "Manajemén hak pamaké",
        "userrights-lookup-user": "Atur gorombolan pamaké",
-       "userrights-user-editname": "Asupkeun landihan:",
+       "userrights-user-editname": "Asupkeun sandiasma:",
        "editusergroup": "Édit Golongan Pamaké",
        "editinguser": "Ngarobah hak kontributor '''[[User:$1|$1]]''' $2",
        "userrights-editusergroup": "Édit gorombolan pamaké",
        "userrights-reason": "Alesan:",
        "userrights-no-interwiki": "Anjeung teu diwenangkeun ngarobah hak pamaké dina wiki séjén.",
        "userrights-nodatabase": "Pangkalan data $1 euweuh atawa henteu lokal.",
-       "userrights-nologin": "Pikeun ngatur hak pamaké, anjeun kudu [[Special:UserLogin|asup log]] migunakeun rekening kuncén.",
-       "userrights-notallowed": "Akun anjeun teu boga kawenangan pikeun ngatur hak pamaké.",
        "userrights-changeable-col": "Jumplukan anu bisa Anjeun robah",
        "userrights-unchangeable-col": "Jumplukan anu teu bisa Anjeun robah",
        "group": "Gorombolan:",
        "right-edit": "Ngédit kaca",
        "right-createpage": "Nyieun kaca anyar (nu lain kaca obrolan)",
        "right-createtalk": "Nyieun kaca obrolan",
-       "right-createaccount": "Nyieun rekening anyar",
+       "right-createaccount": "Nyieun akun anyar",
        "right-minoredit": "Nandaan éditan minor",
        "right-move": "Mindahkeun kaca",
        "right-move-subpages": "Pindahkeun kaca katut sakabéh subkacana",
        "right-move-categorypages": "Pindahkeun kaca kategori",
        "right-movefile": "Mindahkeun berkas",
        "right-suppressredirect": "Henteu nyieun hiji alihan ti ngaran lila sabot mindahkeun kaca",
-       "right-upload": "Muatkeun koropak",
+       "right-upload": "Unjal berkas",
        "right-reupload": "Nimpah koropak nu geus aya",
        "right-reupload-own": "Nimpah koropak nu geus aya nu dimuat ku sorangan",
        "right-reupload-shared": "Nampik gambar-gambar dina média lokal babarengan",
-       "right-upload_by_url": "Muatkeun koropak ti hiji alamat URL",
+       "right-upload_by_url": "Unjal berkas tina alamat URL",
        "right-purge": "Ngahapus sindangan tina kaca tanpa kaca konfirmasi",
        "right-autoconfirmed": "Ngédit kaca nu semi dikonci",
        "right-bot": "Anggap salaku prosés otomatis",
        "action-edit": "édit kaca ieu",
        "action-createpage": "mitembeyan kaca anyar",
        "action-createtalk": "mitembeyan kaca obrolan",
-       "action-createaccount": "nyieun rekening pamaké ieu",
+       "action-createaccount": "jieun ieu akun pamaké",
        "action-history": "tempo jujutan ieu kaca",
        "action-minoredit": "nandaan ieu éditan salaku minor",
        "action-move": "mindahkeun ieu kaca",
        "recentchanges-label-plusminus": "Ukuran kaca robah sajumlah ieu bit",
        "recentchanges-legend-heading": "<strong>Pedaran:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (tempo ogé [[Special:NewPages|béréndélan kaca anyar]])",
+       "rcfilters-filter-patrolled-label": "Diaawas",
        "rcnotefrom": "Di handap ieu parobahan saprak <b>$2</b> (nu ditémbongkeun nepi ka <b>$1</b>).",
        "rclistfrom": "Témbongkeun nu anyar robah nepi ka $3 $2",
        "rcshowhideminor": "$1 éditan minor",
        "rcshowhidemine": "$1 éditan kuring",
        "rcshowhidemine-show": "Témbongkeun",
        "rcshowhidemine-hide": "Sumputkeun",
-       "rclinks": "Témbongkeun $1 parobahan ahir dina $2 poé ahir<br />$3",
+       "rclinks": "Témbongkeun $1 parobahan panungtung ti $2 poé ka tukang<br />$3",
        "diff": "béda",
        "hist": "juj",
        "hide": "sumputkeun",
        "recentchangeslinked-summary": "Ieu kaca husus ngabéréndélkeun parobahan anyar anu numbu ti kaca husus (atawa uesi katagori husus). Kaca anu [[Special:Watchlist|diawaskeun]] némbongan '''kandel'''.",
        "recentchangeslinked-page": "Ngaran kaca:",
        "recentchangeslinked-to": "Témbongkeun parobahan ka kaca-kaca nu ditumbukeun ka kaca nu dimaksud",
-       "upload": "Muat berkas",
-       "uploadbtn": "Muatkeun koropak",
+       "upload": "Unjal berkas",
+       "uploadbtn": "Unjal berkas",
        "reuploaddesc": "Balik ka formulir muatan.",
        "uploadnologin": "Can asup log",
        "uploadnologintext": "Mangga $1 pikeun ngunggah berkas.",
        "upload_directory_read_only": "Diréktori muatan ($1) teu bisa ditulis ku server ramat.",
        "uploaderror": "Kasalahan muat",
        "upload-recreate-warning": "'''Awas: berkas nu ngaranna kitu geus kungsi dihapus atawa dipindahkeun.'''\n\nLog hahapus jeung pipindah pikeun ieu kaca dipidangkeun di handap:",
-       "uploadtext": "<strong>HEUP!</strong> Méméh anjeun ngamuat di dieu, pastikeun yén anjeun geus maca sarta tumut ka kawijakan maké gambar.\n\nMun geus aya koropak na wiki nu ngaranna sarua jeung nu disebutkeun ku anjeun, koropak nu geus lila bakal diganti otomatis. Mangka, iwal ti pikeun ngaropéa hiji koropak, tangtu leuwih hadé mun anjeun mariksa heula bisi koropak nu sarupa geus aya.\n\nPikeun némbongkeun atawa néang gambar-gambar nu pernah dimuat saméméhna, mangga lebet ka [[Special:FileList|daptar gambar nu dimuat]]. Muatan sarta hapusan kadaptar dina log [[Special:Log/upload|log muatan]].\n\nPaké formulir di handap pikeun ngamuat koropak gambar anyar pikeun ilustrasi kaca anjeun. Na kalolobaan panyungsi, anjeun bakal manggihan tombol \"Sungsi/''Browse''...\", nu bakal nganteur ka dialog muka-koropak nu baku na sistim operasi anjeun. Milih hiji koropak bakal ngeusian ngaran koropakna kana rohangan téks gigireun tombol nu tadi. Anjeun ogé kudu nyontréng kotak nu nandakeun yén anjeun teu ngarumpak hak cipta batur ku dimuatna ieu koropak. Pencét tombol \"Muatkeun/''Upload''\" pikeun ngeréngsékeun muatan. Prosés ieu bisa lila mun anjeun migunakeun sambungan internét nu lambat.\n\nFormat nu dianjurkeun nyéta JPEG pikeun gambar fotografik, PNG pikeun hasil ngagambar sarta gambar séjénna, sarta OGG pikeun sora. Pilih ngaran koropak nu déskriptif sangkan teu ngalieurkeun. Pikeun ngasupkeun gambarna na kaca séjén, pigunakeun tumbu dina wujud\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Gambar.jpg]]</nowiki></code>''' pikeun gambar dina ukuran aslina\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Berkas.ogg]]</nowiki></code>''' pikeun sora.\n\nCatet yén salaku kaca wiki, nu séjén bisa ngarobah atawa ngahapus muatan anjeun mun maranéhna nganggap ieu saluyu jeung kapentingan proyék, sarta anjeun bisa waé dipeungpeuk ti ngamuat koropak mun anjeun ngaruksak/ngaganggu sistim.",
+       "uploadtext": "Gunakeun formulir di handap pikeun ngunjal berkas.\nPikeun midangkeun atawa maluruh berkas anu saméméhna diunjal, sorang [[Special:FileList|daptar berkas]]. Unjalan (ulang) ogé kacatet kana [[Special:Log/upload|log unjalan]], sedengkeun pamupusan mah kacatetna dina [[Special:Log/delete|log pamupusan]].\n\nPikeun midangkeun atawa nerapkeun berkas kana kaca mah migunakeun tutumbu salah sahiji format di handap:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Berkas.jpg]]</nowiki></code>''' pikeun midangkeun berkas dina ukuran aslina\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Berkas.png|200px|thumb|left|téks alternatif]]</nowiki></code>''' pikeun midangkeun berkas nu rubakna 200px na jero kotak, nitih di kéncaeun kaca bari aya tulisan 'téks alternatif' minangka kamandang gambar\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Berkas.ogg]]</nowiki></code>''' minangka tutumbu langsung kana berkas anu dimaksud tanpa kudu midangkeun éta berkas liwat wiki",
        "upload-permitted": "Tipeu koropak nu diwidian: $1.",
        "upload-preferred": "Tipeu koropak nu dianjurkeun: $1.",
        "upload-prohibited": "Tipeu koropak nu dicaram: $1.",
        "fileexists": "Koropak nu ngaranna kieu geus aya, mangga parios <strong>[[:$1]]</strong> mun anjeun teu yakin rék ngaganti.\n[[$1|thumb]]",
        "fileexists-extension": "Geus aya berkas anu ngaranna sarupa: [[$2|thumb]]\n* Ngaran berkas nu dimuat: <strong>[[:$1]]</strong>\n* Ngaran berkas nu geus aya: <strong>[[:$2]]</strong>\nPilih ngaran séjén.",
        "fileexists-forbidden": "Berkas  nu ngaranna kitu geus aya sarta teu bisa ditimpah.\nMun anjeun keukeuh rék ngunggahkeun berkas anjeun, mangga balik deui sarta paké ngaran anyar.\n[[File:$1|thumb|center|$1]]",
-       "fileexists-shared-forbidden": "Koropak nu ngaranna ieu geus aya dina gudang koropak babagi (''shared file repository''); mangga balik deui sarta muatkeun koropak ieu maké ngaran nu béda. [[File:$1|thumb|center|$1]]",
-       "file-exists-duplicate": "Gambar ieu duplikat sareng {{PLURAL:$1|gambar|gambar}}:",
+       "fileexists-shared-forbidden": "Gening berkas téh geus aya nu ngaranna sarua dina répositori berkas reujeung.\nMun anjeun keukeuh hayang ngunjal ieu berkas, sok ganti heula ngaranna ku ngaran nu béda. [[File:$1|thumb|center|$1]]",
+       "file-exists-duplicate": "Gambar ieu duplikat ti {{PLURAL:$1|gambar|gambar}}:",
        "file-deleted-duplicate": "Berkas anu sarua jeung [[:$1]] geus kungsi dihapus.\nPariksa heula jujutan hapusanana saméméh neruskeun ngamuat deui éta berkas.",
        "uploadwarning": "Pépéling ngamuat",
        "uploadwarning-text": "Ropéa pedaran berkas di handap terus cobaan deui.",
        "upload-file-error": "Kasalahan internal",
        "upload-misc-error": "Kasalahan muat anu teu kanyahoan",
        "upload-http-error": "Aya galat HTTP: $1",
+       "upload-dialog-title": "Unjal berkas",
        "backend-fail-backup": "Teu bisa nyadangkeun berkas \"$1\".",
        "backend-fail-notexists": "Berkas $1 euweuh.",
        "backend-fail-notsame": "Berkas anu teu-identik geus aya di $1.",
        "unwatchedpages": "Kaca nu teu diawaskeun",
        "listredirects": "Daptar alihan",
        "unusedtemplates": "Citakan nu teu kapaké",
-       "unusedtemplatestext": "Ieu kaca ngabéréndélkeun sakabéh kaca dina spasi ngaran {{ns:template}} nu teu diwengku ku kaca séjén.\nSaméméh ngahapus, pariksa heula bisi aya tumbu ka ieu citakan.",
-       "unusedtemplateswlh": "tumbu lianna",
+       "unusedtemplatestext": "Ieu kaca ngabéréndélkeun sakabéh kaca dina rohang ngaran {{ns:template}} anu teu diwengku ku kaca séjén.\nSaméméh ngahapus, pariksa heula bisi aya tumbu ka ieu citakan.",
+       "unusedtemplateswlh": "tutumbu lianna",
        "randompage": "Kaca acak",
        "randompage-nopages": "Euweuh kaca dina ieu spasi ngaran \"$1\".",
        "randomincategory-category": "Kategori:",
        "statistics-articles": "Halaman eusi",
        "statistics-pages": "Kaca",
        "statistics-pages-desc": "Sakabéh kaca di ieu wiki, kaasup kaca obrolan, alihan, jeung nu lianna.",
-       "statistics-files": "Koropak nu geus dimuat",
+       "statistics-files": "Berkas nu geus diunjal",
        "statistics-edits": "Ëditan kaca ti saprak {{SITENAME}} mimiti dibuka",
        "statistics-edits-average": "Rata-rata éditan unggal kaca",
        "statistics-users": "[[Special:ListUsers|Kontributor]] kadaptar",
        "brokenredirectstext": "Alihan di handap numbu ka kaca nu teu aya:",
        "brokenredirects-edit": "édit",
        "brokenredirects-delete": "hapus",
-       "withoutinterwiki": "Kaca-kaca tanpa tumbu basa",
+       "withoutinterwiki": "Kaca-kaca tanpa tutumbu basa",
        "withoutinterwiki-summary": "Kaca-kaca di handap ieu teu numbu ka vérsi basa séjén:",
        "withoutinterwiki-legend": "Prefiks",
        "withoutinterwiki-submit": "Témbongkeun",
        "nbytes": "$1 {{PLURAL:$1|bait|bait}}",
        "ncategories": "$1 {{PLURAL:$1|kategori|kategori}}",
        "ninterwikis": "$1 {{PLURAL:$1|interwiki|interwiki}}",
-       "nlinks": "$1 {{PLURAL:$1|tumbu|tumbu}}",
+       "nlinks": "$1 {{PLURAL:$1|tutumbu|tutumbu}}",
        "nmembers": "$1 {{PLURAL:$1|kontributor|kontributor}}",
        "nmemberschanged": "$1 → $2 {{PLURAL:$2|anggota|anggota}}",
        "nrevisions": "$1 {{PLURAL:$1|révisi|révisi}}",
        "lonelypagestext": "Kaca-kaca di handap ieu teu numbu ti kaca séjén di {{SITENAME}}.",
        "uncategorizedpages": "Kaca nu can dikategorikeun",
        "uncategorizedcategories": "Kategori nu can dikategorikeun",
-       "uncategorizedimages": "Gambar nu can dikategorikeun",
+       "uncategorizedimages": "Berkas anu can dikategorikeun",
        "uncategorizedtemplates": "Citakan nu can boga kategori",
        "unusedcategories": "Kategori nu teu kapaké",
-       "unusedimages": "Gambar-gambar nu teu kapaké",
+       "unusedimages": "Berkas nu teu kaparaké",
        "wantedcategories": "Kategori nu dipikabutuh",
        "wantedpages": "Kaca nu dipikabutuh",
        "wantedfiles": "Berkas nu dipikabutuh",
        "mostlinkedcategories": "Paling loba ditumbukeun ka kategori",
        "mostlinkedtemplates": "Citakan nu panglobana ditumbu",
        "mostcategories": "Artikel nu paling loba ngandung kategori",
-       "mostimages": "Nu panglobana numbu ka gambar",
+       "mostimages": "Berkas anu panglobana ditutumbukeun",
        "mostrevisions": "Artikel nu pangmindengna dirévisi",
        "prefixindex": "Kabeh kaca maké awalan",
        "shortpages": "Kaca-kaca parondok",
        "usereditcount": "$1 {{PLURAL:$1|édit|édit}}",
        "usercreated": "{{GENDER:$3|Dijieun}} ping $1 tabuh $2",
        "newpages": "Kaca anyar",
-       "newpages-username": "Landihan:",
+       "newpages-username": "Sandiasma:",
        "ancientpages": "Kaca pangheubeulna",
        "move": "Pindahkeun",
        "movethispage": "Pindahkeun kaca ieu",
        "booksources": "Sumber pustaka",
        "booksources-search-legend": "Sungsi sumber buku",
        "booksources-search": "Paluruh",
-       "booksources-text": "Di handap ieu ngabéréndélkeun tumbu ka loka-loka nu ngical buku, boh nu anyar atawa loakan, nu sugan uninga kana buku anu nuju dipilari:",
-       "booksources-invalid-isbn": "ISBN-na sigana henteu bener; pariksa deui bisi aya salah salin ti sumber aslina.",
+       "booksources-text": "Di handap ieu ngabéréndélkeun tutumbu ka loka-loka nu ngical buku, boh nu anyar atawa loakan, nu sugan uninga kana buku anu nuju dipilari:",
+       "booksources-invalid-isbn": "Sigana ISBN-na teu bener; pariksa deui bisi aya salah téplak ti sumber aslina.",
        "specialloguserlabel": "Pamaké:",
        "speciallogtitlelabel": "Sasaran (judul atawa pamaké):",
        "log": "Log",
        "wlheader-showupdated": "Kaca nu robah ti panungtungan anjeun sindang ditémbongkeun kalawan '''kandel'''",
        "wlnote": "Di handap ieu mangrupa $1 {{PLURAL:$1|robahan|robahan}} ahir salila '''$2''' jam.",
        "wlshowlast": "Témbongkeun $1 jam $2 poé  ahir",
+       "wlshowhidecategorization": "kategorisasi kaca",
        "watchlist-options": "Pilihan awaskeuneun",
        "watching": "Ngawaskeun...",
        "unwatching": "Eureun ngawaskeun...",
        "protect_expiry_old": "Waktu kadaluwarsa geus kaliwat.",
        "protect-text": "Di dieu anjeun bisa nempo sarta ngarobah hambalan pangonci pikeun kaca '''$1'''.",
        "protect-locked-blocked": "Anjeun teu bisa ngarobah hambalan koncian sabab keur dipeungpeuk. Setélan ayeuna pikeun kaca '''$1''' nyaéta:",
-       "protect-locked-access": "Rekening anjeun teu wenang ngarobah hambalan pangonci kaca. Kaca '''$1''' disetél:",
+       "protect-locked-access": "Akun anjeun teu wenang ngarobah hambalan pangonci kaca.\nSetélan kiwari pikeun kaca <strong>$1</strong>:",
        "protect-cascadeon": "Ieu kaca dikonci sabab kaasup {{PLURAL:$1|kaca nu|kaca-kaca nu}} ngajalankeun pangonci ngaruntuy. Anjeun bisa ngarobah hambalan koncian ieu kaca, tapi ieu moal mangaruhan pangonci ngaruntuyna.",
        "protect-default": "Bisa ku sakabeh pamaké",
        "protect-fallback": "Kudu aya kawenangan \"$1\"",
        "restriction-edit": "Édit",
        "restriction-move": "Pindahkeun",
        "restriction-create": "Jieun",
-       "restriction-upload": "Muatkeun koropak",
+       "restriction-upload": "Unjal berkas",
        "restriction-level-sysop": "konci rékép",
        "restriction-level-autoconfirmed": "konci logor",
        "restriction-level-all": "sadaya hambalan",
        "undeletelink": "tempo/pulangkeun",
        "undeleteviewlink": "tempo",
        "undeletecomment": "Alesan:",
-       "undeletedrevisions": "$1 {{PLURAL:$1|révisi|révisi}} disimpen deui",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 révisi|$1 révisi}} jeung {{PLURAL:$2|1 berkas|$2 berkas}} geus dibalikkeun",
-       "undeletedfiles": "{{PLURAL:$1|1 berkas|$1 berkas}} dibalikkeun",
        "cannotundelete": "Gagal ngabolaykeun hapusan; sigana kapiheulaan ngabolaykeun hapusan ku nu séjén.",
        "undeletedpage": "'''$1 hasil dibalikeun'''\n\nTempo [[Special:Log/delete|log hapusan]] keur data ngahapus jeung malikeun.",
        "undelete-header": "Tempo [[Special:Log/delete|log hapusan]] pikeun béréndélan kaca nu anyar dihapus.",
        "namespace": "Ngaranspasi:",
        "invert": "Balikkeun pilihan",
        "tooltip-invert": "Contang ieu kotak pikeun nyumputkeun parobahan kaca-kaca dina ruang nama anu dipilih (jeung ruang nama anu tumali, lamun dicontang)",
+       "namespace_association": "Ngaranspasi nu patali",
+       "tooltip-namespace_association": "Céklis ieu kotak pikeun ngaitkeun ngaranspasi atawa judul ngaranspasi jeung ngaranspasi nu dipilih",
        "blanknamespace": "(Utama)",
        "contributions": "Kontribusi {{GENDER:$1|pamaké}}",
        "contributions-title": "Sumbangan tulisan ti $1",
        "month": "Ti bulan (jeung saméméhna):",
        "year": "Ti taun (jeung saméméhna):",
        "sp-contributions-newbies": "Témbongkeun kontribusi ti akun anyar wungkul",
-       "sp-contributions-newbies-sub": "Pikeun rekening anyar",
+       "sp-contributions-newbies-sub": "Pikeun akun anyar",
        "sp-contributions-blocklog": "log peungpeuk",
        "sp-contributions-deleted": "kontribusi nu dihapus",
        "sp-contributions-uploads": "unggahan",
        "whatlinkshere-prev": "$1 {{PLURAL:$1|saméméhna}}",
        "whatlinkshere-next": "$1 {{PLURAL:$1|salajengna}}",
        "whatlinkshere-links": "← tutumbu",
-       "whatlinkshere-hideredirs": "$1 alihan",
+       "whatlinkshere-hideredirs": "$1 pangalihan",
        "whatlinkshere-hidetrans": "$1 transklusi",
        "whatlinkshere-hidelinks": "$1 tutumbu",
        "whatlinkshere-hideimages": "$1 tutumbu berkas",
        "ipbexpiry": "Kadaluarsa",
        "ipbreason": "Alesan:",
        "ipb-hardblock": "Nyegah pamaké anu asup log pikeun ngédit ti ieu alamat IP",
-       "ipbcreateaccount": "Tong bisa nyieun rekening",
+       "ipbcreateaccount": "Ulah bisa nyieun akun",
        "ipbemailban": "Henteu kaci pamaké ngirimkeun surélék",
        "ipbenableautoblock": "Peungpeuk sacara otomatis alamat IP anu panungtungan dipaké ku pamaké sarta sakabéh alamat IP anu kungsi dipaké.",
        "ipbsubmit": "Peungpeuk pamaké ieu",
        "expiringblock": "kadaluwarsa $1 jam $2",
        "anononlyblock": "ngan nu teu daptar",
        "noautoblockblock": "Otopeungpeuk ditumpurkeun",
-       "createaccountblock": "nyieun rekening dipeungpeuk",
+       "createaccountblock": "nyieun akun ditumpurkeun",
        "emailblock": "surélek di peungpeuk",
        "blocklist-nousertalk": "teu bisa ngarobah kaca obrolan sorangan",
        "ipblocklist-empty": "Daptar peungpeuk kosong.",
-       "ipblocklist-no-results": "Alamat IP atawa landihan pamaké nu dipundut teu dipeungpeuk.",
+       "ipblocklist-no-results": "Alamat IP atawa sandiasma nu dipundut teu dipeungpeuk.",
        "blocklink": "blokir",
        "unblocklink": "buka blokir",
        "change-blocklink": "Robah status blokir",
        "proxyblocker": "Pameungpeuk proxy",
        "proxyblockreason": "Alamat IP anjeun dipeungpeuk sabab mangrupa proxy muka. Mangga tepungan ''Internet service provider'' atanapi ''tech support'' anjeun, béjakeun masalah serius ieu.",
        "sorbsreason": "Alamat IP anjeun kadaptar salaku ''open proxy'' dina DNSBL anu dipaké ku {{SITENAME}}.",
-       "sorbs_create_account_reason": "Alamat IP anjeun kadaptar salaku ''open proxy'' dina DNSBL. Anjeun teu bisa nyieun rekening",
+       "sorbs_create_account_reason": "Alamat IP anjeun kadaptar salaku ''open proxy'' dina DNSBL. Anjeun teu bisa nyieun akun",
        "ipbblocked": "Anjeun teu bisa meungpeuk atawa muka peungpeuk séjén kontributor ku sabab anjeun sorangan keur dipeungpeuk",
        "lockdb": "Konci pangkalan data",
        "unlockdb": "Buka konci pangkalan data",
        "import-interwiki-text": "Pilih wiki jeung judul kaca nu rék diimpor.\nTanggal révisi katut ngaran nu ngédit bakal dipertahankeun.\nSadaya aktivitas impor transwiki baris kacatet dina [[Special:Log/import|log impor]].",
        "import-interwiki-sourcewiki": "Wiki sumber:",
        "import-interwiki-sourcepage": "Kaca sumber:",
-       "import-interwiki-history": "Salin sakabéh vérsi jujutan pikeun ieu kaca",
+       "import-interwiki-history": "Téplak sakabéh vérsi jujutan pikeun ieu kaca",
        "import-interwiki-templates": "Kaasup sakabéh citakan",
        "import-interwiki-submit": "Impor",
        "import-upload-filename": "Ngaran berkas:",
        "importfailed": "Ngimpor gagal: $1",
        "importunknownsource": "Tipeu sumber impor teu dipikawanoh",
        "importcantopen": "Teu bisa muka koropak impor",
-       "importbadinterwiki": "Tumbu interwiki ruksak",
+       "importbadinterwiki": "Tutumbu antarwiki awon",
        "importsuccess": "Ngimpor geus hasil!",
        "importnosources": "Teu aya sumber impor transwiki nu geus dijieun tur ngamuat jujutan sacara langsung geus dinon-aktifkeun.",
        "importnofile": "Euweuh koropak impor nu dimuat.",
        "tooltip-pt-preferences": "Préferénsi {{GENDER:|anjeun}}",
        "tooltip-pt-watchlist": "Daptar kaca nu diawaskeun ku anjeun parobahanana.",
        "tooltip-pt-mycontris": "Béréndélan kontribusi {{GENDER:|anjeun}}",
-       "tooltip-pt-login": "Leuwih hadé asup log, sanajan teu wajib",
+       "tooltip-pt-login": "Leuwih hadé asup log, sok sanajan teu wajib",
        "tooltip-pt-logout": "Kaluar log",
        "tooltip-pt-createaccount": "Najan henteu kudu, Anjeun leuwih hadé nyieun akun sarta asup log",
        "tooltip-ca-talk": "Sawala ngeunaan eusi kaca",
        "tooltip-ca-move": "Pindahkeun kaca ieu",
        "tooltip-ca-watch": "Tambahkeun kaca ieu kana awaskeuneun kuring",
        "tooltip-ca-unwatch": "Kaluarkeun kaca ieu tina awaskeuneun kuring",
-       "tooltip-search": "Sungsi di {{SITENAME}}",
+       "tooltip-search": "Paluruh di {{SITENAME}}",
        "tooltip-search-go": "Jugjug kaca nu ngaranna ciples kieu (mun aya)",
-       "tooltip-search-fulltext": "Sungsi kaca-kaca nu ngandung tulisan ieu",
-       "tooltip-p-logo": "Tepas",
+       "tooltip-search-fulltext": "Paluruh kaca-kaca nu ngandung ieu tulisan",
+       "tooltip-p-logo": "Jugjug tepas",
        "tooltip-n-mainpage": "Sindang ka Tepas",
-       "tooltip-n-mainpage-description": "Jugjug Tepas",
+       "tooltip-n-mainpage-description": "Jugjug tepas",
        "tooltip-n-portal": "Ngeunaan proyékna, naon nu bisa dipigawé, di mana néanganana",
        "tooltip-n-currentevents": "Panggihan iber ngeunaan naon baé nu keur lumangsung",
        "tooltip-n-recentchanges": "Béréndélan nu anyar robah dina wiki",
-       "tooltip-n-randompage": "Muatkeun kaca naon baé",
+       "tooltip-n-randompage": "Muatkeun kaca acak",
        "tooltip-n-help": "Tempat pikeun néangan pitulung",
        "tooltip-t-whatlinkshere": "Béréndélan sakabéh kaca wiki anu nutumbu ka dieu",
        "tooltip-t-recentchangeslinked": "Anu anyar robah dina kaca-kaca anu nutumbu ti dieu",
        "tooltip-feed-atom": "Asupan atom pikeun kaca ieu",
        "tooltip-t-contributions": "Béréndélan kontribusi ti {{GENDER:$1|ieu pamaké}}",
        "tooltip-t-emailuser": "Kirim surélék ka ieu kontributor",
-       "tooltip-t-upload": "Ngunggahkeun berkas",
+       "tooltip-t-upload": "Unjal berkas",
        "tooltip-t-specialpages": "Daptar sadaya kaca husus",
        "tooltip-t-print": "Vérsi citakeun ieu kaca",
        "tooltip-t-permalink": "Tutumbu permanén ka ieu ieu vérsi",
        "tooltip-diff": "Témbongkeun parobahan mana nu geus dijieun.",
        "tooltip-compareselectedversions": "Tempo béda antara dua vérsi kaca ieu nu dipilih.",
        "tooltip-watch": "Tambahkeun kaca ieu kana awaskeuneun kuring",
-       "tooltip-upload": "Muatkeun",
+       "tooltip-upload": "Prung unjalkeun",
        "tooltip-rollback": "Mulangkeun éditan ka panulis panungtung dina sakali klik",
        "tooltip-undo": "\"Bolay\" malikkeun ieu éditan sarta muka kotak édit dina modeu pramidang.\nCara kieu bisa nambahkeun alesan dina ringkesanana.",
        "tooltip-preferences-save": "Simpen préferénsi",
        "creditspage": "Pangajén kaca",
        "nocredits": "Teu aya émbaran pangajén pikeun kaca ieu.",
        "spamprotectiontitle": "Saringan spam",
-       "spamprotectiontext": "Kaca nu rék disimpen dipeungpeuk ku saringan spam.\nSigana mah ieu téh alatan tumbu ka loka luar.",
+       "spamprotectiontext": "Kaca anu rék disimpen dipeungpeuk ku saringan spam.\nSigana mah ieu téh alatan tutumbu ka loka luar anu dibléklis.",
        "simpleantispam-label": "Pamariksaan anti-spam.\nAnu ieu <strong>ulah</strong> dieusian!",
        "pageinfo-title": "Émbaran pikeun \"$1\"",
        "pageinfo-header-basic": "Émbaran dasar",
        "exif-copyrighted": "Status hak cipta",
        "exif-copyrightowner": "Nu nyepeng hak cipta",
        "exif-usageterms": "Katangtuan pamakéan",
-       "exif-webstatement": "Pertélaan hak salin onlén",
+       "exif-webstatement": "Pertélaan hak cipta onlén",
        "exif-originaldocumentid": "ID unik dokumén asli",
        "exif-licenseurl": "URL pikeun lisénsi hak cipta",
        "exif-morepermissionsurl": "Ëmbaran lisénsi lianna",
        "monthsall": "kabéh",
        "confirmemail": "Konfirmasi alamat surélék",
        "confirmemail_noemail": "Alamat surélék anu didaptarkeun dina [[Special:Preferences|préferénsi pamaké]] anjeun teu sah.",
-       "confirmemail_text": "Wiki ieu merlukeun anjeun sangkan méré konfirmasi alamat surélék saméméh migunakeun fitur surélék. Aktifkeun tombol di handap pikeun ngirimkeun surat konfirmasi ka alamat anjeun. Suratna ngandung tumbu nu ngandung sandina; muatkeun tumbuna kana panyungsi anjeun pikeun ngonfirmasi yén alamat surélék anjeun sah.",
-       "confirmemail_pending": "Sandi konfirmasi geus dikirimkeun ka alamat surélék anjeun; mun kakara nyieun rekening, mangga antos sababaraha menit saméméh mundut sandi anyar.",
+       "confirmemail_text": "{{SITENAME}} téh anjeun kudu ngonfirmasi alamat surélék sangkan bisa migunakeun fiturna.\nKlik tombol di handap pikeun ngirimkeun talatah nu eusina konfirmasieun kana alamat anjeun. Eusi talatahna ngandung tutumbu kodeu; muatkeun tumbuna kana panyungsi anjeun pikeun ngonfirmasi yén alamat surélék anjeun sah.",
+       "confirmemail_pending": "Kecap sandi konfirmasi geus dikirimkeun ka alamat surélék anjeun; mun anyar nyieun akun, mangga antos sababaraha menit saméméh mundut kecap sandi anyar.",
        "confirmemail_send": "Kirimkeun surat konfirmasi sandi",
        "confirmemail_sent": "Surélék konfirmasi geus dikirim.",
        "confirmemail_oncreate": "Sandi konfirmasi geus dikirim ka alamat surélék anjeun. Éta sandi dipaké pikeun ngajalankeun fitur-fitur nu maké surélék di ieu wiki.",
        "confirmemail_success": "Alamat surélék anjeun geus dikonfirmasi, ayeuna anjeun geus bisa migunakeun wikina.",
        "confirmemail_loggedin": "Alamat surélék anjeun geus dikonfirmasi.",
        "confirmemail_subject": "Konfirmasi alamat surélék {{SITENAME}}",
-       "confirmemail_body": "Aya, sigana mah anjeun ti alamat IP $1, geus ngadaptarkeun rekening \"$2\" maké alamat surélék ieu na {{SITENAME}}.\n\nPikeun mastikeun yén rekening ieu mémang kagungan sarta ngakifkeun fitur surélék di {{SITENAME}}, buka tumbu di handap ieu kana panyungsi/''browser'' anjeun:\n\n$3\n\nLamun anjeun teu ngadaptarkeun rekening, turutkeun tumbu ieu pikeun ngabolaykeun konfirmasi alamat surélék:\n\n$5\n\nSandi konfirmasi ieu bakal kadaluwarsa dina $4.",
+       "confirmemail_body": "Aya, sigana mah anjeun, ti alamat IP $1,\ngeus ngadaptarkeun akun \"$2\" maké alamat surélék ieu di {{SITENAME}}.\n\nPikeun mastikeun yén ieu akun mémang kagungan, sarta ngaktipkeun fitur surélék di {{SITENAME}}, buka tutumbu di handap ieu dina panyungsi (''browser'') anjeun:\n\n$3\n\nLamun anjeun teu ngadaptarkeun ieu akun, turutkeun ieu tutumbu pikeun ngabolaykeun konfirmasi alamat surélék:\n\n$5\n\nSandi konfirmasi ieu bakal kadaluwarsa dina $4.",
        "confirmemail_invalidated": "Konfirmasi alamat surélék dibolaykeun",
        "invalidateemail": "Bolaykeun konfirmasi surélék",
        "scarytranscludedisabled": "[Transklusi interwiki ditumpurkeun]",
        "specialpages-group-other": "Kaca husus lainna",
        "specialpages-group-login": "Asup log / jieun akun",
        "specialpages-group-changes": "Nuanyar robah sarta log",
-       "specialpages-group-media": "Laporan sarta muatkeun koropak",
+       "specialpages-group-media": "Laporan jeung unjalan berkas",
        "specialpages-group-users": "Pamaké sarta hak pamaké",
        "specialpages-group-highuse": "Pamakéan kaca nu badag",
        "specialpages-group-pages": "Daptar kaca",
        "htmlform-reset": "Bolaykeun parobahan",
        "htmlform-selectorother-other": "Lianna",
        "logentry-delete-delete": "$1 {{GENDER:$2|ngahapus}} kaca $3",
+       "logentry-delete-restore": "$1 {{GENDER:$2|dibalikkeun}} kaca $3 ($4)",
+       "logentry-delete-restore-nocount": "$1 {{GENDER:$2|dibalikkeun}} kaca $3",
+       "restore-count-revisions": "$1 {{PLURAL:$1|1 révisi|$1 révisi}}",
+       "restore-count-files": "{{PLURAL:$1|1 berkas|$1 berkas}}",
        "revdelete-restricted": "akses geus dibatesan ukur keur kuncén",
        "revdelete-unrestricted": "Watesan akses kuncén dihapuskeun",
        "logentry-move-move": "$1 {{GENDER:$2|mindahkeun}} kaca $3 ka $4",
-       "logentry-newusers-create": "Akun pamaké $1 jeus {{GENDER:$2|dijieun}}",
+       "logentry-newusers-create": "Akun pamaké $1 geus {{GENDER:$2|dijieun}}",
        "logentry-upload-upload": "$1 {{GENDER:$2|ngamuat}} $3",
        "rightsnone": "(euweuh)",
-       "revdelete-summary": "ringkesan ngédit",
        "feedback-cancel": "Bolay",
        "feedback-message": "Surat:",
        "feedback-subject": "Ngeunaan:",
-       "searchsuggest-search": "Sungsi",
+       "searchsuggest-search": "Sungsi di {{SITENAME}}",
        "searchsuggest-containing": "ngandung...",
-       "api-error-file-too-large": "Berkas nu dikirim gedé teuing.",
-       "api-error-filename-tooshort": "Ngaran berkas pondok teuing.",
-       "api-error-filetype-banned": "Jenis berkas ieu dipahing.",
-       "api-error-filetype-banned-type": "$1 kaasup tipeu koropak nu teu dicaram. {{PLURAL:$3|Nu diwidian nyaéta|Nu diwidian nyaéta}} $2.",
-       "api-error-filetype-missing": "Ngaran berkas euweuh éxténsian.",
-       "api-error-illegal-filename": "Ngaran berkas kitu dipahing.",
-       "api-error-mustbeloggedin": "Anjeun kudu asup log pikeun ngunggahkeun berkas.",
        "duration-seconds": "$1 {{PLURAL:$1|detik|detik}}",
        "duration-minutes": "$1 {{PLURAL:$1|menit|menit}}",
        "duration-hours": "$1 {{PLURAL:$1|jam|jam}}",
        "special-characters-group-gujarati": "Gujarati",
        "special-characters-group-thai": "Thai",
        "special-characters-group-lao": "Lao",
-       "special-characters-group-khmer": "Khmer"
+       "special-characters-group-khmer": "Khmer",
+       "gotointerwiki": "Ninggalkeun{{SITENAME}}",
+       "gotointerwiki-invalid": "Judul spésipik henteu valid"
 }
index 1f128e8..87d00c2 100644 (file)
        "post-expand-template-argument-warning": "Varning: Sidan innehåller en eller flera mallparametrar som blir för långa när de expanderas.\nDessa parametrar har uteslutits.",
        "post-expand-template-argument-category": "Sidor med uteslutna mallparametrar",
        "parser-template-loop-warning": "Mall-loop upptäckt: [[$1]]",
+       "template-loop-category": "Sidor med loopade mallar",
+       "template-loop-category-desc": "Sidan innehåller en loopad mall, d.v.s. en mall som anropar sig själv rekursivt.",
        "parser-template-recursion-depth-warning": "Gräns för mallrekursionsdjup överskriden ($1)",
        "language-converter-depth-warning": "Gräns för språkkonverteringsdjup överskriden ($1)",
        "node-count-exceeded-category": "Sidor där antalet noder har överskridits",
        "page_first": "första",
        "page_last": "sista",
        "histlegend": "Val av diff: markera i klickrutorna för att jämföra versioner och tryck enter eller knappen längst ner.<br />\nFörklaring: '''({{int:cur}})''' = skillnad mot senaste version; '''({{int:last}})''' = skillnad mot föregående version; '''{{int:minoreditletter}}''' = mindre ändring.",
-       "history-fieldset-title": "Bläddra i historiken",
-       "history-show-deleted": "Endast borttagna",
+       "history-fieldset-title": "Sök efter sidversioner",
+       "history-show-deleted": "Endast raderade sidversioner",
        "histfirst": "äldsta",
        "histlast": "nyaste",
        "historysize": "({{PLURAL:$1|1 byte|$1 byte}})",
        "prefs-help-prefershttps": "Ändringar av denna inställning börjar gälla nästa gång du loggar in",
        "prefswarning-warning": "Du har gjort ändringar i dina inställningarna som inte har sparats ännu.\nOm du lämnar denna sida utan att klicka på \"$1\" kommer dina inställningar inte att uppdateras.",
        "prefs-tabs-navigation-hint": "Tips: Du kan använda vänster och höger piltangenterna för att navigera mellan flikarna i listan flikar.",
-       "userrights": "Hantering av användarrättigheter",
+       "userrights": "Användarrättigheter",
        "userrights-lookup-user": "Välj en användare",
        "userrights-user-editname": "Skriv in ett användarnamn:",
        "editusergroup": "Läs in användargrupper",
        "saveusergroups": "Spara {{GENDER:$1|användargrupper}}",
        "userrights-groupsmember": "Medlem i:",
        "userrights-groupsmember-auto": "Implicit medlem av:",
-       "userrights-groups-help": "Du kan ändra vilka grupper denna användare är medlem i.\n* En ikryssad ruta betyder användaren är medlem i den gruppen.\n* En okryssad ruta betyder att användaren inte är medlem i den gruppen.\n* En asterisk (*) betyder att du inte kan ta bort gruppen när du har lagt till den, eller vice versa.\n* Ett nummertecken (#) betyder att du endast kan flytta tillbaka förfallotiden för denna grupp; du kan inte flytta fram den.",
+       "userrights-groups-help": "Du kan ändra vilka grupper denna användare är medlem i.\n* En ikryssad ruta betyder användaren är medlem i den gruppen.\n* En okryssad ruta betyder att användaren inte är medlem i den gruppen.\n* En asterisk (*) betyder att du inte kan ta bort gruppen när du har lagt till den, eller vice versa.\n* Ett nummertecken (#) betyder att du endast kan flytta tillbaka förfallotiden för detta gruppmedlemskap; du kan inte flytta fram den.",
        "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-expiry-options": "1 dag:1 dag,1 vecka:1 vecka,1 månad:1 månad,3 månader:3 månader,6 månader:6 månader,1 år:1 år",
        "userrights-invalid-expiry": "Förfallotiden för gruppen \"$1\" är ogiltig.",
        "userrights-expiry-in-past": "Förfallotiden för gruppen \"$1\" är i det förflutna.",
-       "userrights-cannot-shorten-expiry": "Du kan inte flytta fram förfallotiden för gruppen \"$1\". Endast användare med behörighet att lägga till och ta bort denna grupp kan flytta fram förfallodatum.",
+       "userrights-cannot-shorten-expiry": "Du kan inte flytta fram förfallotiden för medlemskapet i gruppen \"$1\". Endast användare med behörighet att lägga till och ta bort denna grupp kan flytta fram förfallodatum.",
        "userrights-conflict": "Konflikt vid ändringar av användarrättigheter! Var god granska och bekräfta dina ändringar.",
        "group": "Grupp:",
        "group-user": "Användare",
        "rcfilters-invalid-filter": "Ogiltigt filter",
        "rcfilters-empty-filter": "Inga aktiva filter. Alla bidrag visas.",
        "rcfilters-filterlist-title": "Filter",
+       "rcfilters-filterlist-whatsthis": "Vad är detta?",
        "rcfilters-filterlist-feedbacklink": "Ge återkoppling på nya (beta)filter",
        "rcfilters-highlightbutton-title": "Markera resultat",
        "rcfilters-highlightmenu-title": "Välj en färg",
+       "rcfilters-highlightmenu-help": "Välj en färg att markera denna egenskap",
        "rcfilters-filterlist-noresults": "Inga filter hittades",
+       "rcfilters-noresults-conflict": "Inga resultat hittades eftersom sökkriterierna är i konflikt",
+       "rcfilters-state-message-subset": "Detta filter har ingen effekt, eftersom resultaten inkluderar följande, bredare {{PLURAL:$2|filter}} (försök att markera för att särskilja det): $1",
+       "rcfilters-state-message-fullcoverage": "Att markera alla filter i en grupp är detsamma som att markera inget alls, så detta filter har igen effekt. Grupper som inkluderas: $1",
        "rcfilters-filtergroup-registration": "Användarregistrering",
        "rcfilters-filter-registered-label": "Registrerade",
        "rcfilters-filter-registered-description": "Inloggade redigerare.",
        "rcfilters-filter-unregistered-label": "Oregistrerade",
        "rcfilters-filter-unregistered-description": "Redigerare som inte är inloggade.",
+       "rcfilters-filter-unregistered-conflicts-user-experience-level": "Detta filter är i konflikt med följande {{PLURAL:$2|upplevelsefilter}}, som endast {{PLURAL:$2|hittar}} registrerade användare: $1",
        "rcfilters-filtergroup-authorship": "Redigera författarskap",
        "rcfilters-filter-editsbyself-label": "Dina egna redigeringar",
        "rcfilters-filter-editsbyself-description": "Redigeringar av dig.",
        "rcfilters-filter-editsbyother-label": "Redigeringar av andra",
        "rcfilters-filter-editsbyother-description": "Redigeringar som har skapats av andra användare (inte dig).",
        "rcfilters-filtergroup-userExpLevel": "Erfarenhetsnivå (endast för registrerade användare)",
-       "rcfilters-filter-userExpLevel-newcomer-label": "Nykomlingar",
-       "rcfilters-filter-userExpLevel-newcomer-description": "Färre än 10 redigeringar och 4 dagars aktivitet.",
-       "rcfilters-filter-userExpLevel-learner-label": "Nybörjare",
-       "rcfilters-filter-userExpLevel-learner-description": "Fler dagars aktivitet och redigeringar än \"Nybörjare\" men färre än \"Erfarna användare\".",
-       "rcfilters-filter-userExpLevel-experienced-label": "Erfarna användare",
-       "rcfilters-filter-userExpLevel-experienced-description": "Fler än 30 dagars aktivitet och 500 redigeringar.",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "Upplevelsefilter hittar endast registrerade användare, så detta filter är i konflikt med filtret \"Oregistrerade\".",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "Filtret \"Oregistrerade\" är i konflikt med en eller flera upplevelsefilter, som endast hittar registrerade användare. Filtren som är i konflikt är markerade i området med aktiva filter ovan.",
+       "rcfilters-filter-user-experience-level-newcomer-label": "Nykomlingar",
+       "rcfilters-filter-user-experience-level-newcomer-description": "Färre än 10 redigeringar och 4 dagars aktivitet.",
+       "rcfilters-filter-user-experience-level-learner-label": "Nybörjare",
+       "rcfilters-filter-user-experience-level-learner-description": "Fler dagars aktivitet och redigeringar än \"Nybörjare\" men färre än \"Erfarna användare\".",
+       "rcfilters-filter-user-experience-level-experienced-label": "Erfarna användare",
+       "rcfilters-filter-user-experience-level-experienced-description": "Fler än 30 dagars aktivitet och 500 redigeringar.",
        "rcfilters-filtergroup-automated": "Automatiserade bidrag",
        "rcfilters-filter-bots-label": "Bot",
        "rcfilters-filter-bots-description": "Redigeringar gjorda av automatiserade verktyg.",
        "rcfilters-filter-humans-label": "Människa (inte bot)",
        "rcfilters-filter-humans-description": "Redigeringar gjorda av mänskliga redigerare.",
+       "rcfilters-filtergroup-reviewstatus": "Granskningsstatus",
+       "rcfilters-filter-patrolled-label": "Patrullerade",
+       "rcfilters-filter-patrolled-description": "Redigeringar markerade som patrullerade.",
+       "rcfilters-filter-unpatrolled-label": "Inte patrullerade",
+       "rcfilters-filter-unpatrolled-description": "Redigeringar som inte är markerade som patrullerade.",
        "rcfilters-filtergroup-significance": "Betydelse",
        "rcfilters-filter-minor-label": "Mindre redigeringar",
        "rcfilters-filter-minor-description": "Redigeringar som är märkta som mindre.",
        "rcfilters-filter-categorization-description": "Poster av sidor som läggs till eller tas bort från kategorier.",
        "rcfilters-filter-logactions-label": "Loggade åtgärder",
        "rcfilters-filter-logactions-description": "Administrativa åtgärder, kontoskapande, sidraderingar, uppladdningar....",
+       "rcfilters-hideminor-conflicts-typeofchange-global": "Filtret \"Mindre redigering\" är i konflikt med en eller flera ändringstypfilter, eftersom vissa ändringstyper inte kan betecknas som \"mindre\". Filtren som är i konflikt är markerade i området med aktiva filter ovan.",
+       "rcfilters-hideminor-conflicts-typeofchange": "Vissa ändringstyper kan inte betecknas som \"mindre\", så detta filter är i konflikt med följande ändringstypfilter: $1",
+       "rcfilters-typeofchange-conflicts-hideminor": "Detta ändringstypfilter är i konflikt med filtret \"Mindre ändringar\". Vissa ändringstyper kan inte betecknas som \"mindre\".",
        "rcnotefrom": "Nedan visas {{PLURAL:$5|ändringen|ändringar}} sedan <strong>$3, $4</strong> (upp till <strong>$1</strong> ändringar visas).",
+       "rclistfromreset": "Återställ datumval",
        "rclistfrom": "Visa nya ändringar från och med $2 $3",
        "rcshowhideminor": "$1 mindre ändringar",
        "rcshowhideminor-show": "Visa",
        "php-uploaddisabledtext": "Filuppladdningar i PHP är avaktiverade. \nKolla inställningarna för file_uploads.",
        "uploadscripted": "Denna fil innehåller HTML eller script som felaktigt kan komma att tolkas av webbläsare.",
        "upload-scripted-pi-callback": "Kan inte ladda upp en fil som innehåller instruktioner för behandling av XML-stylesheet.",
+       "upload-scripted-dtd": "Kan inte ladda upp SVG-filer som innehåller en icke-standardiserad DTD-deklaration.",
        "uploaded-script-svg": "Hittade skriptelementet \"$1\" i den uppladdade SVG-filen.",
        "uploaded-hostile-svg": "Hittade osäker CSS i den uppladdade filens stilelement.",
        "uploaded-event-handler-on-svg": "Att ange event-handler-attribut <code>$1=\"$2\"</code> är inte tillåtet i SVG-filer.",
        "undeleteviewlink": "visa",
        "undeleteinvert": "Invertera urval",
        "undeletecomment": "Anledning:",
-       "undeletedrevisions": "{{PLURAL:$1|en version återställd|$1 versioner återställda}}",
-       "undeletedrevisions-files": "$1 {{PLURAL:$1|version|versioner}} och $2 {{PLURAL:$2|fil|filer}} återställda",
-       "undeletedfiles": "{{PLURAL:$1|en fil återställd|$1 filer återställda}}",
        "cannotundelete": "En del eller alla återställningar misslyckades:\n$1",
        "undeletedpage": "'''$1 har återställts'''\n\nSe [[Special:Log/delete|raderingsloggen]] för en förteckning över de senaste raderingarna och återställningarna.",
        "undelete-header": "Se [[Special:Log/delete|raderingsloggen]] för nyligen raderade sidor.",
        "whatlinkshere-hideimages": "$1 fillänkar",
        "whatlinkshere-filters": "Filter",
        "whatlinkshere-submit": "Gå",
-       "autoblockid": "Autoblockera #$1",
+       "autoblockid": "Autoblockering #$1",
        "block": "Blockera användare",
        "unblock": "Upphäv blockering av användare",
        "blockip": "Blockera {{GENDER:$1|användare}}",
        "newimages-summary": "Den här specialsidan visar de senast uppladdade filerna.",
        "newimages-legend": "Filter",
        "newimages-label": "Filnamn (eller en del av det):",
+       "newimages-user": "IP-adress eller användarnamn",
        "newimages-showbots": "Visa uppladdningar av botar",
        "newimages-hidepatrolled": "Dölj patrullerade uppladdningar",
        "noimages": "Ingenting att se.",
        "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-restore": "$1 {{GENDER:$2|återställde}} sidan $3 ($4)",
+       "logentry-delete-restore-nocount": "$1 {{GENDER:$2|återställde}} sidan $3",
+       "restore-count-revisions": "{{PLURAL:$1|1 sidversion|$1 sidversioner}}",
+       "restore-count-files": "{{PLURAL:$1|1 fil|$1 filer}}",
        "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",
        "logentry-delete-event-legacy": "$1 {{GENDER:$2|ändrade}} synligheten för logghändelser på $3",
        "special-characters-group-thai": "Thai",
        "special-characters-group-lao": "Laotiska",
        "special-characters-group-khmer": "Khmer",
+       "special-characters-group-canadianaboriginal": "Kanadensisk stavelseskrift",
        "special-characters-title-endash": "tankstreck",
        "special-characters-title-emdash": "långt tankstreck",
        "special-characters-title-minus": "minustecken",
        "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>",
        "revid": "sidversion $1",
-       "pageid": "sid-ID $1"
+       "pageid": "sid-ID $1",
+       "rawhtml-notallowed": "&lt;html&gt;-taggar kan inte användas utanför normala sidor.",
+       "gotointerwiki": "Lämnar {{SITENAME}}",
+       "gotointerwiki-invalid": "Den angivna titeln var ogiltig.",
+       "gotointerwiki-external": "Du håller på att lämna {{SITENAME}} för att besöka [[$2]] som är en separat webbplats.\n\n[$1 Klicka här för att fortsätta till $1].",
+       "undelete-cantedit": "Du kan inte återställa denna sida eftersom du är inte tillåten att redigera denna sida.",
+       "undelete-cantcreate": "Du kan inte återställa denna sida eftersom det inte finns någon befintlig sida med detta namn och du tillåts inte att skapa denna sida."
 }
index a4911dc..998f374 100644 (file)
        "december-date": "ದಸಂಬರ $1",
        "period-am": "ಕಾಂಡೆ",
        "period-pm": "ಬೈಯ್ಯ",
-       "pagecategories": "{{PLURAL:$1|ವರ್ಗೊ|ವರ್ಗೊಲು}}",
+       "pagecategories": "{{PLURAL:$1|Category|ವರ್ಗೊಲು}}",
        "category_header": "\"$1\" ವರ್ಗಡುಪ್ಪುನಂಚಿನ ಲೇಕನೊಲು",
        "subcategories": "ಉಪ ವರ್ಗೊಲು",
        "category-media-header": "\"$1\" ವರ್ಗಡುಪ್ಪುನಂಚಿನ ಚಿತ್ರೊ/ಶಬ್ಧೊ ಫೈಲ್‍ಲು",
        "category-empty": "''ಈ ವರ್ಗೊಡು ಸದ್ಯಗ್ ಓವುಲ ಪುಟೊಲಾವಡ್ ಅತ್ತ್’ನ್ಡ ಚಿತ್ರೊಲಾವಡ್ ಇಜ್ಜಿ.''",
-       "hidden-categories": "{{PLURAL:$1|ದೆಂಗಾದ್ ದೀಡ್‍ನ ವರ್ಗೊ|ದೆಂಗಾದ್ ದೀಡ್‍ನ ವರ್ಗೊಲು}}",
+       "hidden-categories": "{{PLURAL:$1|Hidden category|ದೆಂಗಾದ್ ದೀಡ್‍ನ ವರ್ಗೊಲು}}",
        "hidden-category-category": "ದೆಂಗಾದ್ ದೀತಿನ ವರ್ಗೊಲು",
-       "category-subcat-count": "{{PLURAL:$2|ಈ ವರ್ಗೊಡು ಈ ತಿರ್ತ್‍ದ ಉಪವರ್ಗ ಉಂಡು.|ಈ ವರ್ಗೊಡು ಈ ತಿರ್ತ್‍ದ {{PLURAL:$1|ಉಪವರ್ಗೊನು|$1 ಉಪವರ್ಗೊಲೆನ್}} ಸೇರಾದ್, ಒಟ್ಟಿಗೆ $2 ಉಂಡು.}}",
+       "category-subcat-count": "{{PLURAL:$2|This category has only the following subcategory.|ಈ ವರ್ಗೊಡು ಈ ತಿರ್ತ್‍ದ {{PLURAL:$1|subcategory|$1 ಉಪವರ್ಗೊಲೆನ್}} ಸೇರಾದ್, ಒಟ್ಟಿಗೆ $2 ಉಂಡು.}}",
        "category-subcat-count-limited": "ಈ ವರ್ಗೊಡು ತಿರ್ತ್ ತೊಜ್ಪಾದಿನ {{PLURAL:$1|ಉಪವರ್ಗ|$1 ಉಪವರ್ಗೊಲು}} ಉಂಡು.",
-       "category-article-count": "{{PLURAL:$2|ಈ ವರ್ಗೊಡು ಈ ತಿರ್ತ್‍ದ ಕಾಲಿ ಒಂಜಿ ಪುಟೊ ಉಂಡು.|ಈ ವರ್ಗೊಡು ಈ ತಿರ್ತ್‍ದ {{PLURAL:$1|ಪುಟೊನು|$1 ಪುಟೊಲೆನ್}} ಸೇರ್ಪಾದ್, ಒಟ್ಟಿಗೆ $2 ಪುಟೊಲು ಉಂಡು.}}",
+       "category-article-count": "{{PLURAL:$2|This category contains only the following page.|ಈ ವರ್ಗೊಡು ಈ ತಿರ್ತ್‍ದ {{PLURAL:$1|page is|$1 ಪುಟೊಲೆನ್}} ಸೇರ್ಪಾದ್, ಒಟ್ಟಿಗೆ $2 ಪುಟೊಲು ಉಂಡು.}}",
        "category-article-count-limited": "ಪ್ರಸಕ್ತ ವರ್ಗೊಡು ಈ ತಿರ್ತ್’ದ {{PLURAL:$1|ಪುಟ ಉಂಡು|$1 ಪುಟೊಲು ಉಂಡು}}.",
        "category-file-count": "{{PLURAL:$2|ಈ ವರ್ಗೊಡು ಈ ತಿರ್ತ್‍ದ ಕಾಲಿ ಒಂಜಿ ಫೈಲ್ ಉಂಡು.|ಈ ವರ್ಗೊಡು ಈ ತಿರ್ತ್‍ದ {{PLURAL:$1| ಫೈಲ್‍ನ್|$1  ಫೈಲ್‍ನ್}} ಸೇರ್ಪಾದ್, ಒಟ್ಟಿಗೆ $2 ಉಂಡು.}}",
        "category-file-count-limited": "ಪ್ರಸಕ್ತ ವರ್ಗೊಡು ಈ ತಿರ್ತ್’ದ {{PLURAL:$1|ಫೈಲ್ ಉಂಡು|$1 ಫೈಲ್’ಲು ಉಂಡು}}.",
        "welcomecreation-msg": "ಈರೆನ ಕಾತೆನ್ ದೆತ್ತ್‌ದಾತ್ಂಡ್.  ಈರೆನ [[Special:Preferences|{{SITENAME}} ಆಯ್ಕೆನ್]]ಬದಲ್ಪೆರೆ ಮರಪೊಡ್ಚಿ.",
        "yourname": "ಸದಸ್ಯೆರ್ನ ಪುದರ್:",
        "userlogin-yourname": "ಸದಸ್ಯೆರ್ನ ಪುದರ್",
-       "userlogin-yourname-ph": "ಈರೆನ ಸದಸ್ಯ ಪುದರ್ ಬರೆಲೆ",
+       "userlogin-yourname-ph": "ಈರೆನ ಸದಸ್ಯ ಪುದರ್ ಬರೆಲೆ",
        "createacct-another-username-ph": "ಈರೆನೆ ಸದಸ್ಯ ಪುದರ್ ಬರೆಲೆ",
        "yourpassword": "ಪಾಸ್-ವರ್ಡ್:",
        "userlogin-yourpassword": "ಪ್ರವೇಸೊಪದೊ",
        "password-change-forbidden": "ಈರ್ ಈ ವಿಕಿಡ್ ಪ್ರರವೇಸ ಪದೊನು ಬದಲ್ಪೆರೆ ಸಾದ್ಯೊ ಇದ್ದಿ.",
        "login": "ಲಾಗಿನ್ ಆಲೆ",
        "nav-login-createaccount": "ಲಾಗ್-ಇನ್ / ಅಕೌಂಟ್ ಸೃಷ್ಟಿ ಮಲ್ಪುಲೆ",
-       "userlogin": "ಲಾಗ್-ಇನ್ / ಅಕೌಂಟ್ ಸೃಷ್ಟಿ ಮಲ್ಪುಲೆ",
-       "userloginnocreate": "ಲಾಗಿನ್ ಆಲೆ",
        "logout": "ಲಾಗ್ ಔಟ್",
        "userlogout": "ಲಾಗ್ ಔಟ್",
        "notloggedin": "ಲಾಗಿನ್ ಆತ್‘ಜ್ಜರ್",
-       "userlogin-noaccount": "à²\95ಾತà³\86 à²\87ದà³\8dದಿಯಾ?",
+       "userlogin-noaccount": "à²\88ರà³\86ನ à²\96ಾತà³\86 à²\87à²\9cà³\8dà²\9cà³\87?",
        "userlogin-joinproject": "{{SITENAME}}ಗ್ ಸೇರ್ಲೆ",
-       "nologin": "ಈರೆನ ಖಾತೆ ಇಜ್ಜೇ?'''$1'''",
-       "nologinlink": "ಪೊಸ ಖಾತೆ ಸುರು ಮಲ್ಪುಲೆ",
        "createaccount": "ಪೊಸ ಅಕ್ಕೌಂಟ್ ಸುರು ಮಲ್ಪುಲೆ",
-       "gotaccount": "ಈರೆನ ಖಾತೆ ಉಂಡೇ?'''$1'''",
-       "gotaccountlink": "ಲಾಗಿನ್ ಆಲೆ",
-       "userlogin-resetlink": "ಈರೆನ ಲಾಗಿನ್ ವಿವರ ಮರತ್ತ್ಂಡೇ?",
        "userlogin-resetpassword-link": "ಈರೆನೆ ಪ್ರವೇಸೊ ಪದೊ ಮರತ್ತ್‌ಂಡಾ?",
        "userlogin-helplink2": "ಲಾಗಿನ್ ಆಯರ ಸಹಾಯೊ",
        "userlogin-createanother": "ಪೊಸ ಕಾತೆ ಸುರು ಮಲ್ಪುಲೆ",
        "createacct-another-email-ph": "ಇ-ಅಂಚೆ ವಿಳಾಸೊನು ಬದಲಾವಣೆ ಮಲ್ಪುಲೆ",
        "createaccountmail": "(ರಾಂಡಮ್) ತಾತ್ಕಾಲಿಕವಾದ್ ಯಾದೃಚ್ಛಿಕ ಪಾಸ್ವರ್ಡ್ ಆಯ್ಕೆ ಮಾಲ್ಪುಲೆ ಬುಕ್ಕೊ ಇಮೇಲ್ ವಿಳಾಸೊನು ಸೂಚಿಸದ್ : ಕಡಪುಡುಲೆ",
        "createacct-realname": "ನಿಜವಾಯಿನ ಪುದರ್(ಐಚ್ಛಿಕೊ)",
-       "createaccountreason": "ಕಾರಣ",
        "createacct-reason": "ಕಾರಣೊ",
        "createacct-reason-ph": "ಈರ್ ದಾಯೆ ನಾನಲ ಒಂಜಿ ಕಾತೆ ದೆತ್ತೊಂದುಲ್ಲರ್?",
        "createacct-submit": "ಪೊಸ ಕಾತೆ ಸುರು ಮಲ್ಪುಲೆ",
        "createacct-another-submit": "ಪೊಸ ಕಾತೆ ಸುರು ಮಲ್ಪುಲೆ",
-       "createacct-benefit-heading": "{{SITENAME}}ನಿà²\95à³\8dಲà³\86ನà²\82à²\9aಿತà³\8dತಿನ à²\9cನà³\8aà²\95à³\8dಲà³\86ಡà³\8dದà³\8d à²\89à²\82ಡಾಪà³\81à²\82ಡà³\81.",
-       "createacct-benefit-body1": "{{PLURAL:$1|ಸಂಪೊದನೆ|ಸಂಪದೊನೆಲು}}",
-       "createacct-benefit-body2": "{{PLURAL:$1|ಪುಟೊ|ಪುಟೊಕ್ಕುಲು}}",
-       "createacct-benefit-body3": "{{PLURAL:$1|ಇನಾಮು|ಇನಾಮುಲು}}",
+       "createacct-benefit-heading": "{{SITENAME}}à²\89à²\82ಡà³\8d à²¨à²¿à²\95à³\8dಲà³\86ನà²\82à²\9aಿತà³\8dತಿನ à²\8eಡà³\8dದà³\86ನà³\8dತà²\82à²\95à³\8dಲà³\86ಡà³\8dದà³\8d à²\89à²\82ಡಾತà³\81à²\82ಡà³\8d.",
+       "createacct-benefit-body1": "{{PLURAL:$1|edit|ಸಂಪದೊನೆಲು}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|page|ಪುಟೊಕ್ಕುಲು}}",
+       "createacct-benefit-body3": "ಇಂಚಿಪೊ{{PLURAL:$1|contributor|ಕಾಣಿಕೆ ಕೊರ್ನರ್}}",
        "badretype": "ಈರ್ ಕೊರ್ನ ಪ್ರವೇಶ ಪದೆ ಬೇತೆ ಬೇತೆ ಅತ್ಂಡ್",
        "userexists": "ಈರ್ ಕೊರ್ನ ಸದಸ್ಯರ ಪುದರ್ ಬಳಕೆಡ್ ಉಂಡು. ದಯದೀದ್ ಬೇತೆ ಪುದರ್ ಕೊರ್ಲೆ",
        "loginerror": "ಲಾಗಿನ್ ದೋಷ",
        "link_sample": "ಕೊಂಡಿದ ಸೀರ್ಸಿಕೆ",
        "link_tip": "ಉಲಯಿದ ಕೊಂಡಿ",
        "extlink_sample": "http://www.example.com ಕೊಂಡಿದ ಸೀರ್ಸಿಕೆ",
-       "extlink_tip": "ಪಿದಯಿದ ಕೊಂಡಿ(http://ರ್ದ್ ಸುರು ಮಲ್ಪೆರೆ ಮರಪೊಡ್ಚಿ)",
+       "extlink_tip": "ಪಿದಯಿದ ಕೊಂಡಿ(http:// ರ್ದ್ ಸುರು ಮಲ್ಪೆರೆ ಮರಪೊಡ್ಚಿ)",
        "headline_sample": "ಪಟ್ಯೊದ ಸೀರ್ಸಿಕೆ",
        "headline_tip": "2ನೇ ಮಟ್ಟೊದ ಸೀರ್ಸಿಕೆ",
        "nowiki_sample": "ಮುಲ್ಪ ಫಾರ್ಮೇಟ್ ಆವಂದಿನಂಚಿನ ಪಟ್ಯೊನು ಸೇರಲೆ",
        "newarticle": "(ಪೊಸತ್)",
        "newarticletext": "ನನಲ ಅಸ್ಥಿತ್ವಡ್ ಉಪ್ಪಂದಿನ ಪುಟೊಗು ಈರ್ ಬೈದರ್.\nಈ ಪುಟೊನು ಸ್ರಿಸ್ಟಿ ಮಲ್ಪೆರೆ ತಿರ್ತ್‍ದ ಚೌಕೊಡು ಬರೆಯೆರೆ ಸುರು ಮಲ್ಪುಲೆ.\n(ಜಾಸ್ತಿ ಮಾಹಿತಿಗ್ [$1 ಸಹಾಯ ಪುಟೊನು] ತೂಲೆ).\nಈ ಪುಟೊಕು ಈರ್ ತಪ್ಪಾದ್ ಬತ್ತಿತ್ತ್ಂಡ ಇರೆನ ಬ್ರೌಸರ್‍ದ '''back''' ಬಟನ್’ನ್ ಒತ್ತ್’ಲೆ.",
        "noarticletext": "ಈ ಪುಟೊಡ್ ಸದ್ಯಗ್ ಒವ್ವೇ ಬರವುಲಾ ಇಜ್ಜಿ, ಈರ್ ಬೇತೆ ಪುಟೊಡ್ [[Special:Search/{{PAGENAME}}|ಈ ಲೇಕನೊನು ನಾಡೊಲಿ]] <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ಸಂಬಂದೊ ಇತ್ತಿನ ದಾಕಲೆನ್ ನಾಡ್‍ಲೆ], ಅತ್ತಾಂಡ  [{{fullurl:{{FULLPAGENAME}}|action=edit}} ಈ ಪುಟೊನು ಸಂಪೊಲಿಪೊಲಿ]</span>.",
-       "noarticletext-nopermission": "ಈ ಪುಟೊಡ್ ಸದ್ಯಗ್ ಒವ್ವೇ ಬರವುಲಾ ಇಜ್ಜಿ, ಈರ್ ಬೇತೆ ಪುಟೊಡ್ [[Special:Search/{{PAGENAME}}|ಈ ಲೇಕನೊನು ನಾಡೊಲಿ]] <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ಸಂಬಂದೊ ಇತ್ತ್‌ನ ಲಾಗ್‌ನ್ ನಾಡ್‍ಲೆ], ಅತ್ತ್ಂಡ  [{{fullurl:{{FULLPAGENAME}}|action=edit}} ಈ ಪುಟೊನು ಸಂಪೊಲಿಪೊಲಿ]</span>.",
+       "noarticletext-nopermission": "ಈ ಪುಟೊಡ್ ಸದ್ಯಗ್ ಒವ್ವೇ ಬರವುಲಾ ಇಜ್ಜಿ, ಈರ್ ಬೇತೆ ಪುಟೊಡ್ [[Special:Search/{{PAGENAME}}|ಈ ಲೇಕನೊನು ನಾಡೊಲಿ]] <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ಸಂಬಂದೊ ಇತ್ತ್‌ನ ಲಾಗ್‌ನ್ ನಾಡ್‍ಲೆ],[{{fullurl:{{FULLPAGENAME}}|action=edit}} ಅಂಡ ಇರೆಗ್ ಈ ಪುಟೊನು ಸಂಪೊಲಿಪೊಲಿಪುನೆಗ್ ಒಪ್ಪಿಗೆ ಇಜ್ಜಿ]</span>.",
        "userpage-userdoesnotexist": "ಬಳಕೆದಾರ ಖಾತೆ \"<nowiki>$1</nowiki>\" ದಾಖಲಾತ್‘ಜ್ಜಿ. ಈರ್ ಉಂದುವೇ ಪುಟನ್ ಸಂಪಾದನೆ ಮಲ್ಪರ ಉಂಡಾಂದ್ ಖಾತ್ರಿ ಮಲ್ತೊನಿ.",
        "previewnote": "'''ಉಂದು ಕೇವಲ ಮುನ್ನೋಟ; ಪುಟೊನು ನನಲ ಒರಿಪಾದಿಜಿ ಪನ್ಪುನೇನ್ ಮರಪೊರ್ಚಿ!'''",
        "editing": "$1 ಲೇಕನೊನು ಈರ್ ಸಂಪಾದನೆ ಮಲ್ತೊಂದುಲ್ಲರ್",
        "yourtext": "ಇರೆನ ಸಂಪಾದನೆ",
        "yourdiff": "ವ್ಯತ್ಯಾಸೊಲು",
        "copyrightwarning": "ದಯಮಲ್ತ್’ದ್ ಗಮನಿಸ್’ಲೆ: {{SITENAME}} ಸೈಟ್’ಡ್ ಇರೆನ ಪೂರಾ ಕಾಣಿಕೆಲುಲಾ $2 ಅಡಿಟ್ ಬಿಡುಗಡೆ ಆಪುಂಡು (ಮಾಹಿತಿಗ್ $1 ನ್ ತೂಲೆ). ಇರೆನ ಸಂಪಾದನೆಲೆನ್ ಬೇತೆಕುಲು ನಿರ್ಧಾಕ್ಷಿಣ್ಯವಾದ್ ಬದಲ್ ಮಲ್ತ್’ದ್ ಬೇತೆ ಕಡೆಲೆಡ್ ಪಟ್ಟೆರ್. ಇಂದೆಕ್ ಇರೆನ ಒಪ್ಪಿಗೆ ಇತ್ತ್’ನ್ಡ ಮಾತ್ರ ಮುಲ್ಪ ಸಂಪಾದನೆ ಮಲ್ಪುಲೆ.<br />\nಅತ್ತಂದೆ ಇರೆನ ಸಂಪಾದನೆಲೆನ್ ಈರ್ ಸ್ವತಃ ಬರೆತರ್, ಅತ್ತ್’ನ್ಡ ಕೃತಿಸ್ವಾಮ್ಯತೆ ಇಜ್ಜಂದಿನ ಕಡೆರ್ದ್ ದೆತೊನ್ದರ್ ಪಂಡ್’ದ್ ಪ್ರಮಾಣಿಸೊಂದುಲ್ಲರ್.\n'''ಕೃತಿಸ್ವಾಮ್ಯತೆದ ಅಡಿಟುಪ್ಪುನಂಚಿನ ಕೃತಿಲೆನ್ ಒಪ್ಪಿಗೆ ಇಜ್ಜಂದೆ ಮುಲ್ಪ ಪಾಡೊಚಿ!'''",
-       "templatesused": "ಈ ಪುಟೊಟ್ ಉಪಯೋಗ ಮಲ್ತಿನ {{PLURAL:$1|ಟೆಂಪ್ಲೇಟು|ಟೆಂಪ್ಲೇಟುಗಳು}}:",
+       "templatesused": "ಈ ಪುಟೊಟ್ ಉಪಯೋಗ ಮಲ್ತಿನ {{PLURAL:$1|Template|ಟೆಂಪ್ಲೇಟುಲೂ}}:",
        "templatesusedpreview": "ಈ ಮುನ್ನೋಟೊಡು ಉಪಯೋಗ ಮಲ್ತಿನ{{PLURAL:$1|Template|Templates}}:",
        "templatesusedsection": "ಈ ಇಬಾಗೊಡು ಉಪಯೋಗ ಮಲ್ತಿನ {{PLURAL:$1|Template|Templates}}:",
        "template-protected": "(ಸಂರಕ್ಷಿತೊ)",
        "template-semiprotected": "(ಅರೆ-ಸಂರಕ್ಷಿತೊ)",
-       "hiddencategories": "ಈ ಪುಟೊ {{PLURAL:$1|೧ ಗುಪ್ತ ವರ್ಗೊಗ್|$1 ಗುಪ್ತ ವರ್ಗೊಲೆಗ್}} ಸೇರ್ದ್‍ನ್ಡ್:",
+       "hiddencategories": "ಈ ಪುಟೊನ್ {{PLURAL:$1|1 hidden category|$1 ಗುಪ್ತ ವರ್ಗೊಲೆಗ್}} ಸೇರ್ದ್‍ನ್ಡ್:",
        "permissionserrors": "ಅನುಮತಿ ದೋಷ",
-       "permissionserrorstext-withaction": "$2 ಗ್ ಇರೆಗ್ ಅನುಮತಿ ಇದ್ದಿ, ಅಯಿಕ್ {{PLURAL:$1|ಕಾರಣೊ|ಕಾರಣೊಲು}}:",
+       "permissionserrorstext-withaction": "$2 ಗ್ ಇರೆಗ್ ಅನುಮತಿ ಇದ್ದಿ, ಅಯಿಕ್ {{PLURAL:$1||reason|ಕಾರಣೊಲು}}:",
        "moveddeleted-notice": "ಈ ಪುಟೊ ಅಸ್ತಿತ್ವೊಡ್ ಇದ್ದಿ.\nಪುಟೊದ ಡಿಲೀಶನ್ ಅತ್ತ್ಂಡ್ ಕಡಪ್ಪುಡುನೆ ಲಾಗ್‍ನ್ ತೂಯರೆ ತಿರ್ತ್ ಕೊರ್ತ್ಂಡ್.",
        "postedit-confirmation-created": "ಈ ಪುಟೋನು ಉಂಡು ಮಾನ್ತುಂಡು.",
        "postedit-confirmation-saved": "ಇರೇನಾ ಸಂಪಾದನೆನ್ ಒರಿಪಾತುಂಡು.",
        "revisionasof": "$1ದಿನೊತ ಆವೃತ್ತಿ",
        "revision-info": "ಬದಲಾವಣೆ $1 ಲೆಕ್ಕೊ {{GENDER:$6|$2}} ಇಂಬೆರೆಡ್ದ್ $7",
        "previousrevision": "←ದುಂಬೊರೊ ತೂಯಿನ",
-       "nextrevision": "ದುಂಬುದ ತಿದ್ದುಪಡಿ",
+       "nextrevision": "ದುಂಬುದ ತಿದ್ದುಪಡಿ →",
        "currentrevisionlink": "ಇತ್ತೆದ ತಿದ್ದುಪಡಿ",
        "cur": "ಸದ್ಯೊ",
        "next": "ಬೊಕ್ಕದ",
        "searchresults": "ನಾಡ್‍ಪತ್ತ್‌ನೆದ ಪಲಿತಾಂಸೊಲು",
        "searchresults-title": "\"$1\"ಕ್ ನಾಡ್‍ಪತ್ತ್‌ನೆದ ಪಲಿತಾಂಸೊಲು",
        "notextmatches": "ವಾ ಪುಟೊತ ಪಠ್ಯೊಡುಲಾ ಹೋಲಿಕೆ ಇಜ್ಜಿ",
-       "prevn": "ದುಂಬು {{PLURAL:$1|$1}}",
+       "prevn": "ದುಂಬುತ್ತ {{PLURAL:$1|$1}}",
        "nextn": "ಬೊಕ್ಕೊ {{PLURAL:$1|$1}}",
        "prev-page": "ದುಂಬುತ ಪುಟೊ",
        "next-page": "ನನತಾ ಪುಟ",
        "nextn-title": "ದುಂಬುದ $1 {{PLURAL:$1|result|ಪಲಿತಾಂಸೊಲು}}",
        "shown-title": "ಪ್ರತಿ ಪುಟೊಡುಲಾ $1 {{PLURAL:$1|result|ಪಲಿತಾಂಸೊ}} ತೋಜಿಪಾವು",
-       "viewprevnext": "ತೂಲೆ($1 {{int:pipe-separator}} $2) ($3)",
+       "viewprevnext": "ತೂಲೆ ($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-new": "<strong>ಈ ಪುಟೊನು ರಚಿಸಲೆ \"[[:$1]]\" ಈ ವಿಕಿಡ್!</strong> {{PLURAL:$2|0=|See also the page found with your search.|ನಾಡ್‍ನಗ ತೋಜಿದ್ ಬರ್ಪುನ ಪಲಿತಾಂಸೊನು ತೂಲೆ.}}",
        "searchprofile-articles": "ಲೇಕನೊ ಪುಟೊ",
        "searchprofile-images": "ಮಲ್ಟಿಮೀಡಿಯೊ",
        "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": "ಬಳಗದ ಇತರ ಯೋಜನೆಲು",
        "recentchanges-label-bot": "ಈ ಸಂಪದನೆ ಒಂಜಿ ಬಾಟ್‍ಡ್ ಆತ್ಂಡ್",
        "recentchanges-label-unpatrolled": "ಈ ಸಂಪಾದನೆನ್ ನನಲಾ ಪರೀಕ್ಷೆ ಮಲ್ತ್‌ಜಿ.",
        "recentchanges-label-plusminus": "ಬೈಟ್ಸ್‌ದ ಲೆಕ್ಕೊಡು ಈ ಪಾಲೆದ ಗಾತ್ರೊ ಬದಲಾತ್ಂಡ್",
-       "recentchanges-legend-heading": "<strong>ಲà³\86à²\9cà³\86à²\82ಡà³\8d:</strong>",
+       "recentchanges-legend-heading": "<strong>ಪರಿವಿಡಿ:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ಬೊಕ್ಕೊಲಾ ತೂಲೆ [[Special:NewPages|ಪೊಸ ಪುಟೊದ ಪಟ್ಟಿ]])",
        "recentchanges-submit": "ತೋಜಾಲೆ",
-       "rcfilters-filter-userExpLevel-learner-label": "ಕಲ್ಪುನರ್",
+       "rcfilters-filterlist-whatsthis": "ಉಂದು ದಾದಾ?",
+       "rcfilters-filter-user-experience-level-learner-label": "ಕಲ್ಪುನರ್",
        "rclistfrom": "$3 $2 ರ್ದ್ ಸುರುವಾತಿನ ಪೊಸ ಬದಲಾವಣೆಲೆನ್ ತೊಜ್ಪಾವು",
        "rcshowhideminor": "$1 ಎಲ್ಯೆಲ್ಯ ಬದಲಾವಣೆಲು",
        "rcshowhideminor-show": "ತೋಜಾಲೆ",
        "filehist-filesize": "ಫೈಲ್’ದ ಗಾತ್ರ",
        "filehist-comment": "ಅಬಿಪ್ರಾಯೊ",
        "imagelinks": "ಫೈಲ್‍ದ ಬಳಕೆ",
-       "linkstoimage": "ಈ ತಿರ್ತ್‍ದ {{PLURAL:$1|ಪುಟ|$1 ಪುಟೊಲೆ ಕೊಂಡಿ}}ಈ ಫೈಲ್‍ಗ್ ಕೊರ್ಪುಂಡು.",
+       "linkstoimage": "ಈ ತಿರ್ತ್‍ದ {{PLURAL:$1|page links|$1 ಪುಟೊಲೆ ಕೊಂಡಿ}}ಈ ಫೈಲ್‍ಗ್ ಕೊನಪೋಪುಂಡು.",
        "nolinkstoimage": "ಈ ಫೈಲ್‍ಗ್ ಸಂಪರ್ಕೊ ಉಪ್ಪುನ ವಾ ಪುಟೊಲಾ ಇದ್ದಿ.",
        "sharedupload": "ಈ ಫೈಲ್’ನ್ ಮಸ್ತ್ ಜನ ಪಟ್ಟ್’ದುಲ್ಲೆರ್ ಅಂಚೆನೆ ಉಂದು ಮಸ್ತ್ ಪ್ರೊಜೆಕ್ಟ್’ಲೆಡ್ ಉಪಯೋಗಿಸೊಲಿ",
        "sharedupload-desc-here": "ಈ ಪುಟೊ $1ಡ್ದ್ ಬೊಕ್ಕ ಬೇತೆ ಯೋಜನೆಡ್ದ್ ಗಳಸೊಲಿ.\nಈ ಪುಟೊತ ವಿವರೊ [$2 ಪುಟೊತ ವಿವರೊ] ತಿರ್ತ ಸಾಲ್‍ಡ್ ತೋಜಾದ್ಂಡ್",
        "brokenredirects-edit": "ಸಂಪೊಲಿಪುಲೆ",
        "brokenredirects-delete": "ಮಾಜಾಲೆ",
        "withoutinterwiki-submit": "ತೋಜಾಲೆ",
-       "nbytes": "$1 {{PLURAL:$1|ಬೈಟ್|ಬೈಟ್‍ಲು}}",
-       "nmembers": "$1 {{PLURAL:$1|ಸದಸ್ಯೆ|ಸದಸ್ಯೆರ್}}",
+       "nbytes": "$1 {{PLURAL:$1|byte|ಬೈಟ್‍ಲು}}",
+       "nmembers": "$1 {{PLURAL:$1|member|ಸದಸ್ಯೆರ್}}",
        "wantedfiles": "ಬೋಡಾಯಿನ ಕಡತೊಲು",
        "prefixindex": "ಪೂರ್ವನಾಮೊಲ್ದ ಸೂಚಿಕೆ",
        "prefixindex-submit": "ತೋಜಾಲೆ",
        "move": "ಮೂವ್(ಸ್ಥಳಾಂತರ) ಮಲ್ಪುಲೆ",
        "movethispage": "ಈ ಪುಟೊನು ಮೂವ್ ಮಲ್ಪುಲೆ",
        "pager-newer-n": "{{PLURAL:$1|ಪೊಸ ೧|ಪೊಸ $1}}",
-       "pager-older-n": "{{PLURAL:$1|ಪರತ್ತ್ ೧|ಪರತ್ತ್ $1}}",
+       "pager-older-n": "{{PLURAL:$1|older 1|ಪರತ್ತ್ $1}}",
        "apisandbox-reset": "ಮಾಜಲೇ",
        "apisandbox-retry": "ನನೊರ ಪ್ರಯತ್ನ ಮಾನ್ಪುಲೇ",
        "apisandbox-examples": "ಉದಾಹರಣೆಲು",
        "namespace_association": "ಜತೆಟಿತ್ತಿನ ಪುದರ್",
        "tooltip-namespace_association": "ಈ ಚೌಕೊನು ಚರ್ಚೆನ್ ಸೇರಾದ್ ಪರೀಕ್ಷಿಸಲೆ ಅತ್ತ್ಂಡ ವಿಸಯೊಗು ಸರಿಯಾಯಿನ ಪುದರ್ದ ಜತೆಟ್ ಸೇರಾಲೆ",
        "blanknamespace": "(ಮುಖ್ಯ)",
-       "contributions": "{{$1ಸದಸ್ಯೆರ್ನ}}ಕಾಣಿಕೆಲು",
+       "contributions": "{{GENDER:$1|ಸದಸ್ಯೆರ್ನ}} ಕಾಣಿಕೆಲು",
        "contributions-title": "$1 ಗ್ ಸದಸ್ಯೆರ್ನ ಕಾಣಿಕೆ",
        "mycontris": "ಎನ್ನ ಕಾನಿಕೆಲು",
        "anoncontribs": "ಕಾನಿಕೆಲು",
        "whatlinkshere": "ಇಡೆ ವಾ ಪುಟೊ ಕೊಂಡಿ ಕೊರ್ಪುಂಡು",
        "whatlinkshere-title": "\"$1\" ಪುಟೊಗು ಕೊಂಡಿ ಕೊರ್ಪುನ ಪುಟೊಲು",
        "whatlinkshere-page": "ಪುಟೊ:",
-       "linkshere": "'''[[:$1]]'''ಗ್ ಈ ತಿರ್ತ್‍ದ ಪುಟೊಗು ಕೊಂಡಿ ಕೊರ್ಪುಂಡು.",
+       "linkshere": "</strong>[[:$1]]<strong>ಗ್ ಈ ತಿರ್ತ್‍ದ ಪುಟೊಗು ಕೊಂಡಿ ಕೊರ್ಪುಂಡು.",
        "nolinkshere": "'''[[:$1]]''' ಗ್ ವಾ ಪುಟೊಲುಲಾ ಲಿಂಕ್ ಕೊರ್ಪುಜಿ.",
        "isredirect": "ಪಿರ ನಿರ್ದೇಶನೊದ ಪುಟೊ",
        "istemplate": "ಸೇರಾವುನೆ",
        "isimage": "ಫೈಲ್‍ದ ಕೊಂಡಿ",
-       "whatlinkshere-prev": "{{PLURAL:$1|ದುಂಬುದ|ದುಂಬುದ $1}}",
-       "whatlinkshere-next": "{{PLURAL:$1|ಬೊಕ್ಕದ|ಬೊಕ್ಕದ $1}}",
+       "whatlinkshere-prev": "{{PLURAL:$1|previous|ದುಂಬುದ $1}}",
+       "whatlinkshere-next": "{{PLURAL:$1|next|ಬೊಕ್ಕದ $1}}",
        "whatlinkshere-links": "← ಕೊಂಡಿಲು",
        "whatlinkshere-hideredirs": "$1 ಪಿರನಿರ್ದೇಶನೊಲು",
        "whatlinkshere-hidetrans": "$1 ಸೇರಾವುನವು",
        "import-interwiki-submit": "ಆಮದು",
        "import-upload-filename": "ಕಡತದ ಪುದರ್:",
        "import-comment": "ಅಭಿಪ್ರಾಯೊ:",
-       "tooltip-pt-userpage": "{{GENDER:|ಎನ್ನ ಸದಸ್ಯ}} ಪುಟೊ",
-       "tooltip-pt-mytalk": "{{GENDER:|ಎನ್ನ}} ಚರ್ಚೆ ಪುಟೊ",
+       "tooltip-pt-userpage": "{{GENDER:|ಎನ್ನ ಸದಸ್ಯ}}  ಪುಟೊ",
+       "tooltip-pt-mytalk": "{{GENDER:|ಎನ್ನ}} ಚರ್ಚೆತಾ ಪುಟೊ",
        "tooltip-pt-preferences": "{{GENDER:|ಎನ್ನ}} ಇಸ್ಟೊಲು",
        "tooltip-pt-watchlist": "ಈರ್ ಬದಲಾವಣೆಗಾದ್ ನಿಗಾ ದೀತಿನಂಚಿನ ಪುಟೊಲೆನ ಪಟ್ಟಿ",
-       "tooltip-pt-mycontris": "{{GENDER:|ಎನ್ನ}} ಕಾನಿಕೆಲೆ ಪಟ್ಟಿ",
+       "tooltip-pt-mycontris": "{{GENDER:|ಎನ್ನ}} ಕಾನಿಕೆಲೆ ಪಟ್ಟಿ",
        "tooltip-pt-login": "ಈರ್ ಲಾಗಿನ್ ಆವೊಡುಂದು ಕೇನೊಂದುಲ್ಲೊ, ಆಂಡ ಉಂದು ದಾಲ ಕಡ್ಡಾಯ ಅತ್ತ್.",
        "tooltip-pt-logout": "ಲಾಗ್ ಔಟ್",
-       "tooltip-pt-createaccount": "ನಿà²\95à³\81ಲà³\81 à²ªà³\8aಸ à²\96ಾತà³\86 à²¸à³\81ರà³\81ಮಾà²\82ತà³\8dâ\80\8dದà³\8d à²²à²¾à²\97ಿನà³\8d à²\86ಪà³\81ನà³\88ನà³\8d à²ªà³\8dರà³\8bತà³\8dಸಾಹಿಸವà³\8a, à²\86à²\82ಡಲಾ ಉಂದು ಕಡ್ಡಾಯ ಅತ್ತ್.",
+       "tooltip-pt-createaccount": "à²\87ರà³\8d  à²ªà³\8bಸ à²\96ಾತà³\86 à²¸à³\81ರà³\81ಮಾà²\82ತà³\8dâ\80\8dದà³\8d, à²²à²¾à²\97ಿನà³\8d à²\86ಪà³\81ನà³\88ನà³\8d à²¬à³\86ರಿ à²¬à³\8aà²\9fà³\8dà²\9fà³\81ಪà³\8b, à²\86à²\82ಡ ಉಂದು ಕಡ್ಡಾಯ ಅತ್ತ್.",
        "tooltip-ca-talk": "ಮಾಹಿತಿ ಪುಟೊತ ಬಗೆಟ್ ಚರ್ಚೆ",
        "tooltip-ca-edit": "ಈ ಪುಟೊನ್ ಸಂಪೊಲಿಪುಲೆ",
        "tooltip-ca-addsection": "ಪೊಸ ವಿಬಾಗೊನು ಸುರು ಮಲ್ಪುಲೆ",
        "tooltip-t-recentchangeslinked": "ಈ ಪುಟೊಡ್ದ್ ಸಂಪರ್ಕೊ ಉಪ್ಪುನಂಚಿನ ಪುಟೊಡ್ ಇಂಚಿಪೊದ ಬದಲಾವಣೆಲು",
        "tooltip-feed-rss": "ಈ ಪುಟೊಗು ಆರ್.ಎಸ್.ಎಸ್ ಫೀಡ್",
        "tooltip-feed-atom": "ಈ ಪುಟೊಗು ಆಟಮ್ ಫೀಡ್ ಮಲ್ಪುಲೆ",
-       "tooltip-t-contributions": "{{GENDER:$1|à²\88 à²¬à²³à²\95à³\86ದಾರà³\86ರà³\8d}}à²\88 à²¸à²¦à²¸à³\8dಯà³\86ರà³\8dನ ಕಾಣಿಕೆದ ಪಟ್ಟಿನ್ ತೋಜಾವು",
+       "tooltip-t-contributions": "{{GENDER:$1|à²\88 à²¸à²¦à²¸à³\8dಯà³\86ರà³\8dನ}} ಕಾಣಿಕೆದ ಪಟ್ಟಿನ್ ತೋಜಾವು",
        "tooltip-t-emailuser": "ಈ ಸದಸ್ಯೆರೆಗ್ ಇ-ಮೇಲ್ ಕಡಪುಡ್ಲೆ",
        "tooltip-t-upload": "ಫೈಲನ್ ಅಪ್ಲೋಡ್ ಮಲ್ಪುಲೆ",
        "tooltip-t-specialpages": "ಪೂರ  ವಿಸೇಸೊ ಪುಟೊಲೆನ ಪಟ್ಟಿ",
        "svg-long-desc": "ಎಸ್.ವಿ.ಜಿ ಫೈಲ್, ಸುಮಾರಾದ್ $1 × $2 ಚಿತ್ರೊಬಿಂದು, ಫೈಲ್‍ದ ಗಾತ್ರ: $3",
        "show-big-image": "ಮೂಲೊ ಫೈಲ್",
        "show-big-image-preview": "ಪಿರವುದ ಪುಟೊದ ಗಾತ್ರೊ: $1.",
-       "show-big-image-other": "ಬà³\87ತà³\86{{PLURAL:$2|resolution|ನಿರà³\8dನಯà³\8aಲà³\81}}: $1.",
-       "show-big-image-size": "$1 × $2 ಚಿತ್ರೊಬಿಂದುಲು",
+       "show-big-image-other": "ಬà³\87ತà³\86{{PLURAL:$2|resolution|ಪà²\9fà³\8aತà³\8dತ à²\97ಾತà³\8dರà³\8a }}: $1.",
+       "show-big-image-size": "$1 × $2 ಚಿತ್ರೊ ಬಿಂದುಲು",
        "newimages-legend": "ಅರಿಪೆ",
        "ilsubmit": "ನಾಡ್‍ಲೆ",
        "bad_image_list": "ವ್ಯವಸ್ಥೆದ ಆಕಾರ ಈ ರೀತಿ ಉಂಡು:\n\nಪಟ್ಟಿಡುಪ್ಪುನಂಚಿನ ದಾಖಲೆಲೆನ್ (* ರ್ದ್ ಶುರು ಆಪುನ ಸಾಲ್’ಲು) ಮಾತ್ರ ಪರಿಗಣನೆಗ್ ದೆತೊನೆರಾಪುಂಡು.\nಪ್ರತಿ ಸಾಲ್’ದ ಶುರುತ ಲಿಂಕ್ ಒಂಜಿ ದೋಷ ಉಪ್ಪುನಂಚಿನ ಫೈಲ್’ಗ್ ಲಿಂಕಾದುಪ್ಪೊಡು.\nಅವ್ವೇ ಸಾಲ್’ದ ಶುರುತ ಪೂರಾ ಲಿಂಕ್’ಲೆನ್ ಪರಿಗನೆರ್ದ್ ದೆಪ್ಪೆರಾಪುಂಡು, ಪಂಡ ಓವು ಪುಟೊಲೆಡ್ ಫೈಲ್’ದ ಬಗ್ಗೆ ಬರ್ಪುಂಡೋ ಔಲು.",
        "exif-imagewidth": "ಅಗೆಲ",
        "exif-imagelength": "ಎತ್ತರೊ",
        "exif-orientation": "ದಿಕ್ಕ್ ದಿಸೆ",
-       "exif-xresolution": "à²\85ಡà³\8dಡà²\97ಲà³\8aದ à²°à³\86à²\9c಼ಲ್ಯೂಶನ್",
-       "exif-yresolution": "à²\89ದà³\8dದà³\8aದ à²°à³\86à²\9c಼ಲ್ಯೂಶನ್",
+       "exif-xresolution": "à²\85ಡà³\8dಡà²\97ಲà³\8aದ à²°à³\87ಸಲ್ಯೂಶನ್",
+       "exif-yresolution": "à²\89ದà³\8dದà³\8aದ à²°à³\87ಸಲ್ಯೂಶನ್",
        "exif-datetime": "ಫೈಲ್‍ನ್ ಬದಲಾವಣೆ ಮಲ್ತ್‌ನ ದಿನೊ ಬೊಕ್ಕ ಪೊರ್ತು",
        "exif-make": "ಕ್ಯಾಮರೊದ ತಯಾರೆಕೆರ್",
        "exif-model": "ಕ್ಯಾಮರೊದ ಮಾದರಿ",
        "exif-subjectdistancerange-0": "ಗೊತ್ತಿಜ್ಜಾಂದಿನ",
        "exif-iimcategory-hth": "ಆರೋಗ್ಯ",
        "namespacesall": "ಮಾತ",
-       "monthsall": "ಮಾತ",
+       "monthsall": "ಮಾà²\82ತಾ",
        "confirm_purge_button": "ಸರಿ",
        "confirm-watch-button": "ಸರಿ",
        "confirm-unwatch-button": "ಸರಿ",
        "tags-create-submit": "ಸೃಷ್ಟಿಸಾಲೆ",
        "tags-delete-reason": "ಕಾರಣ:",
        "tags-deactivate-reason": "ಕಾರಣ:",
-       "logentry-delete-delete": "$1{{GENDER:$2|ಮಾಜಾದ್‍ಂಡ್}}ಪುಟೊ $3",
+       "logentry-delete-delete": "$1{{GENDER:$2|ಮಾಜಾತುಂಡ್}}ಪುಟೊ $3",
+       "logentry-delete-restore": "$1 {{GENDER:$2|restored}} ಪುಟೊ $3 ($4)",
+       "restore-count-files": "{{PLURAL:$1|1 file|$1 ವಿಸಯೊಲು}}",
        "logentry-move-move": "$1 {{GENDER:$2|ಜಾರಲೆ}} ಪುಟೊ $3 ಡ್ದ್ $4",
-       "logentry-newusers-create": "ಬಳಕೆದಾರೆರೆ ಕಾತೆ $1 ನ್ನು {{GENDER:$2|ಸ್ರಿಸ್ಟಿ ಮಲ್ತಾಂಡ್}}",
+       "logentry-newusers-create": "ಬಳಕೆದಾರೆರೆ ಕಾತೆ $1 ನ್ {{GENDER:$2|ಸ್ರಿಸ್ಟಿ ಮಲ್ತಾಂಡ್}}",
        "logentry-upload-upload": "$1 {{GENDER:$2|ಅಪ್ಲೋಡ್ ಮಲ್ತ್‌ದೆರ್}} $3",
        "searchsuggest-search": "{{SITENAME}}ನ್ ನಾಡ್‍ಲೆ",
        "pagelang-reason": "ಕಾರಣೊ",
index fb73ae7..a2114de 100644 (file)
@@ -4,7 +4,8 @@
                        "MF-Warburg",
                        "Nemo bis",
                        "Reedy",
-                       "아라"
+                       "아라",
+                       "Matma Rex"
                ]
        },
        "tog-underline": "Subliña ligasaun sira:",
        "printableversion": "Versaun ba impresaun",
        "permalink": "Ligasaun mahelak",
        "print": "Imprime",
+       "view": "Lee",
        "edit": "Edita",
        "create": "Kria",
        "editthispage": "Edita pájina ne'e",
        "aboutsite": "Kona-ba {{SITENAME}}",
        "aboutpage": "Project:Kona-ba",
        "copyright": "Testu pájina nian iha $1 okos.",
-       "copyrightpage": "{{ns:project}}:Direitu_autór_nian",
+       "copyrightpage": "{{ns:project}}:Direitu autór nian",
        "currentevents": "Mamosuk atuál sira",
        "currentevents-url": "Project:Mamosuk atuál sira",
        "disclaimers": "Avisu legál",
        "yourname": "Naran uza-na'in:",
        "login": "Log in",
        "nav-login-createaccount": "Log in / kriar konta ida",
-       "userlogin": "Log in / kriar konta ida",
        "logout": "Husik",
        "userlogout": "Husik",
-       "nologin": "La iha konta ida? '''$1'''.",
-       "nologinlink": "Registrar",
        "createaccount": "Registrar uza-na'in",
-       "gotaccount": "Ó iha konta ona? '''$1'''.",
-       "gotaccountlink": "Log in",
        "userexists": "Naran uza-na'in ne'e ona iha wiki.\nFavór ida lori naran seluk.",
        "nosuchuser": "Konta uza-na'in (naran \"$1\") la iha.\nUser names are case sensitive.\nCheck your spelling, ka [[Special:CreateAccount|kria konta foun]].",
        "nouserspecified": "Ó tenke espesífiku naran uza-na'in ida.",
        "revdelete-radio-set": "Sin",
        "revdelete-radio-unset": "Lae",
        "revdelete-edit-reasonlist": "Edita lista motivu nian",
+       "history-title": "$1: Istória revisaun nian",
        "lineno": "Liña $1:",
        "searchresults": "Rezultadu sira",
        "searchresults-title": "Rezultadu sira ba buka \"$1\"",
        "undeletelink": "lee/restaurar",
        "undeleteviewlink": "haree",
        "undeletecomment": "Razaun:",
-       "undeletedrevisions": "restaurar {{PLURAL:$1|versaun|versaun}} $1",
        "undelete-search-submit": "Buka",
        "undelete-show-file-submit": "Sin",
        "namespace": "Espasu pájina nian:",
index 30fe744..fd8bd87 100644 (file)
@@ -18,7 +18,8 @@
                        "Macofe",
                        "Matma Rex",
                        "Stranger195",
-                       "Emem.calist"
+                       "Emem.calist",
+                       "Asmen"
                ]
        },
        "tog-underline": "Pagsasalungguhit ng link:",
        "externaldberror": "Maaaring may kamalian sa pagpapatotoo ng database o kaya hindi ka pinahintulutang isapanahon ng iyong panlabas na account.",
        "login": "Lumagda",
        "nav-login-createaccount": "Lumagda / lumikha ng account",
-       "userlogin": "Lumagda / lumikha ng account",
-       "userloginnocreate": "Lumagda",
        "logout": "Umalis sa pagkaka-login",
        "userlogout": "Umalis sa pagkaka-login",
        "notloggedin": "Hindi naka-login",
        "userlogin-noaccount": "Wala ka pa bang account?",
        "userlogin-joinproject": "Sumali sa {{SITENAME}}",
-       "nologin": "Wala ka pang account? $1.",
-       "nologinlink": "Lumikha ng account",
        "createaccount": "Lumikha ng account",
-       "gotaccount": "May account ka na ba? $1.",
-       "gotaccountlink": "Lumagda",
-       "userlogin-resetlink": "Nakalimutan mo ang iyong mga detalyeng pang-login?",
        "userlogin-resetpassword-link": "Nakalimutan ba ang iyong password?",
        "userlogin-helplink2": "Tulong sa pag-login",
        "userlogin-loggedin": "Naka-login ka na bilang {{GENDER:$1|$1}}. Gamitin ang form sa ibaba upang maka-login bilang ibang tagagamit o user.",
        "createacct-another-email-ph": "Ipasok ang email address",
        "createaccountmail": "Gumamit ng pansamantalang random na password at ipadala ito sa email na nakasaad sa ibaba",
        "createacct-realname": "Tunay na pangalan (maaaring wala)",
-       "createaccountreason": "Dahilan:",
        "createacct-reason": "Dahilan",
        "createacct-reason-ph": "Bakit ka gagawa ng isa pang account?",
        "createacct-submit": "Likhain ang iyong account",
        "post-expand-template-argument-warning": "Babala: Naglalamang ang pahinang ito ng kahit isang pagaalitan ng padron na napakalaki ng sukat ng paglawak.  Tinanggal ang mga alitang ito.",
        "post-expand-template-argument-category": "Mga pahinang naglalaman ng mga tinanggal na mga alitan ng padron",
        "parser-template-loop-warning": "Nadiskubreng silo ng suleras: [[$1]]",
+       "template-loop-category-desc": "Ang pahina ay naglalaman ng kodigong-makapanguulit, halimbawa. Isang kodigo na magpapahiwatig sa sarili ng paguulit.",
        "parser-template-recursion-depth-warning": "Lumabis na sa nakatakdang lalim ng rekursyon (pormula) ng suleras ($1)",
        "language-converter-depth-warning": "Lumampas sa ($1) ang hangganan ng lalim ng pampalit ng wika",
        "node-count-exceeded-category": "Mga pahina kung saan nalampasan ang bilang ng buko",
        "undeleteviewlink": "tingnan",
        "undeleteinvert": "Baligtarin ang pagpili/pilian",
        "undeletecomment": "Dahilan:",
-       "undeletedrevisions": "{{PLURAL:$1|1 pagbabago|$1 mga pagbabagong}} naibalik na",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 pagbabago|$1 mga pagbabago}} at {{PLURAL:$2|1 talaksang|$2 mga talaksang}} naibalik na",
-       "undeletedfiles": "{{PLURAL:$1|1 talaksang|$1 mga talaksang}} naibalik na",
        "cannotundelete": "Hindi matagumpay ang pagpapabalik mula sa pagkakabura; maaaring may isang nakauna na sa pagpapabalik ng pahina mula sa pagkakabura.",
        "undeletedpage": "'''Naibalik na ang $1'''\n\nTingnan ang [[Special:Log/delete|talaan ng pagbubura]] para sa isang talaan ng mga kamakailan lamang na mga pagbubura at mga pagbabalik mula sa pagkakabura.",
        "undelete-header": "Tingnan ang [[Special:Log/delete|talaan ng pagbubura]] para sa kamakailan lamang na  binura/naburang mga pahina.",
        "hebrew-calendar-m6": "Adar",
        "hebrew-calendar-m6a": "Adar I",
        "hebrew-calendar-m6b": "Adar II",
-       "hebrew-calendar-m7": "Nisan",
+       "hebrew-calendar-m7": "Nisane",
        "hebrew-calendar-m8": "Iyar",
        "hebrew-calendar-m9": "Sivan",
        "hebrew-calendar-m10": "Tamuz",
        "hebrew-calendar-m6-gen": "Adar",
        "hebrew-calendar-m6a-gen": "Adar I",
        "hebrew-calendar-m6b-gen": "Adar II",
-       "hebrew-calendar-m7-gen": "Nisan",
+       "hebrew-calendar-m7-gen": "Nisane",
        "hebrew-calendar-m8-gen": "Iyar",
        "hebrew-calendar-m9-gen": "Sivan",
        "hebrew-calendar-m10-gen": "Tamuz",
        "logentry-newusers-autocreate": "Automatikong {{GENDER:$2|inilikha}} ang account ng tagagamit na $1",
        "logentry-upload-upload": "{{GENDER:$2|Ikinarga}} ni $1 ang $3",
        "rightsnone": "(wala)",
-       "revdelete-summary": "buod ng pagbabago",
        "feedback-adding": "Idinaragdag ang pakaing-tugon sa pahina...",
        "feedback-back": "Magbalik",
        "feedback-bugcheck": "Mahusay! Suriin lang na hindi pa ito isa sa [$1 nalalamang mga depekto].",
index 3af1872..39e8627 100644 (file)
                        "Superyetkin",
                        "Alikaan",
                        "By erdo can",
-                       "1917 Ekim Devrimi"
+                       "1917 Ekim Devrimi",
+                       "Asmen"
                ]
        },
        "tog-underline": "Bağlantıların altını çizme:",
        "tog-hideminor": "Son değişiklikler sayfasında küçük düzenlemeleri gizle",
-       "tog-hidepatrolled": "Son değişikliklerdeki devriyenin gördüğü düzenlemeleri gizle",
+       "tog-hidepatrolled": "Son değişiklikler sayfasında devriyenin gördüğü düzenlemeleri gizle",
        "tog-newpageshidepatrolled": "Yeni sayfalar listesinde devriyenin gördüğü sayfaları gizle",
        "tog-hidecategorization": "Sayfa kategorilendirmesini gizle",
        "tog-extendwatchlist": "İzleme listesini sadece en son değil, tüm değişiklikleri gösterecek şekilde genişlet",
        "tog-watchdeletion": "Sildiğim sayfaları ve dosyaları izleme listeme ekle",
        "tog-watchuploads": "Yüklediğim yeni dosyaları izleme listeme ekle",
        "tog-watchrollback": "Eski hâline getirdiğim sayfaları izleme listeme ekle",
-       "tog-minordefault": "Varsayılan olarak, bütün düzenlemeleri küçük düzenleme olarak işaretle",
-       "tog-previewontop": "Ön izlemeyi, düzenleme kutusunun öncesinde göster",
-       "tog-previewonfirst": "İlk düzenlemede ön izlemeyi göster",
+       "tog-minordefault": "Tüm düzenlemeleri varsayılan olarak küçük düzenleme olarak işaretle",
+       "tog-previewontop": "Düzenleme kutusu öncesinde önizleme göster",
+       "tog-previewonfirst": "İlk düzenlemede önizleme göster",
        "tog-enotifwatchlistpages": "İzleme listemdeki bir sayfa veya dosya değiştirilirse bana e-posta gönder",
        "tog-enotifusertalkpages": "Kullanıcı mesaj sayfamda değişiklik olduğunda bana e-posta gönder",
-       "tog-enotifminoredits": "Sayfalardaki ve dosyalardaki küçük değişikliklerde de bana e-posta gönder",
-       "tog-enotifrevealaddr": "Bildirim postalarında benim eposta adresimi açıkça göster",
+       "tog-enotifminoredits": "Sayfalardaki ve dosyalardaki küçük düzenlemelerde de bana e-posta gönder",
+       "tog-enotifrevealaddr": "Bildirim e-postalarında e-posta adresimi açıkça göster",
        "tog-shownumberswatching": "İzleyen kullanıcı sayısını göster",
        "tog-oldsig": "Mevcut imzanız:",
-       "tog-fancysig": "İmzaya vikimetin muamelesi yap (otomatik bir bağlantı olmadan)",
-       "tog-uselivepreview": "Canlı ön izlemeyi kullan",
-       "tog-forceeditsummary": "Özeti boş bıraktığımda beni uyar",
-       "tog-watchlisthideown": "İzleme listemde benim değişkliklerimi gizle",
-       "tog-watchlisthidebots": "İzleme listemde bot değişikliklerini gizle",
-       "tog-watchlisthideminor": "İzleme listemde küçük değişiklikleri gizle",
-       "tog-watchlisthideliu": "İzleme listemde, kayıtlı kullanıcılar tarafından yapılan değişiklikleri gizle",
-       "tog-watchlistreloadautomatically": "Filtre değiştiğinde izleme listesini otomatik yenile (JavaScript gerekir)",
-       "tog-watchlisthideanons": "İzleme listemde, anonim kullanıcılar tarafından yapılan değişiklikleri gizle",
-       "tog-watchlisthidepatrolled": "İzleme listesinde, devriye görmüş değişiklikleri gizle",
+       "tog-fancysig": "İmzayı viki metni olarak (otomatik bağlantı olmadan) işle",
+       "tog-uselivepreview": "Canlı önizleme kullan",
+       "tog-forceeditsummary": "Boş bir düzenleme özeti girdiğimde bana sor",
+       "tog-watchlisthideown": "Düzenlemelerimi izleme listesinde gizle",
+       "tog-watchlisthidebots": "Bot düzenlemelerini izleme listesinde gizle",
+       "tog-watchlisthideminor": "Küçük düzenlemeleri izleme listesinde gizle",
+       "tog-watchlisthideliu": "Oturum açmış kullanıcıların düzenlemelerini izleme listesinde gizle",
+       "tog-watchlistreloadautomatically": "Her süzgeç değişikliği olduğunda izleme listesini otomatik olarak yeniden yükle (JavaScript gerekir)",
+       "tog-watchlisthideanons": "Anonim kullanıcıların düzenlemelerini izleme listesinde gizle",
+       "tog-watchlisthidepatrolled": "Devriyenin gördüğü düzenlemeleri izleme listesinde gizle",
        "tog-watchlisthidecategorization": "Sayfa kategorilendirmesini gizle",
-       "tog-ccmeonemails": "Diğer kullanıcılara gönderdiğim e-postaların bir kopyasını bana da gönder",
-       "tog-diffonly": "Sayfa içeriğini, sürüm farklarının altında gösterme",
+       "tog-ccmeonemails": "Diğer kullanıcılara gönderdiğim e-postaların kopyalarını bana gönder",
+       "tog-diffonly": "Farkların altında sayfa içeriğini gösterme",
        "tog-showhiddencats": "Gizli kategorileri göster",
-       "tog-norollbackdiff": "Geri döndürme uygulandıktan sonra farkları gösterme",
-       "tog-useeditwarning": "Yaptığım değişiklikleri kaydetmeden sayfayı kapatırken beni uyar",
-       "tog-prefershttps": "Oturum açarken her zaman güvenli bağlantı kullanın",
-       "underline-always": "Daima",
-       "underline-never": "Asla",
-       "underline-default": "Tema ya da tarayıcı varsayılanı",
-       "editfont-style": "Düzenleme alanının yazı tipi:",
+       "tog-norollbackdiff": "Eski hâline getirdikten sonra farkı gösterme",
+       "tog-useeditwarning": "Bir düzenleme sayfasından değişiklikleri kaydetmeden ayrılırken beni uyar",
+       "tog-prefershttps": "Oturum açıkken her zaman güvenli bir bağlantı kullan",
+       "underline-always": "Her zaman",
+       "underline-never": "Hiçbir zaman",
+       "underline-default": "Görünüm ya da tarayıcı varsayılanı",
+       "editfont-style": "Düzenleme alanının yazı tipi biçemi:",
        "editfont-default": "Tarayıcı varsayılanı",
-       "editfont-monospace": "Sabit aralıklı yazı tipi",
-       "editfont-sansserif": "Çıkıntısız (Sans-serif) yazı tipi",
-       "editfont-serif": "Çıkıntılı (serif) yazı tipi",
+       "editfont-monospace": "Tek aralıklı yazı tipi",
+       "editfont-sansserif": "Sans-serif yazı tipi",
+       "editfont-serif": "Serif yazı tipi",
        "sunday": "Pazar",
        "monday": "Pazartesi",
        "tuesday": "Salı",
        "december-date": "$1 Aralık",
        "period-am": "ÖÖ",
        "period-pm": "ÖS",
-       "pagecategories": "{{PLURAL:$1|Kategori|Kategoriler}}",
+       "pagecategories": "$1 kategori",
        "category_header": "\"$1\" kategorisindeki sayfalar",
        "subcategories": "Alt kategoriler",
-       "category-media-header": "\"$1\" kategorisindeki dosyalar",
-       "category-empty": "<em>Bu kategoride henüz herhangi bir sayfa ya da dosya bulunmamaktadır.</em>",
-       "hidden-categories": "{{PLURAL:$1|Gizli kategori|Gizli kategoriler}}",
+       "category-media-header": "\"$1\" kategorisindeki ortamlar",
+       "category-empty": "<em>Şu anda bu kategoride herhangi bir sayfa ya da Ortam bulunmuyor.</em>",
+       "hidden-categories": "$1 gizli kategori",
        "hidden-category-category": "Gizli kategoriler",
-       "category-subcat-count": "{{PLURAL:$2|Bu kategori sadece aşağıdaki alt kategoriyi içermektedir.|Bu kategoride aşağıdaki {{PLURAL:$1|alt kategori|$1 alt kategori}} dahil $2 alt kategori vardır.}}",
-       "category-subcat-count-limited": "Bu kategori aşağıdaki {{PLURAL:$1|alt kategoriye|$1 alt kategoriye}} sahiptir.",
+       "category-subcat-count": "{{PLURAL:$2|Bu kategori sadece aşağıdaki alt kategoriyi içermektedir.|Bu kategoride aşağıdaki $1 alt kategori dâhil toplam $2 alt kategori vardır.}}",
+       "category-subcat-count-limited": "Bu kategori aşağıdaki $1 alt kategoriye sahiptir.",
        "category-article-count": "{{PLURAL:$2|Bu kategori sadece aşağıdaki sayfayı içermektedir.|Toplam $2 taneden, aşağıdaki {{PLURAL:$1|sayfa|$1 sayfa}} bu kategoridedir.}}",
        "category-article-count-limited": "Bu kategoride {{PLURAL:$1|sayfa|$1 sayfa}} bulunmaktadır.",
        "category-file-count": "{{PLURAL:$2|Bu kategori sadece aşağıdaki dosyayı içerir.|Toplam $2 taneden, aşağıdaki {{PLURAL:$1|dosya|$1 dosya}} bu kategoridedir.}}",
        "category-file-count-limited": "Aşağıdaki {{PLURAL:$1|dosya|$1 dosya}} bu kategoridedir.",
-       "listingcontinuesabbrev": "(devam)",
+       "listingcontinuesabbrev": "devam",
        "index-category": "Dizinlenmiş sayfalar",
        "noindex-category": "Dizinlenmemiş sayfalar",
        "broken-file-category": "Bozuk dosya bağlantıları içeren sayfalar",
        "categoryviewer-pagedlinks": "($1) ($2)",
        "about": "Hakkında",
        "article": "İçerik sayfası",
-       "newwindow": "(yeni bir pencerede açılır)",
+       "newwindow": "(yeni pencerede açılır)",
        "cancel": "İptal",
        "moredotdotdot": "Dahası...",
        "morenotlisted": "Bu liste eksik olabilir.",
        "navigation": "Gezinti",
        "and": "&#32;ve",
        "qbfind": "Bul",
-       "qbbrowse": "Tara",
-       "qbedit": "Değiştir",
+       "qbbrowse": "Gözat",
+       "qbedit": "Düzenle",
        "qbpageoptions": "Bu sayfa",
        "qbmyoptions": "Sayfalarım",
        "faq": "SSS",
        "edit-local": "Yerel açıklamayı düzenle",
        "create": "Oluştur",
        "create-local": "Yerel açıklama ekle",
-       "editthispage": "Bu sayfayı değiştir",
+       "editthispage": "Bu sayfayı düzenle",
        "create-this-page": "Bu sayfayı oluştur",
        "delete": "Sil",
        "deletethispage": "Bu sayfayı sil",
        "templatepage": "Şablon sayfasını görüntüle",
        "viewhelppage": "Yardım sayfasına görüntüle",
        "categorypage": "Kategori sayfasını görüntüle",
-       "viewtalkpage": "Tartışma sayfasını görüntüle",
+       "viewtalkpage": "Tartışmayı gör",
        "otherlanguages": "Diğer dillerde",
        "redirectedfrom": "($1 sayfasından yönlendirildi)",
        "redirectpagesub": "Yönlendirme sayfası",
        "currentevents-url": "Project:Güncel olaylar",
        "disclaimers": "Sorumluluk reddi",
        "disclaimerpage": "Project:Genel sorumluluk reddi",
-       "edithelp": "Nasıl değiştirilir?",
+       "edithelp": "Düzenleme yardımı",
        "helppage-top-gethelp": "Yardım",
        "mainpage": "Ana Sayfa",
        "mainpage-description": "Ana sayfa",
-       "policy-url": "Project:İlkeler",
+       "policy-url": "Project:Politika",
        "portal": "Topluluk portali",
        "portal-url": "Project:Topluluk portali",
        "privacy": "Gizlilik politikası",
        "privacypage": "Project:Gizlilik Politikası",
        "badaccess": "İzin hatası",
        "badaccess-group0": "Bu işlemi yapma yetkiniz yok.",
-       "badaccess-groups": "Yapmak istediğiniz işlem, sadece {{PLURAL:$2|şu gruptaki|şu gruplardaki}} kullanıcılar tarafından yapılabilir: $1",
+       "badaccess-groups": "İstediğiniz işlem, $1 {{PLURAL:$2|grubundaki|gruplarındaki}} kullanıcılarla sınırlıdır.",
        "versionrequired": "MediaWiki'nin $1 sürümü gerekiyor",
        "versionrequiredtext": "Bu sayfayı kullanmak için MediaWiki'nin $1 sürümü gerekmektedir. [[Special:Version|Sürüm sayfasına]] bakınız.",
        "ok": "Tamam",
        "newmessageslinkplural": "{{PLURAL:$1|yeni mesajınız|yeni mesajlarınız}}",
        "newmessagesdifflinkplural": "son {{PLURAL:$1|değişiklik|değişiklik}}",
        "youhavenewmessagesmulti": "$1'de yeni mesajınız var",
-       "editsection": "değiştir",
-       "editold": "değiştir",
+       "editsection": "düzenle",
+       "editold": "düzenle",
        "viewsourceold": "kaynağı gör",
-       "editlink": "değiştir",
+       "editlink": "düzenle",
        "viewsourcelink": "kaynağı gör",
        "editsectionhint": "Değiştirilen bölüm: $1",
        "toc": "İçindekiler",
        "unexpected": "beklenmeyen değer: \"$1\"=\"$2\".",
        "formerror": "Hata: Form gönderilemiyor.",
        "badarticleerror": "Bu işlem bu sayfada gerçekleştirilemez.",
-       "cannotdelete": "\"$1\" sayfa ya da dosyası silinemedi.\nBaşka bir kullanıcı tarafından zaten silinmiş olabilir.",
+       "cannotdelete": "\"$1\" adlı sayfa veya dosya silinemedi.\nBaşka bir kullanıcı tarafından daha önce silinmiş olabilir.",
        "cannotdelete-title": "\"$1\" sayfası silinemiyor",
        "delete-hook-aborted": "Silme işlemi uzantı kancası tarafından durduruldu. \nBir açıklama sunulmadı.",
        "no-null-revision": "\"$1\" sayfası için yeni boş bir sürüm oluşturulamadı",
        "createacct-benefit-body1": "{{PLURAL:$1|düzenleme|düzenleme}}",
        "createacct-benefit-body2": "{{PLURAL:$1|madde|madde}}",
        "createacct-benefit-body3": "yakın zamanda {{PLURAL:$1|katkı yapan|katkı yapan}} kişi",
-       "badretype": "Girdiğiniz şifreler birbirleriyle uyuşmuyor.",
+       "badretype": "Girdiğiniz parolalar eşleşmiyor.",
        "usernameinprogress": "Bu kullanıcı adı için bir hesap oluşturma zaten sürüyor. Lütfen bekleyin.",
        "userexists": "Girdiğiniz kullanıcı adı zaten kullanımda.\nLütfen farklı bir kullanıcı adı seçiniz.",
        "loginerror": "Oturum açma hatası.",
        "wrongpassword": "Parolayı yanlış girdiniz. Lütfen tekrar deneyiniz.",
        "wrongpasswordempty": "Boş parola girdiniz. Lütfen tekrar deneyiniz.",
        "passwordtooshort": "Parolalar en az {{PLURAL:$1|1 karakter|$1 karakter}} uzunluğunda olmalı.",
-       "passwordtoolong": "Parolalar en az {{PLURAL:$1|1 karakter|$1 karakter}} uzunluğunda olmalı.",
+       "passwordtoolong": "Parolalar $1 karakterden uzun olamaz.",
        "passwordtoopopular": "Sıklıkla seçilen parolalar kullanılamaz. Lütfen daha özgün bir parola belirleyin.",
-       "password-name-match": "Şifreniz kullanıcı adınızdan farklı olmalıdır.",
-       "password-login-forbidden": "Bu kullanıcı adı ve şifre kullanımı yasaklanmıştır",
+       "password-name-match": "Parolanız kullanıcı adınızdan farklı olmalıdır.",
+       "password-login-forbidden": "Bu kullanıcı adı ve parolanın kullanımı yasaklanmıştır.",
        "mailmypassword": "Parolayı sıfırla",
-       "passwordremindertitle": "{{SITENAME}} için yeni geçici şifre",
+       "passwordremindertitle": "{{SITENAME}} için yeni geçici parola",
        "passwordremindertext": "Birisi (muhtemelen siz, $1 IP adresinden) {{SITENAME}} ($4) için yeni bir parola gönderilmesi istedi. \"$2\" kullanıcısına geçici olarak \"$3\" parolası oluşturuldu. Eğer bu sizin isteğiniz ise, oturum açıp yeni bir parola oluşturmanız gerekmektedir. Geçici parolanızın süresi {{PLURAL:$5|1 gün|$5 gün}} içinde dolacaktır.\n\nParola değişimini siz istemediyseniz veya parolanızı hatırladıysanız ve artık parolanızı değiştirmek istemiyorsanız; bu mesajı önemsemeyerek eski parolanızı kullanmaya devam edebilirsiniz.",
        "noemail": "\"$1\" adlı kullanıcıya kayıtlı bir e-posta adresi yok.",
        "noemailcreate": "Geçerli bir e-posta adresi sağlamalısınız",
        "passwordsent": "\"$1\" adına kayıtlı e-posta adresine yeni bir parola gönderildi. Oturumu, lütfen, iletiyi aldıktan sonra açın.",
-       "blocked-mailpassword": "IP adresiniz düzenleme yapmaya engellenmiştir. Kötüye kullanımın önüne geçmek için söz konusu IP adresinden şifre kurtarmaya izin verilmemektedir.",
+       "blocked-mailpassword": "IP adresinizin düzenleme yapması engellenmiştir. Kötüye kullanımı önlemek için, bu IP adresinin parola kurtarmadan yararlanmasına izin verilmemektedir.",
        "eauthentsent": "Belirtilen e-posta adresine onay kodu içeren bir e-posta gönderildi.\nHesaba başka bir e-posta gönderilmeden önce, e-postadaki yönergeleri uygulayıp, hesabın gerçekten size ait olduğunu onaylamanız gerekir.",
        "throttled-mailpassword": "Bir parola sıfırlama e-postası son {{PLURAL:$1|bir saat|$1 saat}} içinde zaten gönderildi. Hizmeti kötüye kullanmayı önlemek için, her {{PLURAL:$1|bir saatte|$1 saatte}} sadece bir parola sıfırlama e-postası gönderilecektir.",
        "mailerror": "E-posta gönderim hatası: $1",
-       "acct_creation_throttle_hit": "Sizin IP adresinizi kullanarak bu vikiyi ziyaret edenler $2 içinde {{PLURAL:$1|1 hesap|$1 hesap}} oluşturdu, bu sayı bu zaman aralığında izin verilen azami sayıdır.\nSonuç olarak, bu IP adresini kullanan ziyaretçiler şu anda daha fazla hesap açamazlar.",
+       "acct_creation_throttle_hit": "Sizin IP adresinizi kullanarak bu vikiyi ziyaret edenler son $2 içinde $1 hesap oluşturdu ve bu sayı bu zaman aralığında izin verilen azami sayıdır.\nSonuç olarak, bu IP adresini kullanan ziyaretçiler şu anda daha fazla hesap açamazlar.",
        "emailauthenticated": "E-posta adresiniz $2 $3 tarihinde onaylandı.",
        "emailnotauthenticated": "E-posta adresiniz henüz onaylanmadı.\nAşağıdaki işlevlerin hiçbiri için e-posta gönderilmeyecektir.",
        "noemailprefs": "Bu özelliklerin çalışması için bir e-posta adresi belirtiniz.",
        "emaildisabled": "Bu siteden e-posta gönderemezsiniz.",
        "accountcreated": "Hesap açıldı",
        "accountcreatedtext": "[[{{ns:User}}:$1|$1]]([[{{ns:User talk}}:$1|msj]])   için kullanıcı hesabı oluşturuldu.",
-       "createaccount-title": "{{SITENAME}} için yeni kullanıcı hesabı oluşturulması",
+       "createaccount-title": "{{SITENAME}} için hesap oluşturma",
        "createaccount-text": "Birisi {{SITENAME}} sitesinde ($4) sizin e-posta adresinizi kullarak, şifresi \"$3\" olan, \"$2\" isimli bir hesap oluşturdu.\n\nSiteye giriş yapmalı ve parolanızı değiştirmelisiniz.\n\nEğer kullanıcı hesabını yanlışlıkla oluşturmuş iseniz, bu mesajı yoksayabilirsiniz.",
-       "login-throttled": "Çok fazla yeni oturum açma girişiminde bulundunuz.\nDevam etmeden önce $1 bekleyin.",
+       "login-throttled": "Yakın zamanda çok fazla oturum açma girişiminde bulundunuz.\nLütfen yeniden denemeden önce $1 süreyle bekleyin.",
        "login-abort-generic": "Giriş başarısız - Durduruldu",
        "login-migrated-generic": "Hesabınız aktarılmış ve kullanıcı adınız artık bu vikide yok.",
        "loginlanguagelabel": "Dil: $1",
        "createacct-another-realname-tip": "Gerçek adınız isteğe bağlıdır.\nEğer gerçek adınızı belirtirseniz, çalışmalarınıza atıfta bulunulması için de kullanılacaktır.",
        "pt-login": "Giriş yap",
        "pt-login-button": "Oturum aç",
-       "pt-login-continue-button": "Oturum açmaya devam edin",
+       "pt-login-continue-button": "Oturum açmaya devam et",
        "pt-createaccount": "Hesap oluştur",
        "pt-userlogout": "Oturumu kapat",
-       "php-mail-error-unknown": "PHP's mail() fonksiyonunda bilinmeyen hata",
+       "php-mail-error-unknown": "PHP'nin mail() işlevinde bilinmeyen hata.",
        "user-mail-no-addy": "Bir e-posta adresi olmadan e-posta göndermeye çalıştı.",
        "user-mail-no-body": "Boş veya geçerli olmayan bir şekilde e-posta gönderilmeye çalışıldı.",
        "changepassword": "Parolayı değiştir",
        "resetpass_announce": "Girişinizi tamamlayabilmeniz için, yeni bir parola oluşturmanız gereklidir.",
        "resetpass_text": "<!-- Metini buraya ekleyin -->",
-       "resetpass_header": "Hesap şifresini değiştir",
+       "resetpass_header": "Hesap parolasını değiştir",
        "oldpassword": "Eski parola",
        "newpassword": "Yeni parola",
        "retypenew": "Yeni parolayı tekrar girin",
        "resetpass_submit": "Şifreyi ayarlayın ve oturum açın",
        "changepassword-success": "Parolanız değiştirildi!",
        "changepassword-throttled": "Çok fazla yeni oturum açma girişiminde bulundunuz.\nLütfen tekrar denemeden önce $1 bekleyin.",
-       "botpasswords": "Bot şifreleri",
+       "botpasswords": "Bot parolaları",
        "botpasswords-summary": "<em>Bot şifreleri,</em> hesabın ana giriş kimlik bilgilerini kullanmadan API aracılığıyla bir kullanıcı hesabına erişime izin verir. Bir bot şifresi ile giriş yaptığınızda mevcut kullanıcı hakları kısıtlanabilir.\n\nBunu neden yapmak isteyebileceğinizi bilmiyorsanız, yapmayınız. Hiç kimse sizden bunlardan birini üretip onlara vermenizi istememelidir.",
-       "botpasswords-disabled": "Bot şifreleri devre dışı.",
-       "botpasswords-no-central-id": "Bot şifresini kullanmak için, merkezi bir hesap ile giriş yapmalısınız.",
-       "botpasswords-existing": "Mevcut bot şifreleri",
-       "botpasswords-createnew": "Yeni bir bot şifresi oluştur",
-       "botpasswords-editexisting": "Mevcut bir bot şifresini düzenle",
+       "botpasswords-disabled": "Bot parolaları devre dışı.",
+       "botpasswords-no-central-id": "Bot parolaları kullanmak için, merkezi bir hesap ile oturum açmalısınız.",
+       "botpasswords-existing": "Mevcut bot parolaları",
+       "botpasswords-createnew": "Yeni bir bot parolası oluştur",
+       "botpasswords-editexisting": "Mevcut bir bot parolasını düzenle",
        "botpasswords-label-appid": "Bot ismi:",
        "botpasswords-label-create": "Oluştur",
        "botpasswords-label-update": "Güncelle",
        "botpasswords-label-cancel": "İptal",
        "botpasswords-label-delete": "Sil",
-       "botpasswords-label-resetpassword": "Şifreyi sıfırla",
+       "botpasswords-label-resetpassword": "Parolayı sıfırla",
        "botpasswords-label-grants": "Geçerli ayrıcalıklar:",
        "botpasswords-label-grants-column": "Verilen",
        "botpasswords-bad-appid": "Bot ismi \"$1\" geçerli değil.",
        "botpasswords-insert-failed": "Bot adı \"$1\" eklenemedi. Zaten eklenmiş olmalı?",
        "botpasswords-update-failed": "Bot ismini \"$1\" olarak güncelleme başarısız oldu. Silinmiş olabilir mi?",
-       "botpasswords-created-title": "Bot şifresi oluşturuldu.",
-       "botpasswords-created-body": "\"$2\" adlı kullanıcının \"$1\" isimli botu için şifre oluşturuldu.",
-       "botpasswords-updated-title": "Bot şifresi guncellendi",
-       "botpasswords-updated-body": "\"$2\" adlı kullanıcının \"$1\" isimli botunun şifresi güncellendi.",
-       "botpasswords-deleted-title": "Bot şifresi silindi.",
-       "botpasswords-deleted-body": "\"$2\" adlı kullanıcının \"$1\" isimli botunun şifresi silindi.",
+       "botpasswords-created-title": "Bot parolası oluşturuldu",
+       "botpasswords-created-body": "\"$2\" adlı kullanıcının \"$1\" adlı botu için bot parolası oluşturuldu.",
+       "botpasswords-updated-title": "Bot parolası güncellendi",
+       "botpasswords-updated-body": "\"$2\" adlı kullanıcının \"$1\" adlı botunun bot parolası güncellendi.",
+       "botpasswords-deleted-title": "Bot parolası silindi",
+       "botpasswords-deleted-body": "\"$2\" adlı kullanıcının \"$1\" adlı botunun bot parolası silindi.",
        "botpasswords-newpassword": "<strong>$1</strong> ile oturum açmak için yeni şifre: <strong>$2</strong>. <em>İlerde başvurmak için lütfen kaydedin.</em>",
        "botpasswords-no-provider": "BotPasswordsSessionProvider kullanılamaz.",
-       "botpasswords-restriction-failed": "Bot şifresi sınırlamaları oturum açmayı engelledi.",
-       "botpasswords-invalid-name": "Belirtilen kullanıcı adı bot şifresi ayırıcısını içermiyor (\"$1\").",
+       "botpasswords-restriction-failed": "Bot parolası kısıtlamaları bu oturum açma işlemini önlemektedir.",
+       "botpasswords-invalid-name": "Belirtilen kullanıcı adı bot parolası ayırıcısı içermiyor (\"$1\").",
        "resetpass_forbidden": "Parolalar değiştirilememektedir",
        "resetpass_forbidden-reason": "Şifre değiştirilemedi: $1",
        "resetpass-no-info": "Bu sayfaya doğrudan erişmek için oturum açmanız gereklidir.",
        "resetpass-submit-loggedin": "Parolayı değiştir",
        "resetpass-submit-cancel": "İptal",
-       "resetpass-wrong-oldpass": "Geçersiz geçici veya güncel şifre.\nŞifrenizi zaten başarıyla değiştirdiniz ya da yeni bir geçici şifre istediniz.",
+       "resetpass-wrong-oldpass": "Geçersiz geçici veya güncel parola.\nParolanızı daha önce değiştirmiş veya yeni bir geçici parola istemiş olabilirsiniz.",
        "resetpass-recycled": "Lütfen parolanızı eski parolanızdan farklı olarak değiştirin.",
        "resetpass-temp-emailed": "E-postayla gönderilmiş geçici kodla giriş yaptınız. Oturum açmayı tamamlamak için yeni bir şifre belirlemeniz gerekiyor:",
        "resetpass-temp-password": "Geçici parola:",
        "token_suffix_mismatch": "'''Değişikliğiniz geri çevrildi çünkü alıcınız düzenleme kutucuğundaki noktalama işaretlerini bozdu.\nDeğişikliğiniz, sayfa metninde bozulmayı önlemek için geri çevrildi.\nEğer sorunlu bir web-tabanlı anonim proksi servisi kullanıyorsanız bu olay bazen gerçekleşebilir.'''",
        "edit_form_incomplete": "'''Değişiklik formu için bazı sunuculara erişilemedi; yaptığınız değişiklikler bozulmamıştır, gözden geçirip tekrar deneyiniz.'''",
        "editing": "\"$1\" sayfasını değiştirmektesiniz",
-       "creating": "Oluşturuluyor $1",
+       "creating": "$1 sayfasını oluşturuyorsunuz",
        "editingsection": "\"$1\" sayfasında bölüm değiştirmektesiniz",
        "editingcomment": "$1 değiştiriliyor (yeni bölüm)",
        "editconflict": "Değişiklik çakışması: $1",
        "sectioneditnotsupported-text": "Bölüm değiştirmesi bu sayfada desteklenmiyor.",
        "permissionserrors": "İzin hatası",
        "permissionserrorstext": "Aşağıdaki {{PLURAL:$1|sebep|sebepler}}den dolayı, bunu yapmaya yetkiniz yok:",
-       "permissionserrorstext-withaction": "Aşağıdaki {{PLURAL:$1|neden|nedenler}}den dolayı $2 yetkiniz yok:",
-       "recreate-moveddeleted-warn": "'''Uyarı: Daha önceden silinmiş bir sayfayı tekrar oluşturuyorsunuz.'''\n\nSayfayı değiştirmeye devam etmenin uygun olup olmadığını düşünmelisiniz.\nSayfanın silme ve taşıma kaydı kolaylık için burada verilmiştir:",
+       "permissionserrorstext-withaction": "Aşağıdaki {{PLURAL:$1|neden|nedenler}}den dolayı $2 için yetkiniz yok:",
+       "recreate-moveddeleted-warn": "<strong>Uyarı: Daha önceden silinmiş bir sayfayı tekrar oluşturuyorsunuz.</strong>\n\nBu sayfayı düzenlemeye devam etmenin uygun olup olmadığını düşünmelisiniz.\nBu sayfanın silme ve taşıma günlüğü kolaylık için burada verilmiştir:",
        "moveddeleted-notice": "Bu sayfa silinmiş.\nSayfanın silme ve taşıma kaydı referans için aşağıda verilmiştir.",
        "log-fulllog": "Tam günlüğü gör",
        "edit-hook-aborted": "Değişiklik çengelle durduruldu.\nBir açıklama verilmedi.",
        "undo-summary-username-hidden": "Gizli bir kullanıcı tarafından $1 sürümü geri alınıyor",
        "cantcreateaccount-text": "Bu IP adresinden ('''$1''') kullanıcı hesabı oluşturulması [[User:$3|$3]] tarafından engellenmiştir.\n\n$3 tarafından verilen sebep ''$2''",
        "cantcreateaccount-range-text": "<strong>$1</strong> aralığındaki IP'ler için hesap oluşturma [[User:$3|$3]] tarafından engellendi, bu sizin IP adresinizi de (<strong>$4</strong>) içeriyor.\n\n$3 tarafından verilen gerekçe <em>$2</em>",
-       "viewpagelogs": "Bu sayfa ile ilgili kayıtları göster",
+       "viewpagelogs": "Bu sayfa için günlükleri gör",
        "nohistory": "Bu sayfanın geçmiş sürümü yok.",
        "currentrev": "Güncel sürüm",
        "currentrev-asof": "$1 itibarı ile sayfanın şu anki hâli",
        "previousrevision": "← Önceki hâli",
        "nextrevision": "Sonraki hâli →",
        "currentrevisionlink": "En güncel hâli",
-       "cur": "fark",
+       "cur": "gün",
        "next": "sonraki",
        "last": "son",
        "page_first": "ilk",
        "revdelete-reasonotherlist": "Diğer sebep",
        "revdelete-edit-reasonlist": "Silme nedenlerini değiştir",
        "revdelete-offender": "Revizyon yazarı:",
-       "suppressionlog": "Gizleme kayıtları",
+       "suppressionlog": "Gizleme günlüğü",
        "suppressionlogtext": "Aşağıdaki, hizmetlilerden gizlenen içerik içeren silinmelerin ve engellemelerin listesidir.\nŞu anda işlevsel olan yasak ve engellemelerin listesi için [[Special:BlockList|engelleme listesine]] bakın.",
        "mergehistory": "Sayfa geçmişlerini takas et.",
        "mergehistory-header": "Bu sayfa, bir kaynak sayfanın geçmiş revizyonlarını yeni bir sayfaya birleştirmenize olanak sağlar.\nBu değişikliğin geçmişe ait sayfa devamlılığını devam ettirdiğinden emin olun.",
        "mergehistory-same-destination": "Kaynak ve hedef sayfaları aynı olamaz",
        "mergehistory-reason": "Sebep:",
        "mergehistory-revisionrow": "$1 ($2) $3 . . $4 $5 $6",
-       "mergelog": "Birleştirme kaydı",
+       "mergelog": "Birleştirme günlüğü",
        "revertmerge": "Ayır",
        "mergelogpagetext": "Aşağıdaki liste, sayfaların geçmiş versiyonlarının birbirleriyle en son birleştirilmelerini içerir",
        "history-title": "\"$1\" sayfasının geçmişi",
        "searchprofile-images-tooltip": "Dosya ara",
        "searchprofile-everything-tooltip": "Tüm içerikte ara (tartışma sayfaları dahil)",
        "searchprofile-advanced-tooltip": "Özel ad alanlarında ara",
-       "search-result-size": "$1 ({{PLURAL:$2|1 kelime|$2 kelime}})",
+       "search-result-size": "$1 ($2 sözcük)",
        "search-result-category-size": "{{PLURAL:$1|1 üye|$1 üye}} ({{PLURAL:$2|1 altkategori|$2 altkategori}}, {{PLURAL:$3|1 dosya|$3 dosya}})",
        "search-redirect": "($1 sayfasından yönlendirme)",
        "search-section": "($1 bölümü)",
        "prefs-help-prefershttps": "Bu tercih bir sonraki girişinizde etkili olacaktır.",
        "prefswarning-warning": "Henüz kaydedilmemiş değişiklikler yaptınız. \"$\"'e basmadığınız takdirde tercihleriniz güncellenmeyecektir.",
        "prefs-tabs-navigation-hint": "İpucu: Sekmeler listesindeki sekmeler arasında gezinmek için sağ ve sol ok tuşlarını kullanabilirsiniz.",
-       "userrights": "Kullanıcı hakları yönetimi",
+       "userrights": "Kullanıcı hakları",
        "userrights-lookup-user": "Bir kullanıcı seç",
        "userrights-user-editname": "Kullanıcı adı giriniz:",
        "editusergroup": "Kullanıcı gruplarını gör",
        "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-changeable-col": "Değiştirebildiğiniz gruplar",
-       "userrights-unchangeable-col": "Değiştirebilmediğiniz gruplar",
+       "userrights-unchangeable-col": "Değiştiremediğiniz gruplar",
        "userrights-conflict": "Kullanıcı hakları değişikliklerinde çakışma! Lütfen değişikliklerinizi gözden geçirin ve onaylayın.",
        "group": "Grup:",
        "group-user": "Kullanıcılar",
        "grouppage-bureaucrat": "{{ns:project}}:Bürokratlar",
        "grouppage-suppress": "{{ns:project}}:Gözetmen",
        "right-read": "Sayfaları oku",
-       "right-edit": "Sayfaları değiştir",
+       "right-edit": "Sayfaları düzenle",
        "right-createpage": "Sayfa oluştur (tartışma sayfası olmayan)",
        "right-createtalk": "Tartışma sayfaları oluştur",
        "right-createaccount": "Yeni kullanıcı hesapları yarat",
        "grant-basic": "Basit haklar",
        "grant-viewdeleted": "Silinen dosya ve sayfaları görüntüle",
        "grant-viewmywatchlist": "İzleme listeni gör",
-       "newuserlogpage": "Yeni kullanıcı kayıtları",
-       "newuserlogpagetext": "En son kaydolan kullanıcı kayıtları.",
-       "rightslog": "Kullanıcı hakları kayıtları",
-       "rightslogtext": "Kullanıcı hakları değişiklikleri kayıtları.",
+       "newuserlogpage": "Kullanıcı oluşturma günlüğü",
+       "newuserlogpagetext": "Bu bir kullanıcı oluşturma günlüğüdür.",
+       "rightslog": "Kullanıcı hakları günlüğü",
+       "rightslogtext": "Bu, kullanıcı hakları değişiklikleri için bir günlüktür.",
        "action-read": "bu sayfayı okumaya",
        "action-edit": "bu sayfayı değiştirmeye",
        "action-createpage": "sayfa oluşturmaya",
        "rcfilters-invalid-filter": "Geçersiz süzgeç",
        "rcfilters-empty-filter": "Etkin süzgeç bulunmuyor. Tüm katkıları gösteriliyor.",
        "rcfilters-filterlist-title": "Süzgeçler",
+       "rcfilters-filterlist-whatsthis": "Bu nedir?",
        "rcfilters-filterlist-feedbacklink": "Yeni (beta) süzgeçler konusunda geribildirim verin",
        "rcfilters-highlightbutton-title": "Sonuçları vurgula",
        "rcfilters-highlightmenu-title": "Bir renk seçin",
        "rcfilters-filter-unpatrolled-label": "Devriye onayından geçmemiş",
        "rcfilters-filter-unpatrolled-description": "Devriye onayından geçmiş olarak işaretlenmeyen düzenlemeler.",
        "rcfilters-filtergroup-significance": "Önem",
-       "rcfilters-filter-minor-label": "Küçük değişiklikler",
+       "rcfilters-filter-minor-label": "Küçük düzenlemeler",
        "rcfilters-filter-minor-description": "Yazarın küçük olarak etiketlediği düzenlemeler.",
-       "rcfilters-filter-major-label": "Küçük olmayan değişiklikler",
+       "rcfilters-filter-major-label": "Küçük olmayan düzenlemeler",
        "rcfilters-filter-major-description": "Küçük olarak etiketlenmemiş düzenlemeler.",
        "rcfilters-filtergroup-changetype": "Değişiklik türü",
        "rcfilters-filter-pageedits-label": "Sayfa düzenlemeleri",
        "rcfilters-filter-categorization-label": "Kategori değişiklikleri",
        "rcfilters-filter-categorization-description": "Kategorilere eklenen veya kaldırılan sayfaların kayıtları.",
        "rcfilters-filter-logactions-label": "Günlüğü tutulan işlemler",
+       "rcfilters-filter-logactions-description": "Hizmetli işlemleri, hesap oluşturmalar, sayfa silmeler, yüklemeler....",
        "rcnotefrom": "<strong>$3, $4</strong> tarihinden itibaren yapılan {{PLURAL:$5|değişiklik|değişiklik}} aşağıdadır (<strong>$1</strong> tarhine kadar olanlar gösterilmektedir).",
        "rclistfrom": "$3 $2 tarihinden itibaren yeni değişiklikleri göster",
        "rcshowhideminor": "Küçük değişiklikleri $1",
        "upload-permitted": "İzin verilen dosya {{PLURAL:$2|türü|türleri}}: $1.",
        "upload-preferred": "Tercih edilen dosya {{PLURAL:$2|türü|türleri}}: $1.",
        "upload-prohibited": "Yasaklanan dosya {{PLURAL:$2|türü|türleri}}: $1.",
-       "uploadlogpage": "Dosya yükleme kaydı",
+       "uploadlogpage": "Yükleme günlüğü",
        "uploadlogpagetext": "Aşağıda en son eklenen [[Special:NewFiles|dosyaların bir listesi]] bulunmaktadır.",
        "filename": "Dosya adı",
        "filedesc": "Açıklama",
        "filerevert-submit": "Eski haline döndür",
        "filerevert-success": "'''[[Media:$1|$1]]''' dosyası [$4 $3, $2 tarihli sürüme] geri döndürüldü.",
        "filerevert-badversion": "Bu dosyanın verilen zaman bilgisine sahip önceki bir yerel sürümü yok.",
-       "filedelete": "Sil $1",
+       "filedelete": "$1 adlı dosyayı sil",
        "filedelete-legend": "Dosya sil",
        "filedelete-intro": "'''[[Media:$1|$1]]''' dosyasını tüm geçmişiyle birlikte silmek üzeresiniz.",
        "filedelete-intro-old": "'''[[Media:$1|$1]]''' dosyasının [$4 $3, $2] tarihli sürümünü siliyorsunuz.",
        "filedelete-comment": "Neden:",
-       "filedelete-submit": "sil",
+       "filedelete-submit": "Sil",
        "filedelete-success": "'''$1''' silindi.",
        "filedelete-success-old": "'''[[Media:$1|$1]]''' dosyasının $3, $2 tarihli sürümü silindi.",
        "filedelete-nofile": "'''$1''' mevcut değildir.",
        "double-redirect-fixed-move": "[[$1]] taşındı.\nYönlendirme otomatik olarak güncellendi ve [[$2]] sayfasına yönlendirildi.",
        "double-redirect-fixed-maintenance": "[[$1]] sayfasından [[$2]] sayfasına yapılan çift yönlendirme otomatik olarak düzeltiliyor.",
        "double-redirect-fixer": "Yönlendirme tamircisi",
-       "brokenredirects": "Boş yönlendirmeler",
+       "brokenredirects": "Var olmayan sayfalara yönlendirmeler",
        "brokenredirectstext": "Aşağıdaki yönlendirmeler varolmayan sayfalara bağlantı veriyor:",
-       "brokenredirects-edit": "değiştir",
+       "brokenredirects-edit": "düzenle",
        "brokenredirects-delete": "sil",
        "withoutinterwiki": "Diğer dillere bağlantısı olmayan sayfalar",
        "withoutinterwiki-summary": "Aşağıda listelenen sayfalar diğer dillere bağlantı içermemektedir:",
        "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",
+       "log": "Günlükler",
        "logeventslist-submit": "Göster",
-       "all-logs-page": "Tüm ortak günlükler",
+       "all-logs-page": "Tüm genel günlükler",
        "alllogstext": "{{SITENAME}} için mevcut tüm günlüklerin birleşik gösterimi.\nGünlük tipini, kullanıcı adını (büyük-küçük harf duyarlı), ya da etkilenen sayfayı (yine büyük-küçük harf duyarlı) seçerek görünümü daraltabilirsiniz.",
        "logempty": "Kayıtlarda eşleşen bilgi yok.",
        "log-title-wildcard": "Bu metinle başlayan başlıklar ara",
        "allarticles": "Tüm maddeler",
        "allinnamespace": "Tüm sayfalar ($1 sayfaları)",
        "allpagessubmit": "Getir",
-       "allpagesprefix": "Buraya yazdığınız harflerle başlayan sayfaları listeleyin:",
+       "allpagesprefix": "Şu öneke sahip sayfaları görüntüle:",
        "allpagesbadtitle": "Girilen sayfa ismi diller arası bağlantı ya da vikiler arası bağlantı içerdiğinden geçerli değil. Başlıklarda kullanılması yasak olan bir ya da daha çok karakter içeriyor olabilir.",
        "allpages-bad-ns": "{{SITENAME}} sitesinde \"$1\" ad alanı yok.",
        "allpages-hide-redirects": "Yönlendirmeleri gizle",
        "emailfrom": "Kimden:",
        "emailto": "Kime:",
        "emailsubject": "Konu:",
-       "emailmessage": "E-posta:",
+       "emailmessage": "İleti:",
        "emailsend": "Gönder",
        "emailccme": "Mesajın bir kopyasını da bana gönder.",
        "emailccsubject": "$1'e gönderdiğiniz mesajın kopyası: $2",
        "emailsent": "E-posta gönderildi",
-       "emailsenttext": "E-postaz gönderildi.",
+       "emailsenttext": "E-posta iletiniz gönderildi.",
        "emailuserfooter": "Bu e-posta $1 tarafından $2 kullanıcısına, {{SITENAME}} sitesindeki \"Kullanıcıya e-posta gönder\" (\"{{int:emailuser}}\") fonksiyonu ile gönderilmiştir.",
        "usermessage-summary": "Sistem mesajı bırakın.",
        "usermessage-editor": "Sistem habercisi",
        "excontent": "eski içerik: '$1'",
        "excontentauthor": "eski içerik: '$1' ('[[Special:Contributions/$2|$2]]' katkıda bulunmuş olan tek kullanıcı)",
        "exbeforeblank": "Silinmeden önceki içerik: '$1'",
-       "delete-confirm": "\"$1\" sil",
-       "delete-legend": "sil",
+       "delete-confirm": "\"$1\" sayfasını sil",
+       "delete-legend": "Sil",
        "historywarning": "<strong>Uyarı:</strong> Silmek üzere olduğunuz sayfanın yaklaşık olarak $1 sürüme sahip bir geçmişi var:",
        "historyaction-submit": "Göster",
        "confirmdeletetext": "Bu sayfayı veya dosyayı tüm geçmişi ile birlikte veritabanından kalıcı olarak silmek üzeresiniz.\nBu işlemden kaynaklı doğabilecek sonuçların farkında iseniz ve işlemin [[{{MediaWiki:Policy-url}}|Silme kurallarına]] uygun olduğuna eminseniz, işlemi onaylayın.",
        "actioncomplete": "İşlem tamamlandı",
        "actionfailed": "İşlem başarısız oldu",
        "deletedtext": "\"$1\" silindi.\nYakın zamanda silinenleri görmek için: $2.",
-       "dellogpage": "Silme kayıtları",
-       "dellogpagetext": "Aşağıdaki liste son silme kayıtlarıdır.",
-       "deletionlog": "silme kayıtları",
+       "dellogpage": "Silme günlüğü",
+       "dellogpagetext": "Aşağıda en son silme işlemlerinin bir listesi bulunmaktadır.",
+       "deletionlog": "silme günlüğü",
        "reverted": "Önceki sürüm geri getirildi",
        "deletecomment": "Neden:",
        "deleteotherreason": "Diğer/ilave neden:",
        "rollbackfailed": "geri alma işlemi başarısız",
        "cantrollback": "Sayfaya son katkıda bulunan kullanıcı, sayfaya katkıda bulunmuş tek kişi olduğu için, değişiklikler geri alınamıyor.",
        "alreadyrolled": "[[User:$2|$2]] ([[User talk:$2|Tartışma]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) tarafından [[:$1]] sayfasında yapılmış son değişiklik geri döndürülemiyor;\nbaşka birisi sayfada değişiklik yaptı ya da sayfayı geri döndürdü.\n\nSon değişikliği yapan: [[User:$3|$3]] ([[User talk:$3|Tartışma]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
-       "editcomment": "Değişiklik özeti: <em>$1</em> idi.",
+       "editcomment": "Düzenleme özeti şöyleydi: <em>$1</em>.",
        "revertpage": "[[Special:Contributions/$2|$2]] [[User talk:$2|mesaj]] tarafından yapılan değişiklikler geri alınarak, [[User:$1|$1]] tarafından değiştirilmiş önceki sürüm geri getirildi.",
        "revertpage-nouser": "Gizli bir kullanıcı tarafından yapılan değişiklikler geri alınarak {{GENDER:$1|[[User:$1|$1]]}} tarafından yapılan son revizyon geri getirildi",
        "rollback-success": "$1 tarafından yapılan değişiklikler geri alınarak;\n$2 tarafından değiştirilmiş önceki sürüme geri dönüldü.",
        "sessionfailure-title": "Oturum başarısızlığı",
        "sessionfailure": "Giriş oturumunuzla ilgili bir sorun var gibi görünüyor;\nbu eylem, oturum gaspına karşı önlem olarak iptal edildi.\nLütfen \"geri\" gidin ve geldiğiniz sayfayı yeniden yükleyin, sonra tekrar deneyin.",
+       "changecontentmodel": "Bir sayfanın içerik modelini değiştir",
        "changecontentmodel-title-label": "Sayfa başlığı",
        "changecontentmodel-model-label": "Yeni içerik modeli",
        "changecontentmodel-reason-label": "Gerekçe:",
        "log-name-contentmodel": "İçerik modeli değiştirme günlüğü",
        "logentry-contentmodel-change-revertlink": "Eski haline döndür",
        "logentry-contentmodel-change-revert": "Eski haline döndür",
-       "protectlogpage": "Koruma kayıtları",
+       "protectlogpage": "Koruma günlüğü",
        "protectlogtext": "Aşağıdaki, sayfa korumalarına değişikliklerin bir listesidir.\nŞu anda uygulanan sayfa korumaları için [[Special:ProtectedPages|koruma altına alınmış sayfalar listesine]] bakabilirsiniz.",
        "protectedarticle": "\"[[$1]]\" koruma altında alındı",
        "modifiedarticleprotection": "\"[[$1]]\" için koruma düzeyi değiştirildi",
        "minimum-size": "En küçük boyut",
        "maximum-size": "En büyük boyut:",
        "pagesize": "(bayt)",
-       "restriction-edit": "değiştir",
+       "restriction-edit": "Düzenle",
        "restriction-move": "Taşı",
        "restriction-create": "Oluştur",
        "restriction-upload": "Yükle",
        "undeleteviewlink": "görüntüle",
        "undeleteinvert": "Seçimi ters çevir",
        "undeletecomment": "Neden:",
-       "undeletedrevisions": "Toplam {{PLURAL:$1|1 kayıt|$1 kayıt}} geri getirildi.",
-       "undeletedrevisions-files": "{{PLURAL:$1|1 revizyon|$1 revizyon}} ve {{PLURAL:$2|1 dosya|$2 dosya}} eski konumuna getirildi",
-       "undeletedfiles": "{{PLURAL:$1|1 dosya|$1 dosya}} geri getirildi.",
-       "cannotundelete": "Silme başarısız oldu:\n$1",
+       "cannotundelete": "Geri getirme işlemlerinden bazıları veya tümü başarısız oldu:\n$1",
        "undeletedpage": "'''$1 sayfası geri getirildi'''\n\nÖnceki silme ve geri getirme işlemleri için [[Special:Log/delete|silme kayıtları]]na bakınız.",
-       "undelete-header": "Daha önce silinmiş sayfaları görmek için bakınız: [[Special:Log/delete|silme kayıtları]].",
+       "undelete-header": "Yakın zamanda silinen sayfaları görmek için [[Special:Log/delete|silme günlüğü]]ne bakın.",
        "undelete-search-title": "Silinen sayfaları ara",
        "undelete-search-box": "Silinmiş sayfaları ara",
        "undelete-search-prefix": "Şununla başlayan sayfaları göster:",
        "sp-contributions-newbies": "Sadece yeni kullanıcıların katkılarını göster",
        "sp-contributions-newbies-sub": "Yeni kullanıcılar için",
        "sp-contributions-newbies-title": "Yeni hesaplar için kullanıcı katkıları",
-       "sp-contributions-blocklog": "Engel kaydı",
+       "sp-contributions-blocklog": "engelleme günlüğü",
        "sp-contributions-suppresslog": "kullanıcının silinen katkıları",
        "sp-contributions-deleted": "kullanıcının silinen katkıları",
        "sp-contributions-uploads": "yüklenenler",
-       "sp-contributions-logs": "kayıtlar",
+       "sp-contributions-logs": "günlükler",
        "sp-contributions-talk": "mesaj",
        "sp-contributions-userrights": "kullanıcı hakları yönetimi",
        "sp-contributions-blocked-notice": "Bu kullanıcı engellenmiştir. Referans için en son engellenme kaydı aşağıda belirtilmiştir:",
        "sp-contributions-hideminor": "Küçük değişiklikleri gizle",
        "sp-contributions-submit": "Ara",
        "whatlinkshere": "Sayfaya bağlantılar",
-       "whatlinkshere-title": "\"$1\" maddesine bağlantı veren sayfalar",
+       "whatlinkshere-title": "\"$1\" sayfasına bağlantı veren sayfalar",
        "whatlinkshere-page": "Sayfa:",
        "linkshere": "'''[[:$1]]''' sayfasına bağlantısı olan sayfalar:",
        "nolinkshere": "'''[[:$1]]''' sayfasına bağlantı veren sayfa yok.",
        "blockip": "{{GENDER:$1|Kullanıcıyı}} engelle",
        "blockip-legend": "Kullanıcıyı engelle",
        "blockiptext": "Aşağıdaki formu kullanarak belli bir IP'nin veya kayıtlı kullanıcının değişiklik yapmasını engelleyebilirsiniz. Bu sadece vandalizmi engellemek için ve [[{{MediaWiki:Policy-url}}|kurallara]] uygun olarak yapılmalı. Aşağıya mutlaka engelleme ile ilgili bir açıklama yazınız. (örnek: -Şu- sayfalarda vandalizm yapmıştır).",
-       "ipaddressorusername": "IP adresi veya kullanıcı adı",
+       "ipaddressorusername": "IP adresi veya kullanıcı adı:",
        "ipbexpiry": "Bitiş süresi",
        "ipbreason": "Neden:",
        "ipbreason-dropdown": "*Genel engelleme nedenleri\n** Yanlış bilgi eklemek\n** Sayfalardan içeriği çıkarmak\n** Dış sitelere spam bağlantı vermek\n** Sayfalara mantıksız/anlaşılmaz sözler eklemek\n** Tehditvari davranış/Taciz\n** Birden fazla hesabı kötüye kullanmak\n** Kabul edilemez kullanıcı adı",
        "ipb-change-block": "Bu ayarlarla kullanıcıyı yeniden engelle",
        "ipb-confirm": "Engeli onayla",
        "badipaddress": "Geçersiz IP adresi",
-       "blockipsuccesssub": "IP adresi engelleme işlemi başarılı oldu",
+       "blockipsuccesssub": "Engelleme başarılı oldu",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] engellendi.<br />\nEngellemeleri gözden geçirmek için [[Special:BlockList|engel listesine]] bakınız.",
        "ipb-blockingself": "Kendinizi engellemek üzeresiniz! Bunu yapmak istediğinizden emin misiniz?",
        "ipb-confirmhideuser": "\"Kullanıcıyı gizle\" seçiliyken bir kullanıcı engellemek üzeresiniz. Bu, kullanıcının adını tüm listeler ile günlük girişlerinde bastıracaktır. Bunu yapmak istediğinizden emin misiniz?",
        "ipb-confirmaction": "Bunu gerçekten yapmak istediğinize eminseniz, lütfen en alttaki \"{{int:ipb-confirm}}\" alanını işaretleyin.",
        "ipb-edit-dropdown": "Engelleme nedenleri düzenle",
        "ipb-unblock-addr": "$1 için engellemeyi kaldır",
-       "ipb-unblock": "Engellemeyi kaldır",
+       "ipb-unblock": "Bir kullanıcı adı veya IP adresinin engellemesini kaldır",
        "ipb-blocklist": "Mevcut olan engellemeleri göster",
        "ipb-blocklist-contribs": "{{GENDER:$1|$1}} için katkılar",
        "unblockip": "Kullanıcının engellemesini kaldır",
        "unblockiptext": "Daha önceden engellenmiş bir IP adresine ya da kullanıcı adına yazma erişimini geri vermek için aşağıdaki formu kullanın.",
        "ipusubmit": "Bu engellemeyi kaldır",
        "unblocked": "[[User:$1|$1]] - engelleme kaldırıldı",
-       "unblocked-range": "$1 engeli kaldırıldı",
+       "unblocked-range": "$1 adlı kullanıcının engeli kaldırıldı.",
        "unblocked-id": "$1 engeli çıkarıldı",
        "unblocked-ip": "[[Special:Contributions/$1|$1]] engellenmiştir.",
        "blocklist": "Engellenmiş kullanıcılar",
        "blocklist-target": "Hedef",
        "blocklist-expiry": "Bitiş tarihi",
        "blocklist-by": "Engeli veren hizmetli",
-       "blocklist-params": "Engel parametreleri",
+       "blocklist-params": "Engelleme parametreleri",
        "blocklist-reason": "Gerekçe",
        "ipblocklist-submit": "Ara",
        "ipblocklist-localblock": "Yerel engelleme",
        "ipblocklist-otherblocks": "Diğer {{PLURAL:$1|engelleme|engellemeler}}",
        "infiniteblock": "Süresiz",
        "expiringblock": "$1 $2 tarihinde doluyor",
-       "anononlyblock": "sadece anonim",
+       "anononlyblock": "yalnızca anonim",
        "noautoblockblock": "otomatik engelleme devre dışı bırakıldı",
        "createaccountblock": "hesap açımı engellendi",
        "emailblock": "e-posta engellendi",
        "ipblocklist-empty": "Engelleme listesi boş.",
        "ipblocklist-no-results": "İstenen IP adresi ya da kullanıcı adı engellenmedi.",
        "blocklink": "engelle",
-       "unblocklink": "engeli kaldır",
+       "unblocklink": "engellemeyi kaldır",
        "change-blocklink": "engeli değiştir",
        "contribslink": "katkılar",
        "emaillink": "e-posta gönder",
        "autoblocker": "Otomatik olarak engellendiniz çünkü yakın zamanda IP adresiniz \"[[User:$1|$1]]\" kullanıcısı tarafından  kullanılmıştır. $1 isimli kullanıcının engellenmesi için verilen sebep: \"'''$2'''\"",
-       "blocklogpage": "Engel kaydı",
+       "blocklogpage": "Engelleme günlüğü",
        "blocklog-showlog": "Bu kullanıcı daha önceden engellenmiş.\nEngelleme günlüğü referans için aşağıda sağlanmıştır:",
        "blocklog-showsuppresslog": "Bu kullanıcı daha önceden engellenmiş ve gizlenmiş.\nGizleme günlüğü referans için aşağıda sağlanmıştır:",
-       "blocklogentry": ", [[$1]] kullanıcısını engelledi, engelleme süresi: $2 $3",
-       "reblock-logentry": "[[$1]] için bitiş tarihi $2 $3 olmak üzere engelleme ayarlarını değiştirdi",
-       "blocklogtext": "Burada kullanıcı erişimine yönelik engelleme ya da engelleme kaldırma kayıtları listelenmektedir. Otomatik  IP adresi engellemeleri listeye dahil değildir. Şu anda erişimi durdurulmuş kullanıcıları [[Special:BlockList|engelleme listesi]] sayfasından görebilirsiniz.",
-       "unblocklogentry": "$1 kullanıcının engellemesi kaldırıldı",
+       "blocklogentry": ", [[$1]] adlı kullanıcıyı $2 süreyle ve $3 gerekçesiyle engelledi.",
+       "reblock-logentry": ", [[$1]] adlı kullanıcı için engelleme ayarlarını değiştirdi ve bitiş süresini $2 olarak belirledi $3",
+       "blocklogtext": "Bu, kullanıcı engelleme ve engel kaldırma işlemlerinin bir günlüğüdür.\nOtomatik olarak engellenen IP adresleri listelenmemiştir.\nŞu anda geçerli yasaklama ve engellemelerin listesi için [[Special:BlockList|engelleme listesi]]ne bakın.",
+       "unblocklogentry": ", $1 adlı kullanıcının engellemesini kaldırdı",
        "block-log-flags-anononly": "sadece anonim kullanıcılar",
        "block-log-flags-nocreate": "hesap yaratımı engellendi",
        "block-log-flags-noautoblock": "Otomatik engelleme iptal edildi",
        "lockdbsuccesssub": "Veritabanı kilitlendi",
        "unlockdbsuccesssub": "Veritabanı kiliti açıldı.",
        "lockdbsuccesstext": "Veritabanı kilitlendi.<br />\nBakımın işleriniz bittiğinde veritabanının [[Special:UnlockDB|kilidini açmayı]] unutmayın.",
-       "unlockdbsuccesstext": "Veritanı kilidi açıldı.",
+       "unlockdbsuccesstext": "Veritabanı kilidi kaldırıldı.",
        "lockfilenotwritable": "Veritabanı kilitleme dosyası yazılabilir değil.\nBu, veritabanını kilitleyip açabilmek için, web sunucusu tarafından yazılabilir olmalıdır.",
        "databasenotlocked": "Veritabanı kilitli değil.",
        "lockedbyandtime": "({{GENDER:$1|$1}} tarafından $2 $3 itibariyle)",
        "cant-move-to-category-page": "Bir sayfayı, bir kategoriye taşımaya izniniz yok.",
        "newtitle": "Yeni başlık:",
        "move-watch": "Bu sayfayı izle",
-       "movepagebtn": "İsmi değiştir",
+       "movepagebtn": "Sayfayı taşı",
        "pagemovedsub": "İsim değişikliği tamamlandı.",
        "movepage-moved": "'''\"$1\",  \"$2\" sayfasına taşındı'''",
        "movepage-moved-redirect": "Bir yönlendirme oluşturuldu.",
        "movepage-page-moved": "$1 sayfası $2 sayfasına taşındı.",
        "movepage-page-unmoved": "$1 sayfası $2 başlığına taşınamıyor.",
        "movepage-max-pages": "En fazla $1 {{PLURAL:$1|sayfa|sayfa}} taşındı ve daha fazlası otomatik olarak taşınamaz.",
-       "movelogpage": "Taşıma kaydı",
+       "movelogpage": "Taşıma günlüğü",
        "movelogpagetext": "Aşağıda bulunan liste adı değiştirilmiş sayfaları gösterir.",
        "movesubpage": "{{PLURAL:$1|Alt sayfa|Alt sayfalar}}",
        "movesubpagetext": "Bu sayfanın aşağıda gösterilen $1 {{PLURAL:$1|altsayfası|altsayfası}} vardır.",
        "export-pagelinks": "Bağlı sayfaları içerecek derinlik:",
        "allmessages": "Sistem iletileri",
        "allmessagesname": "Ad",
-       "allmessagesdefault": "Varsayılan mesaj metni",
+       "allmessagesdefault": "Varsayılan ileti metni",
        "allmessagescurrent": "Kullanımdaki metin",
-       "allmessagestext": "Bu liste  MediaWiki ad alanında mevcut olan sistem mesajlarının listesidir.\nGenel MediaWiki yerelleştirmesine katkıda bulunmak isterseniz, lütfen [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Yerelleştirmesi] ve [https://translatewiki.net translatewiki.net] sayfalarını ziyaret edin.",
-       "allmessagesnotsupportedDB": "'''$wgUseDatabaseMessages''' kapalı olduğu için '''{{ns:special}}:Allmessages''' kullanıma açık değil.",
+       "allmessagestext": "Bu liste, MediaWiki ad alanında bulunan sistem iletilerinin listesidir.\nGenel MediaWiki yerelleştirmesine katkıda bulunmak isterseniz, lütfen [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Yerelleştirmesi] ve [https://translatewiki.net translatewiki.net] sayfalarını ziyaret edin.",
+       "allmessagesnotsupportedDB": "Bu sayfa kullanılamıyor, çünkü <strong>$wgUseDatabaseMessages</strong> devre dışı bırakıldı.",
        "allmessages-filter-legend": "Filtre",
        "allmessages-filter": "Özelleştirme durumuna göre filtrele:",
        "allmessages-filter-unmodified": "Değiştirilmemiş",
        "thumbnail_gd-library": "Eksik GD kütüphanesi yapılandırması: kayıp fonksiyon $1",
        "thumbnail_image-missing": "Dosya kayıp gibi görünüyor: $1",
        "thumbnail_image-failure-limit": "Yakın zamanda bu küçük resmin oluşturulması için çok fazla başarısız  girişim oldu ($1 ya da daha fazla). Lütfen daha sonra yeniden deneyin.",
-       "import": "Sayfaları aktar",
+       "import": "Sayfaları içe aktar",
        "importinterwiki": "Başka bir vikiden içe aktar",
        "import-interwiki-text": "İçe aktarmak için bir viki ve sayfa başlığı seçin.\nRevizyon tarihleri ve yazarların isimleri korunacaktır.\nBütün vikilerarası içe aktarım eylemleri [[Special:Log/import|içe aktarım günlüğünde]] kaydedilmektedir.",
        "import-interwiki-sourcewiki": "Kaynak viki:",
        "markedaspatrollederror-noautopatrol": "Kendi değişikliklerinizi kontrol edilmiş olarak işaretleyemezsiniz.",
        "markedaspatrollednotify": "$1 için bu değişiklik kontrol edildi olarak işaretlendi.",
        "markedaspatrollederrornotify": "Kontrol edildi olarak işaretleme başarısız oldu.",
-       "patrol-log-page": "Kontrol kaydı",
+       "patrol-log-page": "Devriye günlüğü",
        "patrol-log-header": "Bu gözlenmiş revizyonların günlüğüdür.",
        "log-show-hide-patrol": "Gözetim günlüğünü $1",
-       "log-show-hide-tag": "$1 Etiket günlüğü",
+       "log-show-hide-tag": "Etiket günlüğünü $1",
        "deletedrevision": "$1 sayılı eski sürüm silindi.",
        "filedeleteerror-short": "$1 dosyanın silinmesinde hata oldu",
        "filedeleteerror-long": "Dosyayı silerken hatalarla karşılaşıldı:\n\n$1",
        "table_pager_limit_submit": "Git",
        "table_pager_empty": "Sonuç yok",
        "autosumm-blank": "Sayfa boşaltıldı",
-       "autosumm-replace": "Sayfa içeriği '$1' ile değiştiriliyor",
+       "autosumm-replace": "Sayfa içeriği '$1' ile değiştirildi",
        "autoredircomment": "[[$1]] sayfasına yönlendirildi",
        "autosumm-new": "Yeni sayfa: \"$1\"",
        "autosumm-newblank": "Boş bir sayfa oluşturdu",
        "watchlisttools-edit": "İzleme listesini gör ve düzenle",
        "watchlisttools-raw": "Ham izleme listesini düzenle",
        "hijri-calendar-m1": "Muharrem",
+       "hijri-calendar-m7": "Recep",
        "hijri-calendar-m8": "Şaban",
        "hijri-calendar-m9": "Ramazan",
        "hijri-calendar-m10": "Şevval",
        "specialpages-group-maintenance": "Bakım raporları",
        "specialpages-group-other": "Diğer özel sayfalar",
        "specialpages-group-login": "Oturum aç / hesap edin",
-       "specialpages-group-changes": "Son değişiklikler ve kayıtlar",
+       "specialpages-group-changes": "Son değişiklikler ve günlükler",
        "specialpages-group-media": "Dosya raporları ve yüklemeler",
        "specialpages-group-users": "Kullanıcılar ve hakları",
        "specialpages-group-highuse": "Çok kullanılan sayfalar",
        "revdelete-uname-unhid": "kullanıcı adı gösterildi",
        "revdelete-restricted": "hizmetliler için uygulanmış kısıtlamalar",
        "revdelete-unrestricted": "hizmetliler için kaldırılmış kısıtlamalar",
-       "logentry-block-block": "$1 {{GENDER:$2|engelledi}} {{GENDER:$4|$3}} engelleme süresi: $5 $6",
-       "logentry-block-unblock": "$1 kullanıcısının {{GENDER:$2|engeli kaldırıldı}} {{GENDER:$4|$3}}",
-       "logentry-block-reblock": "$1, {{GENDER:$4|$3}} kullanıcısının engellenme süresini $5 $6 olarak {{GENDER:$2|değiştirdi}}",
+       "logentry-block-block": "$1, {{GENDER:$4|$3}} adlı kullanıcıyı $5 süreyle {{GENDER:$2|engelledi}} $6",
+       "logentry-block-unblock": "$1, {{GENDER:$4|$3}} adlı kullanıcının {{GENDER:$2|engelini kaldırdı}}",
+       "logentry-block-reblock": "$1, {{GENDER:$4|$3}} adlı kullanıcının engellenme süresini $5 olarak {{GENDER:$2|değiştirdi}} $6",
        "logentry-suppress-block": "{{GENDER:$4|$3}} $1 tarafından {{GENDER:$2|engellendi}} Zamanaşımı: $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|changed}} block settings for {{GENDER:$4|$3}} engelleme süresi $5 $6",
        "logentry-import-upload": "$1 dosya yükleme ile {{GENDER:$2|içe aktardı}}: $3",
        "api-error-stashfailed": "İç hata: Sunucu, geçici dosyaları kaybetti.",
        "api-error-unknown-warning": "Bilinmeyen uyarı: $1",
        "api-error-unknownerror": "Bilinmeyen hata: \"$1\".",
-       "duration-seconds": "$1 {{PLURAL:$1|saniye|saniye}}",
+       "duration-seconds": "$1 saniye",
        "duration-minutes": "$1 {{PLURAL:$1|dakika|dakika}}",
        "duration-hours": "$1 {{PLURAL:$1|saat|saat}}",
        "duration-days": "$1 {{PLURAL:$1|gün|gün}}",
        "headline-anchor-title": "Bu bölüme bağlantı",
        "special-characters-group-latin": "Latin",
        "special-characters-group-latinextended": "Genişletilmiş Latince",
-       "special-characters-group-ipa": "UFA",
+       "special-characters-group-ipa": "IPA",
        "special-characters-group-symbols": "Simgeler",
        "special-characters-group-greek": "Yunan",
        "special-characters-group-greekextended": "Genişletilmiş Yunanca",
index f907c59..b7a3ed0 100644 (file)
@@ -45,7 +45,7 @@
        "tog-watchdefault": "Мин үзгәрткән битләр һәм файллар күзәтү исемлегемә өстәлсен",
        "tog-watchmoves": "Мин күчергән битләр һәм файллар күзәтү исемлегемә өстәлсен",
        "tog-watchdeletion": "Мин бетергән битләр һәм файлларны күзәтү исемлегемгә өстәлсен",
-       "tog-watchuploads": "Минем тарафтан йөкләнелгән файлларны күзәтү исемлегемә кертергә",
+       "tog-watchuploads": "Минем тарафтан йөкләнелгән файлларны күзәтү исемлегемә кертелсен",
        "tog-watchrollback": "Мин үткәрмәгән битләрне күзәтү исемлегемә өстәргә",
        "tog-minordefault": "Барлык үзгәртүләрне килешү буенча кече дип билгеләнсен",
        "tog-previewontop": "Үзгәртү тәрәзәсеннән өстәрәк битне алдан карау өлкәсен күрсәтелсен",
@@ -71,8 +71,8 @@
        "tog-diffonly": "Юрама чагыштыру астында бит эчтәлеге күрсәтелмәсен",
        "tog-showhiddencats": "Яшерен төркемнәр күрсәтелсен",
        "tog-norollbackdiff": "Кире кайтару ясагач юрамалар аермасы күрсәтелмәсен",
-       "tog-useeditwarning": "Битне сакламыйча китү вакытында мине кисәтергә",
-       "tog-prefershttps": "Системага керргәндә һәрвакыт саклаулы тоташуны кулланырга",
+       "tog-useeditwarning": "Битне сакламыйча киткәндә мине кисәтергә",
+       "tog-prefershttps": "Системага кергәндә һәрвакыт саклаулы тоташу кулланылсын",
        "underline-always": "Һәрвакыт",
        "underline-never": "Бервакытта да",
        "underline-default": "Браузер көйләнмәләре кулланылсын",
        "view": "Карау",
        "view-foreign": "$1 сәхифәсендә карау",
        "edit": "Үзгәртү",
-       "edit-local": "Локаль тасвирламаны үзгәртергә",
+       "edit-local": "Локаль тасвирламаны үзгәртү",
        "create": "Төзү",
-       "create-local": "Локаль тасвирлама өстәргә",
+       "create-local": "Локаль тасвирлама өстәү",
        "editthispage": "Бу битне үзгәртү",
        "create-this-page": "Бу битне төзү",
        "delete": "Бетерү",
        "deletethispage": "Бу битне бетерү",
-       "undeletethispage": "Ð\91Ñ\83 Ð±Ð¸Ñ\82не ÐºÐ°Ð¹Ñ\82аÑ\80Ñ\8bÑ\80га",
+       "undeletethispage": "Ð\91Ñ\83 Ð±Ð¸Ñ\82не ÐºÐ°Ð¹Ñ\82аÑ\80Ñ\83",
        "undelete_short": "$1 {{PLURAL:$1|төзәтмәне|$1 төзәтмә}} торгызу",
        "viewdeleted_short": "{{PLURAL:$1|1=1 бетерелгән үзгәртүне|$1 бетерелгән үзгәртүне}} карау\n{{PLURAL:$1|бетерелгән төзәтмәне|$1 бетерелгән төзәтмәне}} карау",
        "protect": "Яклау",
        "login": "Керү",
        "login-security": "Шәхесегезне раслагыз",
        "nav-login-createaccount": "Керү / теркәлү",
-       "userlogin": "Керү / теркәлү",
-       "userloginnocreate": "Керү",
        "logout": "Чыгу",
        "userlogout": "Чыгу",
        "notloggedin": "Сез хисап язмагызга кермәгәнсез",
        "userlogin-noaccount": "Хисап язмагыз юкмы?",
        "userlogin-joinproject": "{{SITENAME}} проектына керү",
-       "nologin": "Кулланучы исемең юкмы? '''$1'''",
-       "nologinlink": "Хисап язмасы төзү",
        "createaccount": "Яңа кулланучыны теркәү",
-       "gotaccount": "Сез инде теркәлдегезме? '''$1'''.",
-       "gotaccountlink": "Керү",
-       "userlogin-resetlink": "Серсүзегезне оныттыгызмы?",
-       "userlogin-resetpassword-link": "Серсүзне алыштырыргамы?",
+       "userlogin-resetpassword-link": "Серсүзегезне оныттыгызмы?",
        "userlogin-helplink2": "Керү буенча ярдәм",
        "userlogin-createanother": "Башка хисап язмасы төзү",
        "createacct-emailrequired": "Электрон почта юлламагыз",
        "createacct-another-email-ph": "Электрон почта юлламагызны кертегез",
        "createaccountmail": "Очраклы рәвештә ясалган ваҡытлыча серсузне файдаланырга һәм аны минем электрон почтама җибәрергә",
        "createacct-realname": "Чын исем (мәҗбүри түгел)",
-       "createaccountreason": "Сәбәп:",
        "createacct-reason": "Сәбәп",
        "createacct-reason-ph": "Нигә сез яңа зисап язмасы төзисез",
        "createacct-submit": "Хисап язмасы төзү",
        "nosuchsectiontitle": "Мондый бүлекне табып булмый.",
        "nosuchsectiontext": "Сез булмаган бүлекне төзәтергә телисез.\nСез бу сәхифәне караганда ул бетерелә алды.",
        "loginreqtitle": "Керү кирәк",
-       "loginreqlink": "керергә",
+       "loginreqlink": "керү",
        "loginreqpagetext": "Сез башка битләр карау өчен $1 тиеш.",
        "accmailtitle": "Серсүз җибәрелде.",
        "accmailtext": "[[User talk:$1|$1]] кулланучысы өчен төзелгән серсүз $2 адресына җибәрелде.\n\nАвторизация узгач, үз хисап язмагызда сез ''[[Special:ChangePassword|серсүзегезне үзгәртә аласыз]]''.",
        "search-nonefound": "Сорауга туры килгән нәтиҗәләр табылмады.",
        "powersearch-legend": "Өстәмә эзләү",
        "powersearch-ns": "исемнәрендә эзләү",
-       "powersearch-togglelabel": "ТамгалаÑ\80га:",
+       "powersearch-togglelabel": "ТамгалаÑ\83:",
        "powersearch-toggleall": "Барысы",
        "powersearch-togglenone": "Берни юк",
-       "powersearch-remember": "Сайланганны алдагы эзләүләр өчен истә калдырырга",
+       "powersearch-remember": "Сайланган алдагы эзләүләр өчен истә калдырылсын",
        "search-external": "Читтән эзләү",
        "search-error": "Эзләгән вакытта хата килеп чыкты:$1",
        "preferences": "Көйләнмәләр",
        "prefs-editwatchlist-edit": "Күзәтү исемлегеннән исемнәрне карау һәм сөртү",
        "prefs-editwatchlist-raw": "Күзәтү исемлеген текстсыман үзгәртү",
        "prefs-editwatchlist-clear": "Күзәтү исемлеген чистарту",
-       "prefs-watchlist-days": "Күзәтү исемлегендә көннәр санын күрсәтергә:",
+       "prefs-watchlist-days": "Күзәтү исемлегендә күрсәтелгән көннәр саны:",
        "prefs-watchlist-days-max": "Иң күбе $1 {{PLURAL:$1|1=көн|көн}}",
        "prefs-watchlist-edits": "Киңәйтелгән күзәтү исемлегендә күрсәтелүче төзәтмәләрнең максималь саны:",
        "prefs-watchlist-edits-max": "Максимум сан: 1000",
        "right-movefile": "файлларның исемен алмаштыру",
        "right-suppressredirect": "Элекке исемнән юнәлтү ясамыйча исемне алмаштыру",
        "right-upload": "файлларны йөкләү",
-       "right-reupload": "Булган файллар өстеннән язарга",
+       "right-reupload": "Булган файллар өстеннән язу",
        "right-writeapi": "Язма өчен API куллану",
        "right-delete": "битләрне бетерү",
        "right-browsearchive": "Бетерелгән битләрне эзләү",
        "newuserlogpage": "Кулланучыларны теркәү көндәлеге",
        "newuserlogpagetext": "Яңа теркәлгән кулланучылар исемлеге",
        "rightslog": "Кулланучының хокуклары көндәлеге",
-       "action-read": "бÑ\83 Ð±Ð¸Ñ\82не Ñ\83кÑ\8bÑ\80га",
-       "action-edit": "бу битне үзгәртергә",
+       "action-read": "бÑ\83 Ð±Ð¸Ñ\82не Ñ\83кÑ\83",
+       "action-edit": "бу битне үзгәртү",
        "action-createpage": "бу битне төзү",
        "action-createtalk": "бу бәхәс битен төзү",
-       "action-move": "бу битне күчерерге",
+       "action-move": "бу битне күчерергә",
        "action-sendemail": "электрон хат җибәрү",
        "nchanges": "$1 {{PLURAL:$1|үзгәртү}}",
        "enhancedrc-history": "тарих",
        "emailtarget": "Кулланучы-хатны алучының исемен языгыз",
        "emailusername": "Кулланучы исеме:",
        "emailusernamesubmit": "Җибәрү",
-       "email-legend": "{{SITENAME}} проектының башка кулланучысына хат җибәрергә",
+       "email-legend": "{{SITENAME}} проектының башка кулланучысына хат җибәрү",
        "emailfrom": "Кемнән:",
        "emailto": "Кемгә:",
        "emailsubject": "Тема:",
        "undeleteviewlink": "карау",
        "undeleteinvert": "Киресен сайлау",
        "undeletecomment": "Сәбәп:",
-       "undeletedrevisions": "$1 {{PLURAL:$1|үзгәреш}} яңадан {{PLURAL:$1|торгызылды}}",
        "undelete-search-submit": "Эзләү",
        "undelete-error-long": "Файлны торгызу вакытында хаталар чыкты:\n\n$1",
        "undelete-show-file-submit": "Әйе",
        "logentry-newusers-autocreate": "{{GENDER:$2|кулланучының}} автоматик рәвештә $1 хисап язмасы төзелде",
        "logentry-upload-upload": "$1 {{GENDER:$2|йөкләде}} $3",
        "rightsnone": "(юк)",
-       "revdelete-summary": "үзгәртүләр тасвирламасы",
        "feedback-adding": "Фикерне сәхифәгә өстәү ...",
        "feedback-back": "Артка",
        "feedback-bugnew": "Мин тикшердем. Яңа хата турында хәбәр итү",
index 78fce1e..b4e4c93 100644 (file)
        "post-expand-template-argument-warning": "'''Увага:''' Ця сторінка містить принаймні один аргумент шаблону, який має надто великий розмір для розгортання.\nЦі аргументи були проігноровані.",
        "post-expand-template-argument-category": "Сторінки, які містять пропущені аргументи шаблонів",
        "parser-template-loop-warning": "Виявлена петля у шаблонах: [[$1]]",
+       "template-loop-category": "Сторінки з петлями шаблонів",
+       "template-loop-category-desc": "Ця сторінка містить петлю шаблонів, тобто шаблон, який рекурсивно викликає сам себе.",
        "parser-template-recursion-depth-warning": "Перевищене обмеження глибини рекурсії шаблону ($1)",
        "language-converter-depth-warning": "Перевищене обмеження глибини мовного конвертора ($1)",
        "node-count-exceeded-category": "Сторінки, на яких перевищено лічильник вузлів",
        "last": "попер.",
        "page_first": "перша",
        "page_last": "остання",
-       "histlegend": "Ð\92ибÑ\96Ñ\80 Ð²ÐµÑ\80Ñ\81Ñ\96Ñ\97: Ð\9fознаÑ\87Ñ\82е Ñ\83 ÐºÑ\80Ñ\83глиÑ\85 Ð²Ñ\96конÑ\86Ñ\8fх версії для порівняння і натисніть «Enter» або кнопку внизу.\n\nПояснення: (поточн.) = відмінності від поточної версії,\n(ост.) = відмінності від попередньої версії, '''м''' = незначне редагування",
-       "history-fieldset-title": "Ð\9fеÑ\80еглÑ\8fнÑ\83Ñ\82и Ñ\96Ñ\81Ñ\82оÑ\80Ñ\96Ñ\8e",
-       "history-show-deleted": "ТÑ\96лÑ\8cки Ð²Ð¸Ð»Ñ\83Ñ\87енÑ\96",
+       "histlegend": "Ð\92ибÑ\96Ñ\80 Ð²ÐµÑ\80Ñ\81Ñ\96Ñ\97: Ð¿Ð¾Ð·Ð½Ð°Ñ\87Ñ\82е Ñ\83 ÐºÑ\80Ñ\83жеÑ\87ках версії для порівняння і натисніть «Enter» або кнопку внизу.\n\nПояснення: (поточн.) = відмінності від поточної версії,\n(ост.) = відмінності від попередньої версії, '''м''' = незначне редагування",
+       "history-fieldset-title": "Ð\9fоÑ\88Ñ\83к Ð²ÐµÑ\80Ñ\81Ñ\96й",
+       "history-show-deleted": "Ð\9bиÑ\88е Ð²Ð¸Ð»Ñ\83Ñ\87енÑ\96 Ð²ÐµÑ\80Ñ\81Ñ\96Ñ\97",
        "histfirst": "найдавніші",
        "histlast": "найновіші",
        "historysize": "($1 {{PLURAL:$1|байт|байти|байтів}})",
        "prefs-help-prefershttps": "Цей параметр набуде чинності при вашому наступному вході у систему.",
        "prefswarning-warning": "Ви внесли в свої налаштування зміни, які ще не були збережені.\nЯкщо ви залишите цю сторінку, не натиснувши \"$1\", налаштування не будуть оновлені.",
        "prefs-tabs-navigation-hint": "Порада: Ви можете використовувати клавіші стрілок вліво і вправо для переходу між вкладками в списку вкладок.",
-       "userrights": "Ð\9aеÑ\80Ñ\83ваннÑ\8f Ð¿Ñ\80авами користувачів",
+       "userrights": "Ð\9fÑ\80ава користувачів",
        "userrights-lookup-user": "Виберіть користувача",
        "userrights-user-editname": "Введіть ім'я користувача:",
        "editusergroup": "Завантажити групи користувачів",
        "rcfilters-invalid-filter": "Недійсний фільтр",
        "rcfilters-empty-filter": "Без фільтрів. Показано всі зміни.",
        "rcfilters-filterlist-title": "Фільтри",
+       "rcfilters-filterlist-whatsthis": "Що це?",
        "rcfilters-filterlist-feedbacklink": "Надайте відгук про нові (бета) фільтри",
        "rcfilters-highlightbutton-title": "Виділити результати",
        "rcfilters-highlightmenu-title": "Вибрати колір",
        "rcfilters-highlightmenu-help": "Вибрати колір, щоб виділити цю властивість",
        "rcfilters-filterlist-noresults": "Фільтри не знайдено",
+       "rcfilters-noresults-conflict": "Результатів не знайдено через конфлікт у пошукових критеріях",
+       "rcfilters-state-message-subset": "Цей фільтр не має впливу, оскільки його результати включені в результати {{PLURAL:$2|цього, ширшого, фільтра|цих, ширших, фільтрів}} (спробуйте увімкнути виділення, щоб вирізнити їх): $1",
+       "rcfilters-state-message-fullcoverage": "Вибір усіх фільтрів у групі — це все одно, що не вибирати жодного з них, тобто таке фільтрування не має впливу. Гупа містить: $1",
        "rcfilters-filtergroup-registration": "Реєстрація користувача",
        "rcfilters-filter-registered-label": "Зареєстровані",
        "rcfilters-filter-registered-description": "Користувачі, що увійшли в систему.",
        "rcfilters-filter-unregistered-label": "Незареєстровані",
        "rcfilters-filter-unregistered-description": "Користувачі, які не ввійшли в систему.",
-       "rcfilters-filter-unregistered-conflicts-user-experience-level": "ФÑ\96лÑ\8cÑ\82Ñ\80 Â«Ð\9dезаÑ\80еÑ\94Ñ\81Ñ\82Ñ\80ованÑ\96» Ð½ÐµÐ°ÐºÑ\82ивний, Ð¾Ñ\81кÑ\96лÑ\8cки Ð¹Ð¾Ð³Ð¾ Ð²Ð¿Ð»Ð¸Ð² Ð½Ñ\96велÑ\8eÑ\94Ñ\82Ñ\8cÑ\81Ñ\8f {{PLURAL:$2|таким фільтром|такими фільтрами}} досвіду, {{PLURAL:$2|який знаходить|які знаходять}} лише зареєстрованих користувачів: $1",
+       "rcfilters-filter-unregistered-conflicts-user-experience-level": "Цей Ñ\84Ñ\96лÑ\8cÑ\82Ñ\80 ÐºÐ¾Ð½Ñ\84лÑ\96кÑ\82Ñ\83Ñ\94 Ð· {{PLURAL:$2|таким фільтром|такими фільтрами}} досвіду, {{PLURAL:$2|який знаходить|які знаходять}} лише зареєстрованих користувачів: $1",
        "rcfilters-filtergroup-authorship": "Авторство редагувань",
        "rcfilters-filter-editsbyself-label": "Ваші власні редагування",
        "rcfilters-filter-editsbyself-description": "Редагування, зроблені Вами.",
        "rcfilters-filter-editsbyother-label": "Редагування, зроблені іншими",
        "rcfilters-filter-editsbyother-description": "Редагування, виконані іншими користувачами (не Вами).",
        "rcfilters-filtergroup-userExpLevel": "Рівень досвіду (тільки для зареєстрованих користувачів)",
-       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "Цей Ñ\84Ñ\96лÑ\8cÑ\82Ñ\80 Ð½ÐµÐ°ÐºÑ\82ивний, Ð¾Ñ\81кÑ\96лÑ\8cки Ð²Ñ\96н Ð·Ð½Ð°Ñ\85одиÑ\82Ñ\8c Ð»Ð¸Ñ\88е Ð·Ð°Ñ\80еÑ\94Ñ\81Ñ\82Ñ\80ованиÑ\85 ÐºÐ¾Ñ\80иÑ\81Ñ\82Ñ\83ваÑ\87Ñ\96в, Ñ\82ож Ñ\84Ñ\96лÑ\8cÑ\82Ñ\80 Â«Ð\9dезаÑ\80еÑ\94Ñ\81Ñ\82Ñ\80ованÑ\96» Ð½Ñ\96велÑ\8eÑ\94 Ð¹Ð¾Ð³Ð¾ Ð²Ð¿Ð»Ð¸Ð².",
-       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "ФÑ\96лÑ\8cÑ\82Ñ\80 Â«Ð\9dезаÑ\80еÑ\94Ñ\81Ñ\82Ñ\80ованÑ\96» Ð¿ÐµÑ\80ебÑ\83ваÑ\94 Ð² ÐºÐ¾Ð½Ñ\84лÑ\96кÑ\82Ñ\96 Ð· Ð¾Ð´Ð½Ð¸Ð¼ Ð°Ð±Ð¾ Ð±Ñ\96лÑ\8cÑ\88е Ñ\84Ñ\96лÑ\8cÑ\82Ñ\80Ñ\96в Ð´Ð¾Ñ\81вÑ\96дÑ\83. Ð¤Ñ\96лÑ\8cÑ\82Ñ\80и Ð´Ð¾Ñ\81вÑ\96дÑ\83 Ð·Ð½Ð°Ñ\85одÑ\8fÑ\82Ñ\8c Ð»Ð¸Ñ\88е Ð·Ð°Ñ\80еÑ\94Ñ\81Ñ\82Ñ\80ованиÑ\85 ÐºÐ¾Ñ\80иÑ\81Ñ\82Ñ\83ваÑ\87Ñ\96в. Ð\9aонÑ\84лÑ\96кÑ\82нÑ\96 Ñ\84Ñ\96лÑ\8cÑ\82Ñ\80и Ð¿Ð¾Ð·Ð½Ð°Ñ\87енÑ\96 Ð²Ð¸Ñ\89е Ñ\8fк Ð½ÐµÐ°ÐºÑ\82ивнÑ\96.",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "ФÑ\96лÑ\8cÑ\82Ñ\80и Ð´Ð¾Ñ\81вÑ\96дÑ\83 Ð·Ð½Ð°Ñ\85одÑ\8fÑ\82Ñ\8c Ð»Ð¸Ñ\88е Ð·Ð°Ñ\80еÑ\94Ñ\81Ñ\82Ñ\80ованиÑ\85 ÐºÐ¾Ñ\80иÑ\81Ñ\82Ñ\83ваÑ\87Ñ\96в, Ñ\82ож Ñ\86ей Ñ\84Ñ\96лÑ\8cÑ\82Ñ\80 ÐºÐ¾Ð½Ñ\84лÑ\96кÑ\82Ñ\83Ñ\94 Ð· Ñ\84Ñ\96лÑ\8cÑ\82Ñ\80ом Â«Ð\9dезаÑ\80еÑ\94Ñ\81Ñ\82Ñ\80ованÑ\96».",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "ФÑ\96лÑ\8cÑ\82Ñ\80 Â«Ð\9dезаÑ\80еÑ\94Ñ\81Ñ\82Ñ\80ованÑ\96» ÐºÐ¾Ð½Ñ\84лÑ\96кÑ\82Ñ\83Ñ\94 Ð· Ð¾Ð´Ð½Ð¸Ð¼ Ð°Ð±Ð¾ Ð±Ñ\96лÑ\8cÑ\88е Ñ\84Ñ\96лÑ\8cÑ\82Ñ\80ами Ð´Ð¾Ñ\81вÑ\96дÑ\83, Ñ\8fкÑ\96 Ð·Ð½Ð°Ñ\85одÑ\8fÑ\82Ñ\8c Ð»Ð¸Ñ\88е Ð·Ð°Ñ\80еÑ\94Ñ\81Ñ\82Ñ\80ованиÑ\85 ÐºÐ¾Ñ\80иÑ\81Ñ\82Ñ\83ваÑ\87Ñ\96в. Ð\9aонÑ\84лÑ\96кÑ\82нÑ\96 Ñ\84Ñ\96лÑ\8cÑ\82Ñ\80и Ð¿Ð¾Ð·Ð½Ð°Ñ\87енÑ\96 Ð²Ð¸Ñ\89е Ð² Ð´Ñ\96лÑ\8fнÑ\86Ñ\96 Ð°ÐºÑ\82ивниÑ\85 Ñ\84Ñ\96лÑ\8cÑ\82Ñ\80Ñ\96в.",
        "rcfilters-filter-user-experience-level-newcomer-label": "Новачки",
        "rcfilters-filter-user-experience-level-newcomer-description": "Менше ніж 10 редагувань і 4 дні активності.",
        "rcfilters-filter-user-experience-level-learner-label": "Учні",
        "rcfilters-filter-categorization-description": "Записи про додавання або вилучення сторінок з категорій.",
        "rcfilters-filter-logactions-label": "Журнальні дії",
        "rcfilters-filter-logactions-description": "Адміністративні дії, створення облікових записів, видалення сторінок, завантаження файлів тощо.",
+       "rcfilters-hideminor-conflicts-typeofchange-global": "Фільтр «Незначні редагування» конфліктує з одним або більше фільтрів за типом змін, оскільки певні типи змін не можна позначити як «незначні». Конфліктні фільтри позначені в ділянці активних фільтрів угорі.",
+       "rcfilters-hideminor-conflicts-typeofchange": "Певні типи змін не можна позначити як «незначні», тож цей фільтр конфліктує з такими фільтрами за типом змін: $1",
+       "rcfilters-typeofchange-conflicts-hideminor": "Цей фільтр за типом змін конфліктує з фільтром «Незначні редагування». Певні типи змін не можна позначати як «незначні».",
        "rcnotefrom": "Нижче знаходяться {{PLURAL:$5|редагування}} з <strong>$3, $4</strong> (відображено до <strong>$1</strong>).",
        "rclistfrom": "Показати редагування починаючи з $3 $2.",
        "rcshowhideminor": "$1 незначні редагування",
        "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> після показу всіх шаблонів, тому деякі з них не були показані повністю.",
-       "post-expand-template-argument-category-desc": "Сторінка стане більшою за <code>$wgMaxArticleSize</code> після розкриття аргументу шаблона (що-небудь в потрійних фігурних дужках, наприклад, <code>{{{Foo}}})</code>).",
+       "post-expand-template-argument-category-desc": "Сторінка стане більшою за <code>$wgMaxArticleSize</code> після розкриття аргументу шаблону (щось у потрійних фігурних дужках, наприклад, <code>{{{Foo}}}</code>).",
        "expensive-parserfunction-category-desc": "На сторінці також використовується занадто багато ресурсомістких функцій (таких, як <code>#ifexist</code>). Детальніше - на сторінці [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
        "broken-file-category-desc": "Сторінка містить некоректне файлове посилання (посилання на неіснуючий файл).",
        "hidden-category-category-desc": "Ця категорія містить мітку <code><nowiki>__HIDDENCAT__</nowiki></code> у вмісті сторінки, що типово запобігає її відображенню на сторінках в розділі категорій.",
        "undeleteviewlink": "переглянути",
        "undeleteinvert": "Інвертувати виділення",
        "undeletecomment": "Причина:",
-       "undeletedrevisions": "$1 {{PLURAL:$1|редагування|редагування|редагувань}} відновлено",
-       "undeletedrevisions-files": "$1 {{PLURAL:$1|версія|версії|версій}} та $2 {{PLURAL:$2|файл|файли|файлів}} відновлено",
-       "undeletedfiles": "$1 {{PLURAL:$1|файл|файли|файлів}} відновлено",
        "cannotundelete": "Частина або вся процедура відновлення зазнала невдачі:\n$1",
        "undeletedpage": "'''Сторінка «$1» відновлена'''\n\nДив. [[Special:Log/delete|список вилучень]], щоб дізнатися про останні вилучення та відновлення.",
        "undelete-header": "Список нещодавно вилучених сторінок можна переглянути в [[Special:Log/delete|журналі вилучень]].",
        "newimages-summary": "Ця спеціальна сторінка показує останні завантажені файли.",
        "newimages-legend": "Фільтр",
        "newimages-label": "Назва файлу (або її частина):",
+       "newimages-user": "IP-адреса або ім'я користувача.",
        "newimages-showbots": "Показати завантаження ботами",
        "newimages-hidepatrolled": "Приховати відпатрульовані завантаження",
        "noimages": "Файли відсутні.",
        "restrictionsfield-label": "Дозволені діапазони IP-адрес:",
        "restrictionsfield-help": "Одна IP-адреса або CIDR-діапазон на рядок. Щоб увімкнути все, використайте:<pre>0.0.0.0/0\n::/0</pre>",
        "revid": "версія $1",
-       "pageid": "ID сторінки $1"
+       "pageid": "ID сторінки $1",
+       "rawhtml-notallowed": "Теги &lt;html&gt; не можна використовувати за межами звичайних сторінок."
 }
index ca65ea9..5bc1cbe 100644 (file)
@@ -34,7 +34,8 @@
                        "Quenhitran",
                        "Matma Rex",
                        "Xð",
-                       "Nguyên Lê"
+                       "Nguyên Lê",
+                       "Asmen"
                ]
        },
        "tog-underline": "Gạch chân liên kết:",
        "login": "Đăng nhập",
        "login-security": "Xác minh danh tính của bạn",
        "nav-login-createaccount": "Đăng nhập / Mở tài khoản",
-       "userlogin": "Đăng nhập / Mở tài khoản",
-       "userloginnocreate": "Đăng nhập",
        "logout": "Đăng xuất",
        "userlogout": "Đăng xuất",
        "notloggedin": "Chưa đăng nhập",
        "userlogin-noaccount": "Bạn chưa có tài khoản?",
        "userlogin-joinproject": "Tham gia {{SITENAME}}",
-       "nologin": "Bạn chưa có tài khoản ở đây? '''$1'''.",
-       "nologinlink": "Mở tài khoản mới",
        "createaccount": "Mở tài khoản",
-       "gotaccount": "Đã mở tài khoản rồi? '''$1'''.",
-       "gotaccountlink": "Đăng nhập",
-       "userlogin-resetlink": "Quên mất thông tin đăng nhập?",
        "userlogin-resetpassword-link": "Quên mật khẩu?",
        "userlogin-helplink2": "Trợ giúp đăng nhập",
        "userlogin-loggedin": "Bạn đã đăng nhập với tên {{GENDER:$1}}$1.\nHãy sử dụng biểu mẫu ở dưới để đăng nhập với tài khoản người dùng khác.",
        "createaccountmail": "Sử dụng mật khẩu ngẫu nhiên tạm và gửi nó cho địa chỉ thư điện tử được chỉ định",
        "createaccountmail-help": "Có thể sử dụng để tạo tài khoản cho người khác mà không được biết mật khẩu.",
        "createacct-realname": "Tên thật (tùy chọn)",
-       "createaccountreason": "Lý do:",
        "createacct-reason": "Lý do",
        "createacct-reason-ph": "Nhập lý do tạo một tài khoản khác",
        "createacct-reason-help": "Thông điệp xuất hiện trong nhật trình tạo tài khoản",
        "rcfilters-filter-editsbyother-label": "Người khác",
        "rcfilters-filter-editsbyother-description": "Các sửa đổi của người khác.",
        "rcfilters-filtergroup-userExpLevel": "Trình độ (chỉ người dùng đã đăng ký)",
-       "rcfilters-filter-userExpLevel-newcomer-label": "Người mới đến",
-       "rcfilters-filter-userExpLevel-newcomer-description": "Chưa tới 10 sửa đổi và 4 ngày hoạt động.",
-       "rcfilters-filter-userExpLevel-learner-label": "Người đang tập",
-       "rcfilters-filter-userExpLevel-learner-description": "Nhiều ngày hoạt động và sửa đổi hơn “Người mới đến” mà ít hơn “Người có kinh nghiệm”.",
-       "rcfilters-filter-userExpLevel-experienced-label": "Người có kinh nghiệm",
-       "rcfilters-filter-userExpLevel-experienced-description": "Hơn 30 ngày hoạt động và 500 sửa đổi.",
+       "rcfilters-filter-user-experience-level-newcomer-label": "Người mới đến",
+       "rcfilters-filter-user-experience-level-newcomer-description": "Chưa tới 10 sửa đổi và 4 ngày hoạt động.",
+       "rcfilters-filter-user-experience-level-learner-label": "Người đang tập",
+       "rcfilters-filter-user-experience-level-learner-description": "Nhiều ngày hoạt động và sửa đổi hơn “Người mới đến” mà ít hơn “Người có kinh nghiệm”.",
+       "rcfilters-filter-user-experience-level-experienced-label": "Người có kinh nghiệm",
+       "rcfilters-filter-user-experience-level-experienced-description": "Hơn 30 ngày hoạt động và 500 sửa đổi.",
        "rcfilters-filtergroup-automated": "Đóng góp tự động",
        "rcfilters-filter-bots-label": "Bot",
        "rcfilters-filter-bots-description": "Các sửa đổi của công cụ tự động.",
        "undeleteviewlink": "xem",
        "undeleteinvert": "Đảo sự lựa chọn",
        "undeletecomment": "Lý do:",
-       "undeletedrevisions": "$1 phiên bản được phục hồi",
-       "undeletedrevisions-files": "$1 phiên bản và $2 tập tin đã được phục hồi",
-       "undeletedfiles": "$1 tập tin đã được phục hồi",
        "cannotundelete": "Phục hồi bị thất bại một phần hoặc hoàn toàn:\n$1",
        "undeletedpage": "'''$1 đã được khôi phục'''\n\nXem nhật trình xóa và phục hồi các trang gần đây tại [[Special:Log/delete|nhật trình xóa]].",
        "undelete-header": "Xem các trang bị xóa gần đây tại [[Special:Log/delete|nhật trình xóa]].",
        "logentry-tag-update-revision": "$1 {{GENDER:$2}}đã cập nhật thẻ của phiên bản $4 của trang $3 ({{PLURAL:$7}}đã thêm $6; {{PLURAL:$9}}loại bỏ $8)",
        "logentry-tag-update-logentry": "$1 {{GENDER:$2}}đã cập nhật thẻ của mục nhật trình $5 của trang $3 ({{PLURAL:$7}}đã thêm $6; {{PLURAL:$9}}loại bỏ $8)",
        "rightsnone": "(không có)",
-       "revdelete-summary": "tóm lược sửa đổi",
        "rightslogentry-temporary-group": "$1 (tạm thời cho đến $2)",
        "feedback-adding": "Đang thêm thông tin phản hồi vào trang…",
        "feedback-back": "Lùi",
index de1dd5f..0d7e00a 100644 (file)
        "yourdomainname": "Vosse dominne",
        "login": "S' elodjî",
        "nav-login-createaccount": "Ahiver on conte, udon-bén s' elodjî",
-       "userlogin": "S' elodjî",
-       "userloginnocreate": "S' elodjî",
        "logout": "Si dislodjî",
        "userlogout": "Si dislodjî",
        "notloggedin": "Nén elodjî",
        "userlogin-joinproject": "S' edjîstrer so {{SITENAME}}",
-       "nologin": "Vos n' avoz nén d' conte so ç' wiki ci? $1.",
-       "nologinlink": "Ahivez on conte da vosse",
        "createaccount": "Ahiver on novea conte",
-       "gotaccount": "Vos avoz ddja on conte so ç' wiki ci? '''$1'''.",
-       "gotaccountlink": "Elodjîz vs",
-       "userlogin-resetlink": "Avoz rovyî les pondants et djondants po s' elodjî?",
        "createaccountmail": "Eployî on scret timporaire a l' astcheyance eyet l' evoyî so l' emile diné",
        "createacct-realname": "Vraiy no (opcionel)",
-       "createaccountreason": "Råjhon:",
        "createacct-reason": "Råjhon",
        "createacct-another-submit": "Ahiver èn ôte conte",
        "createacct-benefit-body1": "{{PLURAL:$1|candjmint|candjmints}}",
        "passwordreset-disabled": "Li rfijhaedje di screts a stî dismetou so ç' wiki ci.",
        "passwordreset-username": "No d' elodjaedje:",
        "passwordreset-domain": "Dominne:",
-       "passwordreset-capture": "Vey li messaedje di l' emile?",
-       "passwordreset-capture-help": "Si vos clitchîz cisse boesse ci, l' emile (eyet li scret timporaire) vos srè håyné e minme tins k' il est emilé.",
        "passwordreset-email": "Adresse emile:",
        "passwordreset-emailtitle": "Detays do contre so {{SITENAME}}",
        "changeemail": "Candjî ou disfacer l' adresse emile",
        "watchthis": "Shuve cist årtike",
        "savearticle": "Schaper l' pådje",
        "savechanges": "Schaper l' pådje",
+       "publishpage": "Schaper l' pådje",
+       "publishchanges": "Schaper les candjmints",
        "preview": "Vey divant",
        "showpreview": "Vey divant",
        "showdiff": "Vey les candjmints",
        "saveprefs": "Schaper les preferinces",
        "restoreprefs": "Rimete totes les prémetowès valixhances",
        "prefs-editing": "Boesse di tecse",
-       "rows": "Royes",
-       "columns": "Colones",
        "searchresultshead": "Håynaedje des rzultats di cweraedje",
        "stub-threshold": "Limite pol formataedje des loyéns djermons ($1):",
        "stub-threshold-sample-link": "egzimpe",
        "userrights-reason": "Råjhon:",
        "userrights-no-interwiki": "Vos n' avoz nén les permissions po candjî les droets des uzeus so ds ôtes wikis.",
        "userrights-nodatabase": "Li båze di dnêyes «$1» n' egzistêye nén ou n' est nén locåle.",
-       "userrights-nologin": "Vos vs divoz [[Special:UserLogin|elodjî]] avou on conte manaedjeu por vos pleur candjî les droets des uzeus.",
-       "userrights-notallowed": "Li conte da vosse n' pout nén radjouter ou rsaetchî des droets des uzeus.",
        "userrights-changeable-col": "Groupes ki vos ploz candjî",
        "userrights-unchangeable-col": "Groupes ki vos n' poloz nén candjî",
        "group": "Groupe:",
        "feedback-submit": "Evoyî",
        "searchsuggest-search": "Cweri",
        "searchsuggest-containing": "ki contént...",
-       "api-error-badaccess-groups": "Vos n' avoz nén l' droet d' eberweter des fitchîs so ç' wiki cial",
-       "api-error-copyuploaddisabled": "Les eberwetaedjes pa URL ni vont nén so ç' sierveu cial.",
-       "api-error-duplicate": "N a ddja {{PLURAL:$1|èn ôte fitchî|des ôtes fitchîs}} avou l' minme contnou so nosse waibe",
-       "api-error-duplicate-archive": "N aveut ddja {{PLURAL:$1|èn ôte fitchî|des ôtes fitchîs}} avou l' minme contnou so nosse waibe, mins {{PLURAL:$1|il a stî rsaetchî|il ont stî rsaetchîs}}.",
-       "api-error-empty-file": "Vosse fitchî est vude.",
        "api-error-emptypage": "C' est nén permetou d' ahiver ene novele pådje et l' leyî vude.",
-       "api-error-fetchfileerror": "Aroke divintrinne : ene sacwè a fwait berwete cwand on-z a volou rawè vosse fitchî",
-       "api-error-file-too-large": "Vosse fitchî est trop pezant",
-       "api-error-filename-tooshort": "Li no do fitchî est trop court",
-       "api-error-filetype-banned": "On n' pout nén eberweter des sfwaits fitchîs",
-       "api-error-filetype-missing": "I manke li cawete do fitchî",
-       "api-error-hookaborted": "Li candjmint ki vos vlîz fé a stî espaitchî pa on module di rawete.",
-       "api-error-http": "Aroke divintrinne : nou raloyaedje å sierveu",
-       "api-error-illegal-filename": "On n' pout nén prinde ci no la pol fitchî",
-       "api-error-internal-error": "Aroke divintrinne : gn a ene sacwè k' a må stî tins d' l' eredjistrumint d' vost eberwetêye",
-       "api-error-invalid-file-key": "Aroke divintrinne : Li fitchî n' a nén stî rtrové dins l' eredjistrumint provizwere",
-       "api-error-missingparam": "Aroke divintrinne : i manke des dnêyes dins vosse dimande",
-       "api-error-missingresult": "Aroke divintrinne : on n' såreut dire si l' fitchî a bén passé",
-       "api-error-mustbeloggedin": "Vos dvoz esse elodjî (eye) po-z aberweter des fitchîs",
-       "api-error-mustbeposted": "Aroke divintrinne : li programe n' eploye nén li boune hårdêye HTTP",
-       "api-error-noimageinfo": "L' eberwetaedje a bén stî, mins l' sierveu n' a pont dné d' racsegnes sol fitchî",
-       "api-error-nomodule": "Aroke divintrinne : pont d' voye d' eberwetaedje tchoezeye",
-       "api-error-ok-but-empty": "Aroke divintrinne : li sierveu n' respond nén",
-       "api-error-overwrite": "Vos n' ploz nén spotchî on fitchî k' egzistêye dedja",
        "api-error-stashfailed": "Aroke divintrinne : li sierveu a pierdou les dnêyes provizweres",
-       "api-error-timeout": "Li sierveu n' a nén respondou dins les tins",
-       "api-error-unclassified": "Aroke nén cnoxhowe",
-       "api-error-unknown-code": "Aroke nén cnoxhowe: «$1».",
-       "api-error-unknown-error": "Aroke divintrinne : gn a ene sacwè ki n' a nén stî tins d' l' eberwetaedje",
        "api-error-unknown-warning": "Adviertixhmint nén cnoxhou: «$1».",
        "api-error-unknownerror": "Aroke nén cnoxhowe: «$1».",
-       "api-error-uploaddisabled": "L' eberwetaedje ni va nén so ç' wiki cial",
-       "api-error-verification-error": "Ci fitchî la est cron, oudon-bén si cawete n' est nén boune",
        "duration-seconds": "$1 segonde{{PLURAL:$1||s}}",
        "duration-minutes": "$1 munute{{PLURAL:$1||s}}",
        "duration-hours": "$1 eure{{PLURAL:$1||s}}",
index b4fd680..e8d2ac7 100644 (file)
        "login": "אַרײַנלאָגירן",
        "login-security": "וועריפיצירט אייער אידענטיטעט",
        "nav-login-createaccount": "ארײַנלאָגירן / זיך אײַנשרײַבן",
-       "userlogin": "ארײַנלאָגירן / זיך אײַנשרײַבן",
-       "userloginnocreate": "אַרײַנלאגירן",
        "logout": "אַרױסלאָגירן",
        "userlogout": "אַרױסלאָגירן",
        "notloggedin": "נישט איינגעשריבן",
        "userlogin-noaccount": "איר האט נישט קיין קאנטע?",
        "userlogin-joinproject": "איינטרעטן ביי {{SITENAME}}",
-       "nologin": "איר האט נישט קיין קאנטע? '''$1'''.",
-       "nologinlink": "שאַפֿן אַ קאנטע",
        "createaccount": "שאַפֿן אַ נײַע קאנטע",
-       "gotaccount": "האסטו שוין א קאנטע? '''$1'''.",
-       "gotaccountlink": "אַרײַנלאגירן",
-       "userlogin-resetlink": "פארגעסן אײַערע אַרײַנלאָגירן פרטים?",
        "userlogin-resetpassword-link": "פֿאַרגעסן אײַער פאַסווארט?",
        "userlogin-helplink2": "הילף מיט ארײַנלאגירן",
        "userlogin-loggedin": "איר זענט שוין אריינלאגירט ווי {{GENDER:$1|$1}}.\nניצט די פארעם אונטן כדי אריינלאגירן ווי אן אנדער באניצער.",
        "createaccountmail": "ניצן א פראוויזאריש פאסווארט און שיקן צום געצייכנטן ע-פאסט אדרעס",
        "createaccountmail-help": "קען ווערן באניצט צו שאפֿן קאנטע פֿאר א צווייטן אן צו דערגיין דאס פאסווארט.",
        "createacct-realname": "עכטער נאמען (אפציאנאל)",
-       "createaccountreason": "אורזאַך:",
        "createacct-reason": "אורזאך",
        "createacct-reason-ph": "פֿארוואס שאפֿט איר נאך א קאנטע",
        "createacct-reason-help": "מעלדונג געוויזן אין קאנטע־שאפֿונג לאגבוך",
        "unusedimages": "נישט געניצטע טעקעס",
        "wantedcategories": "געזוכטע קאטעגאריעס",
        "wantedpages": "געזוכטע בלעטער",
+       "wantedpages-summary": "ליסטע פֿון נישט־פֿאראנע בלעטער מיט די מערסטע לינקען צו זיי, אויסשליסנדיק בלעטער וואס האבן נאר ווייטערפֿירונגען צו זיי. פֿאר א ליסטע פון נישט־פֿאראנע בלעטער מיט ווייטערפֿירונגען צו זיי, זעט [[{{#special:BrokenRedirects}}|די ליסטע פון צעבראכענע ווייטערפֿירונגען]].",
        "wantedpages-badtitle": "אומגילטיקער טיטל אין רעזולטאַט: $1",
        "wantedfiles": "געזוכטע טעקעס",
        "wantedfiletext-cat": "די פֿאלגנדע טעקעס ווערן געניצט אבער זיי עקזיסטירן נישט. טעקעס פון פֿרעמדע רעפאזיטאריעס קענען ווערן אריינגערעכנט טראץ זיי עקזיסטירן יא. אזעלכע גרייזן וועלן ווערן <del>אויסגעשריכן </del>. דערצו, בלעטער וואס ניצן אומעקזיסטירנדע טעקעס ווערן אריינגערעכנט אין [[:$1]].",
        "logentry-rights-autopromote": "$1 אויטאמאטיש  {{GENDER:$2|פראמאווירט}} פון $4 צו $5",
        "logentry-upload-upload": "$1 {{GENDER:$2|האט ארויפגעלאדן}} $3",
        "rightsnone": "(גארנישט)",
-       "revdelete-summary": "רעדאקטירונג קיצור",
        "feedback-adding": "צולייגן פֿידבעק צו בלאַט...",
        "feedback-bugcheck": "געוואלדיק! אבער זייט בודק אז עס איז נישט איינער פון די [$1 באוואוסטע באגן].",
        "feedback-bugnew": "כ'האב בודק געווען. רעפארטירט א נייעם באג.",
index 6486ad3..031e9d5 100644 (file)
        "changepassword-throttled": "你已經試咗太多次簽到動作。\n請等$1再試過。",
        "botpasswords": "機械人密碼",
        "botpasswords-disabled": "唔俾用機械人密碼。",
+       "botpasswords-existing": "而家已經有嘅機械人密碼",
+       "botpasswords-createnew": "整一個新嘅機械人密碼",
        "botpasswords-label-create": "創造",
        "botpasswords-label-update": "上載",
        "botpasswords-label-cancel": "取消",
        "prefs-help-prefershttps": "呢項喜好設定會喺你下次簽到先至開始生效。",
        "prefswarning-warning": "你改嘅喜好設定改動重未記低。\n如果你未撳「$1」就走咗,你嘅喜好設定唔會有更新。",
        "prefs-tabs-navigation-hint": "貼士:可以用鍵盤嘅←或→掣睇一覽內嘅分頁",
-       "userrights": "用戶權限管理",
-       "userrights-lookup-user": "管理用戶組",
+       "userrights": "用戶嘅權限",
+       "userrights-lookup-user": "揀一個用戶",
        "userrights-user-editname": "輸入一個用戶名:",
        "editusergroup": "編輯用戶組",
        "editinguser": "改緊<strong>[[User:$1|$1]]</strong>嘅用戶權限 $2",
        "userrights-expiry": "到期:",
        "userrights-expiry-existing": "現時到期嘅時間: $2 $3",
        "userrights-expiry-othertime": "其它時間:",
+       "userrights-invalid-expiry": "組\"$1\"嘅過期時間冇效",
        "userrights-conflict": "用戶權限更改有衝突!請再睇過同確認你嘅改動。",
        "group": "組:",
        "group-user": "用戶",
        "undeleteviewlink": "睇",
        "undeleteinvert": "反選",
        "undeletecomment": "原因:",
-       "undeletedrevisions": "$1個修訂已經救返",
-       "undeletedrevisions-files": "$1個修訂同$2個檔案已經救返",
-       "undeletedfiles": "$1個檔案已經救返",
        "cannotundelete": "救唔到:\n$1",
        "undeletedpage": "'''$1已經成功救返'''\n\n最近嘅刪除同恢復記錄請睇[[Special:Log/delete]]。",
        "undelete-header": "睇吓[[Special:Log/delete|刪除日誌]]去睇之前刪除嘅頁頁。",
index d6eed0a..05f1a62 100644 (file)
        "post-expand-template-argument-warning": "<strong>警告:</strong>本页面包含至少一个展开后过大的模板参数。这些参数会被忽略。",
        "post-expand-template-argument-category": "含有略过模板参数的页面",
        "parser-template-loop-warning": "检查到模板循环:[[$1]]",
+       "template-loop-category": "有模板循环的页面",
+       "template-loop-category-desc": "页面存在模板循环,就是递归进行自我调用的模板。",
        "parser-template-recursion-depth-warning": "模板递归深度越限($1)",
        "language-converter-depth-warning": "字词转换器深度越限($1)",
        "node-count-exceeded-category": "页面的节点数超出限制",
        "page_first": "首页",
        "page_last": "末页",
        "histlegend": "差异选择:选中要对比的版本的单选按钮,按Enter键或下方的按钮。<br />说明:<strong>({{int:cur}})</strong>=与最后版本之间的差异,<strong>({{int:last}})</strong>=与上一版本之间的差异,<strong>{{int:minoreditletter}}</strong>=小编辑。",
-       "history-fieldset-title": "æµ\8fè§\88å\8e\86å\8f²",
+       "history-fieldset-title": "æ\90\9c索修订ç\89\88æ\9c¬",
        "history-show-deleted": "仅限修订版本删除",
        "histfirst": "最旧",
        "histlast": "最新",
        "saveusergroups": "保存{{GENDER:$1|用户}}组",
        "userrights-groupsmember": "用户组:",
        "userrights-groupsmember-auto": "自动用户组:",
-       "userrights-groups-help": "您可以更改该用户的用户组:\n* 选中的选项框表示该用户属于该用户组。\n* 未选中的选项框表示该用户不属于该用户组。\n* 星号(*)表示一旦您被添加至该用户组后,您不能亲自移除其权限,反之亦然。\n* 井号(#)表示您只可以推迟该用户组的过期时间;您不能将其提前。",
+       "userrights-groups-help": "您可以更改该用户的用户组:\n* 选中的选项框表示该用户属于该用户组。\n* 未选中的选项框表示该用户不属于该用户组。\n* 星号(*)表示一旦您被添加至该用户组后,您不能亲自移除其权限,反之亦然。\n* 井号(#)表示您只可以推迟该用户组成员的过期时间;您不能将其提前。",
        "userrights-reason": "原因:",
        "userrights-no-interwiki": "您并没有权限去编辑在其它wiki上的用户权限。",
        "userrights-nodatabase": "数据库$1不存在或并非为本地的。",
        "userrights-expiry-options": "1天:1 day,1周:1 week,1个月:1 month,3个月:3 months,6个月:6 months,1年:1 year",
        "userrights-invalid-expiry": "组“$1”的终止时间无效。",
        "userrights-expiry-in-past": "组“$1”的终止时间是在过去。",
-       "userrights-cannot-shorten-expiry": "您不能将用户组“$1”的过期时间提前。只有拥有添加或移除该组权限的用户可以将其提前。",
+       "userrights-cannot-shorten-expiry": "您不能将用户组“$1”成员的过期时间提前。只有拥有添加或移除该组权限的用户可以将其提前。",
        "userrights-conflict": "用户权限的更改存在冲突!请检查并确认您的更改。",
        "group": "用户组:",
        "group-user": "用户",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}}(见[[Special:NewPages|新页面列表]])",
        "recentchanges-legend-plusminus": "(<em>±123</em>)",
        "recentchanges-submit": "显示",
-       "rcfilters-activefilters": "æ´»è·\83的过滤器",
+       "rcfilters-activefilters": "æ¿\80æ´»的过滤器",
        "rcfilters-restore-default-filters": "恢复默认过滤器",
        "rcfilters-clear-all-filters": "清空所有过滤器",
        "rcfilters-search-placeholder": "过滤器最近更改(浏览或开始输入)",
        "rcfilters-invalid-filter": "无效过滤器",
-       "rcfilters-empty-filter": "没æ\9c\89æ´»è·\83的过滤器。已显示所有贡献。",
+       "rcfilters-empty-filter": "没æ\9c\89æ¿\80æ´»的过滤器。已显示所有贡献。",
        "rcfilters-filterlist-title": "过滤器",
+       "rcfilters-filterlist-whatsthis": "这是什么?",
        "rcfilters-filterlist-feedbacklink": "在新(测试版)过滤器中提供反馈",
        "rcfilters-highlightbutton-title": "高亮结果",
        "rcfilters-highlightmenu-title": "选择颜色",
        "rcfilters-highlightmenu-help": "选择颜色来高亮该属性",
        "rcfilters-filterlist-noresults": "找不到过滤器",
+       "rcfilters-noresults-conflict": "找不到结果,因为搜索条件不一致",
+       "rcfilters-state-message-subset": "该过滤器没有影响,因为其结果已包含在以下影响更广的{{PLURAL:$2|过滤器}}中(尝试高亮来区别它):$1",
+       "rcfilters-state-message-fullcoverage": "组中选择的所有过滤器与选定过滤器相同,因此该过滤器没有影响。组包含:$1",
        "rcfilters-filtergroup-registration": "用户注册",
        "rcfilters-filter-registered-label": "已注册",
        "rcfilters-filter-registered-description": "登录编辑者。",
        "rcfilters-filter-unregistered-label": "未注册",
        "rcfilters-filter-unregistered-description": "未登录的编辑者。",
-       "rcfilters-filter-unregistered-conflicts-user-experience-level": "“未注册”过滤器未被激活,因为其影响已被以下体验{{PLURAL:$2|过滤器}}消除,而它只{{PLURAL:$2|找到}}注册用户:$1",
+       "rcfilters-filter-unregistered-conflicts-user-experience-level": "该过滤器与以下体验{{PLURAL:$2|过滤器}}相冲突,而它只{{PLURAL:$2|寻找}}注册用户:$1",
        "rcfilters-filtergroup-authorship": "编辑的作者",
        "rcfilters-filter-editsbyself-label": "您自己的编辑",
        "rcfilters-filter-editsbyself-description": "由您编辑。",
        "rcfilters-filter-editsbyother-label": "由其他人编辑",
        "rcfilters-filter-editsbyother-description": "由其他用户(而不是您)创建的编辑。",
        "rcfilters-filtergroup-userExpLevel": "体验水平(仅限注册用户)",
-       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "此过滤器未被激活,因为它只找到注册用户,而因此“未注册”过滤器正在消除其影响。",
-       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "“未注册”过滤器与一个或更多体验过滤器相冲突。体验过滤器只寻找注册用户。冲突过滤器已在上方标记为未激活。",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "体验过滤器只寻找注册用户,因此该过滤器与“未注册”过滤器相冲突。",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "“未注册”过滤器与一个或更多体验过滤器相冲突,而它只寻找注册用户。冲突过滤器已在上方激活过滤器区域中被标记。",
        "rcfilters-filter-user-experience-level-newcomer-label": "新手",
        "rcfilters-filter-user-experience-level-newcomer-description": "少于10次编辑和4天活跃。",
        "rcfilters-filter-user-experience-level-learner-label": "初学者",
        "rcfilters-filter-categorization-description": "从分类中添加或移除页面的记录。",
        "rcfilters-filter-logactions-label": "记录的操作",
        "rcfilters-filter-logactions-description": "管理操作、账户创建、页面删除、上传....",
+       "rcfilters-hideminor-conflicts-typeofchange-global": "“小编辑”过滤器与一个或多个更改类型过滤器冲突,因为其中某种更改类型不可指定为“小编辑”。冲突过滤器已在上方活跃过滤器中被标记。",
+       "rcfilters-hideminor-conflicts-typeofchange": "某种更改类型不可指定为“小编辑”,因此该过滤器与以下更改类型过滤器相冲突:$1",
+       "rcfilters-typeofchange-conflicts-hideminor": "这种更改类型过滤器与“小编辑”过滤器相冲突。某种更改类型不可指定为“小编辑”。",
        "rcnotefrom": "下面{{PLURAL:$5|是}}<strong>$3 $4</strong>之后的更改(最多显示<strong>$1</strong>个)。",
+       "rclistfromreset": "重置时间选择",
        "rclistfrom": "显示$3 $2之后的新更改",
        "rcshowhideminor": "$1小编辑",
        "rcshowhideminor-show": "显示",
        "php-uploaddisabledtext": "PHP文件上传停用。请检查file_uploads设置。",
        "uploadscripted": "该文件包含可能被网络浏览器错误解释的 HTML 或脚本代码。",
        "upload-scripted-pi-callback": "不能上传包含XML-stylesheet处理命令的文件。",
+       "upload-scripted-dtd": "不能上传包含非标准DTD声明的SVG文件。",
        "uploaded-script-svg": "在上传的SVG文件中找到可编写脚本的元素“$1”。",
        "uploaded-hostile-svg": "在上传的SVG文件中的样式元素中找到不安全CSS。",
        "uploaded-event-handler-on-svg": "在SVG文件中不允许设置event-handler属性<code>$1=\"$2\"</code>。",
        "undeleteviewlink": "查看",
        "undeleteinvert": "反向选择",
        "undeletecomment": "原因:",
-       "undeletedrevisions": "还原{{PLURAL:$1|$1个版本}}",
-       "undeletedrevisions-files": "还原{{PLURAL:$1|$1个版本}}和{{PLURAL:$2|$2个文件}}",
-       "undeletedfiles": "还原{{PLURAL:$1|$1个文件}}",
        "cannotundelete": "部分或全部还原删除失败:$1",
        "undeletedpage": "<strong>$1已经被还原</strong>\n\n最近的删除和还原记录请见[[Special:Log/delete|删除日志]]。",
        "undelete-header": "如要查询最近的记录请参阅[[Special:Log/delete|删除日志]]。",
        "newimages-summary": "本特殊页面展示最后上传的文件。",
        "newimages-legend": "过滤",
        "newimages-label": "文件名(或它的一部份):",
+       "newimages-user": "IP地址或用户名",
        "newimages-showbots": "显示机器人上传",
        "newimages-hidepatrolled": "隐藏已巡查的上传",
        "noimages": "无可查看文件。",
        "colon-separator": ":",
        "pipe-separator": "&#32;|&#32;",
        "word-separator": "",
+       "ellipsis": "…",
        "parentheses": "($1)",
        "quotation-marks": "“$1”",
        "imgmultipageprev": "← 上一页",
        "specialpages-group-spam": "反垃圾链接工具",
        "specialpages-group-developer": "开发者工具",
        "blankpage": "空白页面",
-       "intentionallyblankpage": "这个页面被故意留为空白",
+       "intentionallyblankpage": "此页特意留白。",
        "external_image_whitelist": " #请原样保留本行文字<pre>\n#请在下面输入正则表达式片段(//之间的部份)\n#这些项目将会匹配外部图像的URL\n#匹配的项目将显示为图像,否则只会显示图像的链接\n#以#开头的行被视为评论\n#不区分大小写\n\n#请在本行上面输入所有正则表达式片段。请原样保留本行文字</pre>",
        "tags": "有效的更改标签",
        "tag-filter": "[[Special:Tags|标签]]过滤器:",
        "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-restore": "$1{{GENDER:$2|还原}}页面$3($4)",
+       "logentry-delete-restore-nocount": "$1{{GENDER:$2|还原}}页面$3",
+       "restore-count-revisions": "{{PLURAL:$1|$1个修订版本}}",
+       "restore-count-files": "{{PLURAL:$1|$1个文件}}",
        "logentry-delete-event": "$1{{GENDER:$2|更改}}$3的{{PLURAL:$5|$5个日志事件}}的可见性:$4",
        "logentry-delete-revision": "$1{{GENDER:$2|更改}}页面$3的{{PLURAL:$5|$5个版本}}的可见性:$4",
        "logentry-delete-event-legacy": "$1{{GENDER:$2|更改}}$3的日志事件的可见性",
        "special-characters-group-thai": "泰语",
        "special-characters-group-lao": "老挝语",
        "special-characters-group-khmer": "高棉语字母",
+       "special-characters-group-canadianaboriginal": "加拿大原住民音节文字",
        "special-characters-title-endash": "短划线",
        "special-characters-title-emdash": "长划线",
        "special-characters-title-minus": "减号",
        "restrictionsfield-label": "允许的IP段:",
        "restrictionsfield-help": "每行一个IP地址或CIDR段。要启用任何地址或地址段,可使用:<pre>0.0.0.0/0\n::/0</pre>",
        "revid": "修订版本$1",
-       "pageid": "页面ID$1"
+       "pageid": "页面ID$1",
+       "rawhtml-notallowed": "&lt;html&gt;标签不能在一般页面以外使用。",
+       "gotointerwiki": "离开{{SITENAME}}",
+       "gotointerwiki-invalid": "指定的标题无效。",
+       "gotointerwiki-external": "您将要离开{{SITENAME}}来访问[[$2]],这是一个独立网站。\n\n[$1 点此继续访问$1]。",
+       "undelete-cantedit": "您不能还原该页面,因为您未被允许编辑该页面。",
+       "undelete-cantcreate": "您不能还原该页面,因为没有使用该页面名称的现有页面,并且您未被允许编辑该页面。"
 }
index 054042d..fc3ad95 100644 (file)
                        "Winstonyin",
                        "Wmr",
                        "烈羽",
-                       "和平奮鬥救地球"
+                       "和平奮鬥救地球",
+                       "Arthur2e5"
                ]
        },
        "tog-underline": "底線標示連結:",
-       "tog-hideminor": "隱藏近期變更中的修訂",
+       "tog-hideminor": "隱藏近期變更中的次要修訂",
        "tog-hidepatrolled": "隱藏近期變更中巡查過的編輯",
        "tog-newpageshidepatrolled": "隱藏新頁面清單中巡查過的頁面",
        "tog-hidecategorization": "隱藏頁面分類",
@@ -94,7 +95,7 @@
        "tog-usenewrc": "依近期變更與監視清單的頁面分類顯示變更",
        "tog-numberheadings": "標題自動編號",
        "tog-showtoolbar": "顯示編輯工具列",
-       "tog-editondblclick": "é\9b\99æ\93\8aæ»\91é¼ 編輯頁面",
+       "tog-editondblclick": "é»\9eé\81¸å\85©æ¬¡ä»¥編輯頁面",
        "tog-editsectiononrightclick": "開啟滑鼠右鍵點選章節標題編輯",
        "tog-watchcreations": "將我建立的頁面和上傳的檔案加入監視清單",
        "tog-watchdefault": "將我編輯的頁面和檔案加入監視清單",
        "tog-watchdeletion": "將我刪除的頁面和檔案加入監視清單",
        "tog-watchuploads": "加入我上傳的新檔案至我的監視清單",
        "tog-watchrollback": "將我曾經還原的頁面新增至監視清單",
-       "tog-minordefault": "預設標記所有的編輯為修訂",
+       "tog-minordefault": "預設標記所有的編輯為次要修訂",
        "tog-previewontop": "顯示預覽於編輯框上方",
        "tog-previewonfirst": "第一次編輯時顯示預覽",
        "tog-enotifwatchlistpages": "當我的監視清單中的頁面或檔案有變更時,傳送電子郵件通知我",
        "tog-enotifusertalkpages": "當我的對話頁面有變更時,傳送電子郵件通知我",
-       "tog-enotifminoredits": "當頁面與檔案有修訂時,傳送電子郵件通知我",
+       "tog-enotifminoredits": "當頁面與檔案有次要修訂時,傳送電子郵件通知我",
        "tog-enotifrevealaddr": "在通知郵件中顯示我的電子郵件地址",
        "tog-shownumberswatching": "顯示監視使用者數量",
        "tog-oldsig": "您現有的簽名:",
        "tog-forceeditsummary": "未填寫編輯摘要時提示我",
        "tog-watchlisthideown": "隱藏監視清單中我自己的編輯",
        "tog-watchlisthidebots": "隱藏監視清單中機器人的編輯",
-       "tog-watchlisthideminor": "隱藏監視清單中的修訂",
+       "tog-watchlisthideminor": "隱藏監視清單中的次要修訂",
        "tog-watchlisthideliu": "隱藏監視清單中已登入使用者的編輯",
        "tog-watchlistreloadautomatically": "查詢條件變更時自動重新讀取監視清單 (需要使用 JavaScript)",
        "tog-watchlisthideanons": "隱藏監視清單中匿名使用者的編輯",
        "tog-watchlisthidepatrolled": "隱藏監視清單中已巡查的編輯",
        "tog-watchlisthidecategorization": "隱藏頁面分類",
-       "tog-ccmeonemails": "我給他人寄出郵件時,也寄出一份副本到我的電子郵件信箱",
+       "tog-ccmeonemails": "我寄出郵件給其他使用者時,也寄給我一份副本",
        "tog-diffonly": "比對差異時下方不顯示頁面內容",
        "tog-showhiddencats": "顯示隱藏分類",
        "tog-norollbackdiff": "執行還原後略過差異比對",
        "period-am": "AM",
        "period-pm": "PM",
        "pagecategories": "{{PLURAL:$1|分類|$1 個分類}}",
-       "category_header": "分類「$1」中的頁面",
+       "category_header": "分類 \"$1\" 中的頁面",
        "subcategories": "子分類",
        "category-media-header": "分類 \"$1\" 中的媒體",
        "category-empty": "<em>此分類目前未包含頁面或媒體。</em>",
        "redirectpagesub": "重新導向頁面",
        "redirectto": "重新導向至:",
        "lastmodifiedat": "此頁面最後修改於 $1 $2。",
-       "viewcount": "此頁面已被檢è¦\96é\81\8e {{PLURAL:$1|$1 æ¬¡}}ã\80\82",
+       "viewcount": "此頁面已被å­\98å\8f\96é\81\8e {{PLURAL:$1|$1 æ¬¡}}ã\80\82",
        "protectedpage": "受保護頁面",
        "jumpto": "前往:",
        "jumptonavigation": "導覽",
        "viewsourcetext": "您可以檢視並複製此頁面的原始碼。",
        "viewyourtext": "您可以檢視並複製此頁面中<strong>您編輯</strong>的原始碼。",
        "protectedinterface": "本頁用來提供此 Wiki 軟體介面上的文字,並且已被設為保護以防止惡意修改。\n如欲增加或修改 Wiki 的翻譯,請至 [https://translatewiki.net/ translatewiki.net] 上的 MediaWiki 在地化專案。",
-       "editinginterface": "<strong>警告:</strong>您正在編輯的頁面文字是用來作為軟體介面使用。\n變更此頁面將會影響其他使用者在此 Wiki 上看到的使用者介面。",
+       "editinginterface": "<strong>警告:</strong>您正在編輯的頁面文字是用來提供軟體介面使用。\n變更此頁面將會影響其他使用者在此 Wiki 上看到的使用者介面。",
        "translateinterface": "如欲修改 Wiki 的翻譯,請至 [https://translatewiki.net/ translatewiki.net] 上的 MediaWiki 在地化專案。",
        "cascadeprotected": "此頁面被保護無法編輯,因為此頁面被以下開啟 \"連鎖保護\" 選項的{{PLURAL:$1|一頁|數頁}}保護頁面引用:\n$2",
        "namespaceprotected": "您沒有權限編輯 <strong>$1</strong> 命名空間的頁面。",
        "userlogin-remembermypassword": "記住我的登入狀態",
        "userlogin-signwithsecure": "使用安全連線",
        "cannotlogin-title": "無法登入",
-       "cannotlogin-text": "無法登入",
+       "cannotlogin-text": "無法登入",
        "cannotloginnow-title": "現在無法登入",
        "cannotloginnow-text": "使用 $1 時無法登入。",
        "cannotcreateaccount-title": "無法建立帳號",
        "password-login-forbidden": "此使用者名稱和密碼已被禁止使用。",
        "mailmypassword": "重設密碼",
        "passwordremindertitle": "{{SITENAME}} 的新臨時密碼",
-       "passwordremindertext": "ä¸\8dæ\98\8e人士 (å\8f¯è\83½æ\98¯æ\82¨è\87ªå·±ï¼\8cä¾\86è\87ª IP ä½\8då\9d\80 $1) è¦\81æ±\82é\87\8d設å\9c¨ {{SITENAME}} ($4) ç\9a\84å¯\86碼ã\80\82\n給使ç\94¨è\80\85 \"$2\" ç\9a\84è\87¨æ\99\82å¯\86碼設ç\82º \"$3\"ã\80\82\nå¦\82æ\9e\9cé\80\99å\80\8bå\8b\95ä½\9cæ\98¯æ\82¨å\81\9aç\9a\84ï¼\8cæ\82¨é\9c\80è¦\81ç«\8bå\8d³ç\99»å\85¥ä¸¦è¨­å®\9aä¸\80å\80\8bæ\96°ç\9a\84å¯\86碼ï¼\8c\næ\82¨ç\9a\84è\87¨æ\99\82å¯\86碼å°\87æ\96¼{{PLURAL:$5|ä¸\80|$5}}天å\85§é\81\8eæ\9c\9fã\80\82\n\nå¦\82æ\9e\9cä¸\8dæ\98¯æ\82¨è¦\81求重設密碼,或您已想起密碼,並不準備修改,\n您可以忽略此訊息並且繼續使用您原本的密碼。",
+       "passwordremindertext": "ä¸\8dæ\98\8e人士 (å\8f¯è\83½æ\98¯æ\82¨è\87ªå·±ï¼\8cä¾\86è\87ª IP ä½\8då\9d\80 $1) è«\8bæ±\82é\87\8d設å\9c¨ {{SITENAME}} ($4) ç\9a\84å¯\86碼ã\80\82\n給使ç\94¨è\80\85 \"$2\" ç\9a\84è\87¨æ\99\82å¯\86碼設ç\82º \"$3\"ã\80\82\nå¦\82æ\9e\9cé\80\99å\80\8bå\8b\95ä½\9cæ\98¯æ\82¨å\81\9aç\9a\84ï¼\8cæ\82¨é\9c\80è¦\81ç«\8bå\8d³ç\99»å\85¥ä¸¦è¨­å®\9aä¸\80å\80\8bæ\96°ç\9a\84å¯\86碼ï¼\8c\næ\82¨ç\9a\84è\87¨æ\99\82å¯\86碼å°\87æ\96¼{{PLURAL:$5|ä¸\80|$5}}天å\85§é\81\8eæ\9c\9fã\80\82\n\nå¦\82æ\9e\9cä¸\8dæ\98¯æ\82¨è«\8b求重設密碼,或您已想起密碼,並不準備修改,\n您可以忽略此訊息並且繼續使用您原本的密碼。",
        "noemail": "使用者 \"$1\" 沒有電子郵件地址記錄。",
        "noemailcreate": "您需要提供一個有效的電子郵件地址。",
        "passwordsent": "使用者 \"$1\" 的新密碼已寄至當出登記的電子郵件地址,\n請稍後收到郵件後再登入。",
        "noemailprefs": "在您的偏好設定中設定電子郵件地址,讓您可以使用這些功能。",
        "emailconfirmlink": "確認您的電子郵件地址",
        "invalidemailaddress": "無法接受格式不正確的電子郵件地址,請輸入正確的電子郵件地址格式或略過填寫該欄位。",
-       "cannotchangeemail": "此 Wiki 禁止變更帳號的電子郵件地址。",
+       "cannotchangeemail": "此 Wiki 禁止更改帳號的電子郵件地址。",
        "emaildisabled": "此網站不能傳送電子郵件。",
        "accountcreated": "已建立帳號",
        "accountcreatedtext": "使用者帳號 [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|對話]]) 已建立。",
        "passwordreset-domain": "網域名稱:",
        "passwordreset-email": "電子郵件地址:",
        "passwordreset-emailtitle": "在 {{SITENAME}} 的帳號詳細資料",
-       "passwordreset-emailtext-ip": "ä¸\8dæ\98\8e人士 (å\8f¯è\83½æ\98¯æ\82¨è\87ªå·±ï¼\8cä¾\86è\87ª IP ä½\8då\9d\80 $1) è¦\81æ±\82é\87\8d設å\9c¨ {{SITENAME}} ($4) ç\9a\84å¯\86碼ï¼\8cä¸\8bå\88\97æ\98¯è\88\87æ­¤é\9b»å­\90é\83µä»¶å\9c°å\9d\80æ\9c\89é\97\9cç\9a\84使ç\94¨è\80\85{{PLURAL:$3|帳è\99\9f}}ï¼\9a\n\n$2\n\n{{PLURAL:$3|é\80\99å\80\8bè\87¨æ\99\82å¯\86碼|é\80\99äº\9bè\87¨æ\99\82å¯\86碼}}å°\87æ\9c\83å\9c¨{{PLURAL:$5|ä¸\80天|$5 å¤©}}å\85§å\88°æ\9c\9fï¼\8c\næ\82¨æ\87\89ç«\8bå\8d³ç\99»å\85¥ä¸¦æ\9b´æ\94¹æ\96°ç\9a\84å¯\86碼ã\80\82å¦\82æ\9e\9cä¸\8dæ\98¯æ\82¨è¦\81求重設密碼,或您已想起密碼,並不準備修改,\n您可以忽略本訊息並且繼續使用您原本的密碼。",
-       "passwordreset-emailtext-user": "使ç\94¨è\80\85 $1 è¦\81æ±\82é\87\8d設å\9c¨ {{SITENAME}} ($4) ç\9a\84å¯\86碼ï¼\8cä¸\8bå\88\97æ\98¯è\88\87æ­¤é\9b»å­\90é\83µä»¶ä½\8då\9d\80æ\9c\89é\97\9cç\9a\84使ç\94¨è\80\85{{PLURAL:$3|帳è\99\9f}}ï¼\9a\n\n$2\n\n{{PLURAL:$3|é\80\99å\80\8bè\87¨æ\99\82å¯\86碼|é\80\99äº\9bè\87¨æ\99\82å¯\86碼}}å°\87æ\9c\83å\9c¨{{PLURAL:$5|ä¸\80天|$5 å¤©}}å\85§å\88°æ\9c\9fï¼\8c\næ\82¨æ\87\89ç«\8bå\8d³ç\99»å\85¥ä¸¦æ\9b´æ\94¹æ\96°ç\9a\84å¯\86碼ã\80\82å¦\82æ\9e\9cä¸\8dæ\98¯æ\82¨è¦\81求重設密碼,或您已想起密碼,並不準備修改,\n您可以忽略此訊息並且繼續使用您原本的密碼。",
+       "passwordreset-emailtext-ip": "ä¸\8dæ\98\8e人士 (å\8f¯è\83½æ\98¯æ\82¨è\87ªå·±ï¼\8cä¾\86è\87ª IP ä½\8då\9d\80 $1) è«\8bæ±\82é\87\8d設å\9c¨ {{SITENAME}} ($4) ç\9a\84å¯\86碼ï¼\8cä¸\8bå\88\97æ\98¯è\88\87æ­¤é\9b»å­\90é\83µä»¶å\9c°å\9d\80æ\9c\89é\97\9cç\9a\84使ç\94¨è\80\85{{PLURAL:$3|帳è\99\9f}}ï¼\9a\n\n$2\n\n{{PLURAL:$3|é\80\99å\80\8bè\87¨æ\99\82å¯\86碼|é\80\99äº\9bè\87¨æ\99\82å¯\86碼}}å°\87æ\9c\83å\9c¨{{PLURAL:$5|ä¸\80天|$5 å¤©}}å\85§å\88°æ\9c\9fï¼\8c\næ\82¨æ\87\89ç«\8bå\8d³ç\99»å\85¥ä¸¦æ\9b´æ\94¹æ\96°ç\9a\84å¯\86碼ã\80\82å¦\82æ\9e\9cä¸\8dæ\98¯æ\82¨è«\8b求重設密碼,或您已想起密碼,並不準備修改,\n您可以忽略本訊息並且繼續使用您原本的密碼。",
+       "passwordreset-emailtext-user": "使ç\94¨è\80\85 $1 è«\8bæ±\82é\87\8d設å\9c¨ {{SITENAME}} ($4) ç\9a\84å¯\86碼ï¼\8cä¸\8bå\88\97æ\98¯è\88\87æ­¤é\9b»å­\90é\83µä»¶å\9c°å\9d\80æ\9c\89é\97\9cç\9a\84使ç\94¨è\80\85{{PLURAL:$3|帳è\99\9f}}ï¼\9a\n\n$2\n\n{{PLURAL:$3|é\80\99å\80\8bè\87¨æ\99\82å¯\86碼|é\80\99äº\9bè\87¨æ\99\82å¯\86碼}}å°\87æ\9c\83å\9c¨{{PLURAL:$5|ä¸\80天|$5 å¤©}}å\85§å\88°æ\9c\9fï¼\8c\næ\82¨æ\87\89ç«\8bå\8d³ç\99»å\85¥ä¸¦æ\9b´æ\94¹æ\96°ç\9a\84å¯\86碼ã\80\82å¦\82æ\9e\9cä¸\8dæ\98¯æ\82¨è«\8b求重設密碼,或您已想起密碼,並不準備修改,\n您可以忽略此訊息並且繼續使用您原本的密碼。",
        "passwordreset-emailelement": "使用者名稱:\n$1\n\n臨時密碼:\n$2",
        "passwordreset-emailsentemail": "若此確實為您帳號所登記的電子郵件地址,將會寄出重設密碼的信件給您。",
        "passwordreset-emailsentusername": "若此確實為您使用者名稱所登記的電子郵件地址,將會寄出重設密碼的信件給您。",
        "hr_tip": "水平線 (少用)",
        "summary": "摘要:",
        "subject": "主旨:",
-       "minoredit": "這是一個修訂",
+       "minoredit": "這是一個次要修訂",
        "watchthis": "監視此頁面",
        "savearticle": "儲存頁面",
        "savechanges": "儲存變更",
        "selfredirect": "<strong>警告:</strong> 您正建立連結至自己的重新導向。\n您可能指定錯要重新導向的目標頁面或者編輯錯頁面。\n若您再點選 \"{{int:savearticle}}\" 一次,將會繼續建立重新導向。",
        "missingcommenttext": "請在下方輸入評論。",
        "missingcommentheader": "<strong>提醒:</strong>您未填寫此評論的主旨。\n若您再點選 \"{{int:savearticle}}\" 一次,將略過主旨/標題直接儲存您的評論。",
-       "summary-preview": "預覽摘要:",
-       "subject-preview": "主旨預覽:",
+       "summary-preview": "編輯摘要預覽:",
+       "subject-preview": "預覽主旨:",
        "previewerrortext": "嘗試預覽您的變更時發生錯誤。",
        "blockedtitle": "使用者已被封鎖",
        "blockedtext": "<strong>您的使用者名稱或 IP 位址以被封鎖。</strong>\n\n您被 $1 封鎖,\n原因爲 <em>$2</em>。\n\n* 封鎖開始時間:$8\n* 封鎖結束時間:$6\n* 相關封鎖對象:$7\n\n您可以聯絡 $1 或其他的 [[{{MediaWiki:Grouppage-sysop}}|管理員]] 討論封鎖的相關問題。\n若您已在 [[Special:Preferences|偏好設定]] 中設定了一個有效的電子郵件地址,且尚未被封鎖郵件功能,則您可透過 \"Email 聯絡此使用者\" 的功能來聯絡相關管理員。\n您目前的 IP 位址是 $3,此次封鎖的 ID 為 #$5。\n請您在詢問時附註以上詳細訊息。",
        "autoblockedtext": "因先前的另一位使用者被 $1 封鎖,您的 IP 位址已被自動封鎖。\n原因是:\n\n:<em>$2</em>\n\n* 封鎖開始時間:$8\n* 封鎖結束時間:$6\n* 相關封鎖對象:$7\n\n您可以聯絡 $1 或其他的 [[{{MediaWiki:Grouppage-sysop}}|管理員]] 討論封鎖的相關問題。\n若您已在 [[Special:Preferences|偏好設定]] 中設定了一個有效的電子郵件地址,且尚未被封鎖郵件功能,則您可透過 \"Email 聯絡此使用者\" 的功能來聯絡相關管理員。\n您目前的 IP 位址是 $3,此次封鎖的 ID 為 #$5。\n請您在詢問時附註以上詳細資料。",
-       "systemblockedtext": "您的使用者名稱或IP位址已被MediaWiki自動封禁。原因如下:\n\n:<em>$2</em>\n\n* 開始時間:$8\n* 結束時間:$6\n* 被封禁使用者:$7\n\n您目前的IP位址是$3。請在作出任何查詢時包含上述所有詳情。",
+       "systemblockedtext": "您的使用者名稱或 IP 位址已被 MediaWiki 自動封鎖,原因如下:\n\n:<em>$2</em>\n\n* 封鎖開始時間:$8\n* 封鎖結束時間:$6\n* 被封鎖的使用者:$7\n\n您目前的 IP 位址為 $3。\n請在做詢問時附上以上資訊。",
        "blockednoreason": "未說明原因",
        "whitelistedittext": "請先 $1 才可編輯頁面。",
        "confirmedittext": "在編輯此頁之前您必須確認您的電子郵件地址。\n請透過 [[Special:Preferences|偏好設定]] 設定並驗證您的電子郵件地址。",
        "continue-editing": "前往編輯框",
        "previewconflict": "此預覽顯示了您於上方文字編輯框中的內容儲存之後將會顯示的結果。",
        "session_fail_preview": "很抱歉!由於連線階段的資料遺失,以至於我們無法處理您的編輯動作。\n您可能已經登出了。<strong>請您確認您仍然在登入狀態,並請再試一次</strong>。\n請再試一次。\n如果仍然失敗,請 [[Special:UserLogout|登出]] 後重新登入,並請您確認您的瀏覽器允許此網站的 Cookie。",
-       "session_fail_preview_html": "<strong>抱歉!由於是次登入時段出現資料遺失,我們無法處理您所作出的編輯。</strong>\n\n<em> {{SITENAME}} 已開啟了原始 HTML 模式,故此預覽畫面將不會顯示以避免 JavaScript 攻擊。</em>\n\n<strong>如您希望真正能夠作出這次編輯,請再試一次。</strong>\n如果仍不成功,請 [[Special:UserLogout|登出]] 後再重新登入,並確保瀏覽器設定為「允許這個網域的cookie」。",
+       "session_fail_preview_html": "<strong>抱歉!由於是次登入時段出現資料遺失,我們無法處理您所作出的編輯。</strong>\n\n<em> {{SITENAME}} 已開啟了原始 HTML 模式,故此預覽畫面將不會顯示以避免 JavaScript 攻擊。</em>\n\n<strong>如您希望真正能夠作出這次編輯,請再試一次。</strong>\n如果仍不成功,請 [[Special:UserLogout|登出]] 後再重新登入,並確保瀏覽器設定為 \"允許這個網域的 cookie\" 。",
        "token_suffix_mismatch": "<strong>因您使用的瀏覽器破壞了編輯密鑰中的特殊符號,您的編輯已被拒絕。</strong>\n為了避免破壞頁面內容,已拒絕此次編輯動作,\n會發生這個問題通常是因為您使用了有問題的匿名網頁代理伺服器。",
        "edit_form_incomplete": "<strong>部份編輯的內容未送至伺服器,請檢查您的編輯內容是否完整並再試一次。</strong>",
        "editing": "正在編輯 $1",
        "post-expand-template-argument-warning": "<strong>警告:</strong>此頁面有一個以上的模板參數過長。\n過長的參數會被直接忽略。",
        "post-expand-template-argument-category": "模板參數有部份被忽略的頁面",
        "parser-template-loop-warning": "偵測到模板迴圈:[[$1]]",
+       "template-loop-category": "有樣板迴圈的頁面",
+       "template-loop-category-desc": "頁面含有樣板迴圈,即會自己不斷呼叫自己樣板。",
        "parser-template-recursion-depth-warning": "超出模板遞迴深度限制 ($1)",
        "language-converter-depth-warning": "已超出語言轉換器深度限制 ($1)",
        "node-count-exceeded-category": "節點數量超出限制的頁面",
        "last": "前筆",
        "page_first": "第一頁",
        "page_last": "最後頁",
-       "histlegend": "比對選擇的版本差異:選擇要比對修訂版本的單選方塊並點選底部的按鈕進行比對。<br />\n符號說明:<strong>({{int:cur}})</strong> = 與最新的修訂版本比對,<strong>({{int:last}})</strong> = 與前一筆修訂版本比對,<strong>{{int:minoreditletter}}</strong> = 修訂。",
-       "history-fieldset-title": "瀏覽歷史",
+       "histlegend": "比對選擇的版本差異:選擇要比對修訂版本的單選方塊並點選底部的按鈕進行比對。<br />\n符號說明:<strong>({{int:cur}})</strong> = 與最新的修訂版本比對,<strong>({{int:last}})</strong> = 與前一筆修訂版本比對,<strong>{{int:minoreditletter}}</strong> = 次要修訂。",
+       "history-fieldset-title": "搜尋修訂",
        "history-show-deleted": "只顯示已刪除的修訂",
        "histfirst": "最舊",
        "histlast": "最新",
        "prefs-labs": "實驗中的功能",
        "prefs-user-pages": "使用者頁面",
        "prefs-personal": "使用者基本資料",
-       "prefs-rc": "最近變更",
+       "prefs-rc": "近期變更",
        "prefs-watchlist": "監視清單",
        "prefs-editwatchlist": "編輯監視清單",
        "prefs-editwatchlist-label": "編輯在您監視清單上的項目:",
        "stub-threshold": "短頁面連結格式門檻值 ($1):",
        "stub-threshold-sample-link": "樣本",
        "stub-threshold-disabled": "已停用",
-       "recentchangesdays": "最近變更顯示的天數:",
+       "recentchangesdays": "近期變更顯示的天數:",
        "recentchangesdays-max": "最多 $1 {{PLURAL:$1|天}}",
        "recentchangescount": "預設顯示的編輯數:",
-       "prefs-help-recentchangescount": "這包含最近更改、頁面歷史以及日誌。",
+       "prefs-help-recentchangescount": "這包含近期變更、頁面歷史以及日誌。",
        "prefs-help-watchlist-token2": "訂閱您的監視清單所需的密鑰。\n任何人只要知道密鑰就能夠讀取您的監視清單,所以請勿任意與它人共享。\n若有需要 [[Special:ResetTokens|您可重設密鑰]]。",
        "savedprefs": "已儲存您的偏好設定。",
        "savedrights": "已儲存 {{GENDER:$1|$1}} 的使用者權限。",
        "youremail": "Email:",
        "username": "{{GENDER:$1|使用者名稱}}:",
        "prefs-memberingroups": "{{GENDER:$2|所屬}}{{PLURAL:$1|群組}}:",
+       "group-membership-link-with-expiry": "$1 (直到 $2)",
        "prefs-registration": "註冊時間:",
        "yourrealname": "真實姓名:",
        "yourlanguage": "語言:",
        "prefs-help-prefershttps": "此偏好設定將於您下次登入時生效。",
        "prefswarning-warning": "您對您的偏好設定所做的變更尚未儲存。\n若您未點選 \"$1\" 離開此頁面,將不會更新您的偏好設定。",
        "prefs-tabs-navigation-hint": "提示:您可使用左、右方向鍵切換頁籤。",
-       "userrights": "使用者權限管理",
-       "userrights-lookup-user": "選擇用戶",
+       "userrights": "使用者權限",
+       "userrights-lookup-user": "選擇使用者",
        "userrights-user-editname": "請輸入使用者名稱:",
        "editusergroup": "載入使用者群組",
        "editinguser": "變更{{GENDER:$1|使用者}} <strong>[[User:$1|$1]]</strong> 的使用者權限 $2",
        "saveusergroups": "儲存{{GENDER:$1|使用者}}群組",
        "userrights-groupsmember": "所屬群組:",
        "userrights-groupsmember-auto": "所屬隱含群組:",
-       "userrights-groups-help": "您可以更改此使用者所屬的群組:\n* 已勾選的核選方塊代表該使用者屬於該群組。\n* 未勾選的核選方塊代表該使用者不屬於該群組。\n* 有 * 號標示代表一旦加入該群組後便不能移除,反之亦然。",
+       "userrights-groups-help": "您可以更改此使用者所屬的群組:\n* 已勾選的核選方塊代表該使用者屬於該群組。\n* 未勾選的核選方塊代表該使用者不屬於該群組。\n* 有 * 號標示代表一旦加入該群組後便不能移除,反之亦然。\n* 有 # 號標示代表您只能延後此群組成員的期限,您無法將其提前。",
        "userrights-reason": "原因:",
        "userrights-no-interwiki": "您沒有權限去編輯其他 Wiki 上的使用者權限。",
        "userrights-nodatabase": "資料庫 $1 不存在或不在本地主機的。",
        "userrights-changeable-col": "您可變更的群組",
        "userrights-unchangeable-col": "您不可變更的群組",
+       "userrights-expiry-current": "期限至 $1",
+       "userrights-expiry-none": "沒有期限",
        "userrights-expiry": "期限:",
+       "userrights-expiry-existing": "現有的期限:$3, $2",
        "userrights-expiry-othertime": "其他時間:",
+       "userrights-expiry-options": "1 天:1 day,1 週:1 week,1 個月:1 month,3 個月:3 months,6 個月:6 months,1 年:1 year",
+       "userrights-invalid-expiry": "群組 \"$1\" 的期限無效。",
+       "userrights-expiry-in-past": "群組 \"$1\" 的期限已過。",
+       "userrights-cannot-shorten-expiry": "您無法提前群組 \"$1\" 中成員的期限。只有擁有新增與移除此群組權限的使用者可以將期限提前。",
        "userrights-conflict": "使用者權限變更發生衝突!請檢閱並確認你的變更。",
        "group": "群組:",
        "group-user": "使用者",
        "right-createtalk": "建立討論頁面",
        "right-createaccount": "建立新的使用者帳號",
        "right-autocreateaccount": "使用外部使用者帳號自動登入",
-       "right-minoredit": "標示編輯為小修訂",
+       "right-minoredit": "標示編輯為次要",
        "right-move": "移動頁面",
        "right-move-subpages": "移動頁面與其子頁面",
        "right-move-rootuserpages": "移動根使用者頁面",
        "right-purge": "不須確認即清除網站的頁面快取",
        "right-autoconfirmed": "不受 IP-based 的註冊頻率限制",
        "right-bot": "將其視為自動程序",
-       "right-nominornewtalk": "不顯示討論頁面中小修訂的新訊息提示",
+       "right-nominornewtalk": "不顯示討論頁面中次要編輯的新訊息提示",
        "right-apihighlimits": "使用 API 查詢的最高上限值",
        "right-writeapi": "使用寫入 API",
        "right-delete": "刪除頁面",
        "right-importupload": "由檔案上傳匯入頁面",
        "right-patrol": "標示其他人的編輯爲已巡查",
        "right-autopatrol": "將自己的編輯自動標示為已巡查",
-       "right-patrolmarks": "檢視最近變更的巡查標記",
+       "right-patrolmarks": "檢視近期變更的巡查標記",
        "right-unwatchedpages": "檢視未監視的頁面",
        "right-mergehistory": "合併頁面歷史",
        "right-userrights": "編輯所有使用者的權限",
        "action-createaccount": "建立此使用者帳號",
        "action-autocreateaccount": "自動建立此外部使用者帳號",
        "action-history": "檢視此頁面歷史",
-       "action-minoredit": "標示此編輯為小修訂",
+       "action-minoredit": "標示此編輯為次要",
        "action-move": "移動此頁面",
        "action-move-subpages": "移動此頁面與它的子頁面",
        "action-move-rootuserpages": "移動根使用者頁面",
        "action-writeapi": "使用寫入 API",
        "action-delete": "刪除此頁面",
        "action-deleterevision": "刪除修訂",
-       "action-deletelogentry": "å\88 é\99¤æ\97¥èª\8cè¨\98é\8c\84",
+       "action-deletelogentry": "å\88ªé\99¤æ\97¥èª\8cé \85ç\9b®",
        "action-deletedhistory": "檢視頁面的刪除歷史",
        "action-deletedtext": "查看已刪除的修訂版本文字",
        "action-browsearchive": "搜尋已刪除頁面",
        "nchanges": "$1 次變更",
        "enhancedrc-since-last-visit": "{{PLURAL:$1|自上次拜訪}}已有 $1",
        "enhancedrc-history": "歷史",
-       "recentchanges": "最近變更",
-       "recentchanges-legend": "最近變更選項",
-       "recentchanges-summary": "追蹤 Wiki 中此頁面的最近更改。",
+       "recentchanges": "近期變更",
+       "recentchanges-legend": "近期變更選項",
+       "recentchanges-summary": "追蹤 Wiki 中此頁面的近期變更。",
        "recentchanges-noresult": "於指定時間內沒有符合條件的變更。",
-       "recentchanges-feed-description": "追蹤 Wiki 中此摘要的最近變更。",
+       "recentchanges-feed-description": "追蹤 Wiki 中此摘要的近期變更。",
        "recentchanges-label-newpage": "該編輯建立了新頁面",
-       "recentchanges-label-minor": "該編輯是一個小修訂",
+       "recentchanges-label-minor": "此為次要編輯",
        "recentchanges-label-bot": "該編輯由機器人執行",
        "recentchanges-label-unpatrolled": "該編輯尚未巡查",
        "recentchanges-label-plusminus": "該頁面變更的大小 (位元組)",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (請參考[[Special:NewPages|新頁面]])",
        "recentchanges-legend-plusminus": "(<em>±123</em>)",
        "recentchanges-submit": "顯示",
-       "rcfilters-activefilters": "現用過濾規則",
-       "rcfilters-search-placeholder": "過濾最近變更(瀏覽或開始輸入)",
-       "rcfilters-invalid-filter": "過濾規則無效",
-       "rcfilters-filterlist-title": "篩選器",
-       "rcfilters-filterlist-feedbacklink": "在新(測試版)過濾器中提供反饋",
+       "rcfilters-activefilters": "使用中的過濾條件",
+       "rcfilters-restore-default-filters": "還原預設過濾條件",
+       "rcfilters-clear-all-filters": "清除所有過濾條件",
+       "rcfilters-search-placeholder": "過濾條件近期變更 (瀏覽或開始輸入)",
+       "rcfilters-invalid-filter": "無效的過濾條件",
+       "rcfilters-empty-filter": "沒有使用中的過濾條件。已顯示所有的貢獻。",
+       "rcfilters-filterlist-title": "過濾條件",
+       "rcfilters-filterlist-whatsthis": "這是什麼?",
+       "rcfilters-filterlist-feedbacklink": "提供新 (測試版) 過濾條件的意見回饋",
+       "rcfilters-highlightbutton-title": "明顯標示結果",
        "rcfilters-highlightmenu-title": "選擇顏色",
-       "rcfilters-filterlist-noresults": "找不到過濾規則",
+       "rcfilters-highlightmenu-help": "選擇要明顯標示此屬性的色彩",
+       "rcfilters-filterlist-noresults": "查無過濾條件",
+       "rcfilters-noresults-conflict": "因搜尋條件衝突,查無結果",
+       "rcfilters-state-message-subset": "此過濾條件沒有效果,因其結果包含了以下範圍更廣的{{PLURAL:$2|過濾條件|過濾條件}}其中之一 (嘗試以明顯標示來區別它):$1",
+       "rcfilters-state-message-fullcoverage": "選擇在群組中的所有過濾條件與沒選擇時相同,代表此過濾條件沒有效果。群組包含了:$1",
+       "rcfilters-filtergroup-registration": "使用者註冊",
        "rcfilters-filter-registered-label": "已註冊",
+       "rcfilters-filter-registered-description": "已登入的編輯者。",
        "rcfilters-filter-unregistered-label": "未註冊",
-       "rcfilters-filtergroup-authorship": "編輯者",
+       "rcfilters-filter-unregistered-description": "尚未登入的編輯者。",
+       "rcfilters-filter-unregistered-conflicts-user-experience-level": "此過濾條件與以下經歷{{PLURAL:$2|過濾條件|過濾條件}}衝突,因其只會{{PLURAL:$2|尋找|尋找}}已註冊的使用者:$1",
+       "rcfilters-filtergroup-authorship": "編輯作者身份",
        "rcfilters-filter-editsbyself-label": "您自己的編輯",
        "rcfilters-filter-editsbyself-description": "您的編輯。",
        "rcfilters-filter-editsbyother-label": "其他人的編輯",
        "rcfilters-filter-editsbyother-description": "由其他使用者而非您所作的編輯。",
        "rcfilters-filtergroup-userExpLevel": "經驗等級 (僅限已註冊的使用者)",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered": "經歷過濾條件只會尋找已註冊的使用者,所以此過濾條件會與 \"未註冊\" 的過濾條件衝突。",
+       "rcfilters-filtergroup-user-experience-level-conflicts-unregistered-global": "\"未註冊\" 的過濾條件與一個或多個經歷過濾條件衝突,該過濾條件只會尋找已註冊使用者。衝突的過濾條件已在上方使用的過濾條件區域中標示。",
        "rcfilters-filter-user-experience-level-newcomer-label": "新手",
        "rcfilters-filter-user-experience-level-newcomer-description": "編輯數低於 10 次,活躍低於 4 天。",
        "rcfilters-filter-user-experience-level-learner-label": "初學者",
-       "rcfilters-filter-user-experience-level-learner-description": "活躍的天數以及編輯數比「新手」多,但比「有經驗的使用者」少。",
+       "rcfilters-filter-user-experience-level-learner-description": "活躍的天數以及編輯數比 \"新手\" 多,但比 \"有經驗的使用者\" 少。",
        "rcfilters-filter-user-experience-level-experienced-label": "有經驗的使用者",
        "rcfilters-filter-user-experience-level-experienced-description": "活躍超過 30 天,編輯超過 500 次。",
+       "rcfilters-filtergroup-automated": "自動化貢獻",
        "rcfilters-filter-bots-label": "機器人",
-       "rcfilters-filter-humans-label": "人類(非機器人)",
-       "rcfilters-filter-humans-description": "由人類編者做出的編輯",
-       "rcfilters-filter-minor-label": "小修改",
-       "rcfilters-filter-major-label": "非小編輯",
-       "rcfilters-filter-major-description": "未標記小修改的編輯。",
+       "rcfilters-filter-bots-description": "由自動化工具所做的編輯。",
+       "rcfilters-filter-humans-label": "人類 (非機器人)",
+       "rcfilters-filter-humans-description": "由人類編輯者做出的編輯",
+       "rcfilters-filtergroup-reviewstatus": "審查狀態",
+       "rcfilters-filter-patrolled-label": "已巡查",
+       "rcfilters-filter-patrolled-description": "標記為己巡查的編輯。",
+       "rcfilters-filter-unpatrolled-label": "未巡查",
+       "rcfilters-filter-unpatrolled-description": "標記為未巡查的編輯。",
+       "rcfilters-filtergroup-significance": "重要性",
+       "rcfilters-filter-minor-label": "次要編輯",
+       "rcfilters-filter-minor-description": "作者已標示為次要的編輯。",
+       "rcfilters-filter-major-label": "非次要編輯",
+       "rcfilters-filter-major-description": "未標記為次要的編輯。",
+       "rcfilters-filtergroup-changetype": "變更類型",
        "rcfilters-filter-pageedits-label": "頁面編輯",
-       "rcfilters-filter-newpages-label": "頁面創建",
-       "rcfilters-filter-newpages-description": "創立新頁面的編緝。",
+       "rcfilters-filter-pageedits-description": "對 Wiki 內容、討論、分類說明所做的編輯...",
+       "rcfilters-filter-newpages-label": "頁面建立",
+       "rcfilters-filter-newpages-description": "建立新頁面的編輯。",
        "rcfilters-filter-categorization-label": "分類變更",
+       "rcfilters-filter-categorization-description": "已加入到分類或從分類中移除的頁面記錄。",
+       "rcfilters-filter-logactions-label": "已記錄的動作",
+       "rcfilters-filter-logactions-description": "管理動作、帳號建立、頁面刪除、上傳....",
+       "rcfilters-hideminor-conflicts-typeofchange-global": "\"次要編輯\" 過濾條件與一個或多個變更類型過濾條件衝突,因為某些變更類型無法指定為 \"次要\"。衝突的過濾條件已在上方使用的過濾條件區域中標示。",
+       "rcfilters-hideminor-conflicts-typeofchange": "某些變更類型無法指定為 \"次要\",所以此過濾條件與以下變更類型的過濾條件衝突:$1",
+       "rcfilters-typeofchange-conflicts-hideminor": "此變更類型過濾條件與 \"次要編輯\" 過濾條件衝突,某些變更類型無法指定為 \"次要\"。",
        "rcnotefrom": "以下{{PLURAL:$5|為}}自 <strong>$3 $4</strong> 以來的變更 (最多顯示 <strong>$1</strong> 筆)。",
        "rclistfrom": "顯示自 $3 $2 以來的新變更",
-       "rcshowhideminor": "$1 小修訂",
+       "rcshowhideminor": "$1 次要編輯",
        "rcshowhideminor-show": "顯示",
        "rcshowhideminor-hide": "隱藏",
        "rcshowhidebots": "$1 機器人",
        "uploadstash-summary": "此頁面可存取已上傳或還在上傳程序但尚未在 Wiki 公開的檔案,這些檔案除了上傳的使用者本身外,其他人尚無法查看。",
        "uploadstash-clear": "清除儲藏庫檔案",
        "uploadstash-nofiles": "您沒有儲藏的檔案。",
-       "uploadstash-badtoken": "執行動作失敗。您的編輯資訊可能已經過期,請重新再試。",
+       "uploadstash-badtoken": "執行動作失敗。您的編輯憑証可能已經過期,請重新再試。",
        "uploadstash-errclear": "清除檔案失敗。",
        "uploadstash-refresh": "更新檔案清單",
        "uploadstash-thumbnail": "檢視縮圖",
        "uncategorizedcategories": "未分類的分類",
        "uncategorizedimages": "未分類的檔案",
        "uncategorizedtemplates": "待分類模板",
+       "uncategorized-categories-exceptionlist": "# 包含了不應在 Special:UncategorizedCategories 被提及的分類清單,一個分類一行,以 \"*\" 開始,以其他字元 (包含空白) 做為行首將會被忽略。使用 \"#\" 代表註解。",
        "unusedcategories": "未使用的分類",
        "unusedimages": "未使用的檔案",
        "wantedcategories": "需要的分類",
        "apisandbox-sending-request": "傳送 API 請求中...",
        "apisandbox-loading-results": "接收 API 結果中...",
        "apisandbox-results-error": "讀取 API 查詢回應時發生錯誤:$1。",
+       "apisandbox-request-selectformat-label": "顯示請求資料為:",
+       "apisandbox-request-format-url-label": "URL 查詢字串",
        "apisandbox-request-url-label": "請求 URL:",
+       "apisandbox-request-json-label": "請求 JSON:",
        "apisandbox-request-time": "請求時間:{{PLURAL:$1|$1 ms}}",
        "apisandbox-results-fixtoken": "更正密鑰並重新送出",
        "apisandbox-results-fixtoken-fail": "取得 \"$1\" 密鑰失敗。",
        "emailccsubject": "您寄給 $1 的訊息副本:$2",
        "emailsent": "已寄出電子郵件",
        "emailsenttext": "已寄出您的電子郵件訊息。",
-       "emailuserfooter": "這封電子郵件是由$1透過{{SITENAME}}的「{{int:emailuser}}」功能{{GENDER:$1|寄給}}{{GENDER:$1|$2}}的。{{GENDER:$2|您的}}郵件將直接寄往{{GENDER:$1|原發件人}},{{GENDER:$1|他|她|他}}將能夠看到您的電子郵件地址。",
+       "emailuserfooter": "這封電子郵件是由 $1 透過 {{SITENAME}} 的 \"{{int:emailuser}}\" 功能{{GENDER:$1|寄給}}{{GENDER:$1|$2}}的。若{{GENDER:$2|您}}回覆此電子郵件,{{GENDER:$2|您的}}郵件將直接寄往{{GENDER:$1|原發件人}},{{GENDER:$1|他|她|他}}將能夠看到{{GENDER:$2|您的}}電子郵件地址。",
        "usermessage-summary": "留訊息至系統。",
        "usermessage-editor": "系統訊息",
        "watchlist": "監視清單",
        "watchlist-hide": "隱藏",
        "watchlist-submit": "顯示",
        "wlshowtime": "要顯示的時間長度:",
-       "wlshowhideminor": "編輯",
+       "wlshowhideminor": "次要編輯",
        "wlshowhidebots": "機器人",
        "wlshowhideliu": "已註冊使用者",
        "wlshowhideanons": "匿名使用者",
        "changecontentmodel-emptymodels-title": "沒有內容模型可用",
        "changecontentmodel-emptymodels-text": "[[:$1]]上的內容不能轉換為任何類型。",
        "log-name-contentmodel": "內容模型變更日誌",
-       "log-description-contentmodel": "æ­¤é \81å\88\97è\88\89é \81é\9d¢å\85§å®¹æ¨¡å\9e\8bç\9a\84è®\8aæ\9b´è¨\98é\8c\84以å\8f\8a使ç\94¨é\9d\9eé \90設ç\9a\84å\85§å®¹æ¨¡å\9e\8bæ\89\80å\89µå»º的頁面。",
+       "log-description-contentmodel": "æ­¤é \81å\88\97è\88\89é \81é\9d¢å\85§å®¹æ¨¡å\9e\8bç\9a\84è®\8aæ\9b´è¨\98é\8c\84以å\8f\8a使ç\94¨é\9d\9eé \90設ç\9a\84å\85§å®¹æ¨¡å\9e\8bæ\89\80建ç«\8b的頁面。",
        "logentry-contentmodel-new": "$1 {{GENDER:$2|已使用}}非預設的內容模型 \"$5\" 建立頁面 $3",
        "logentry-contentmodel-change": "$1 {{GENDER:$2|已變更}}頁面 $3 的內容模型自 \"$4\" 至 \"$5\"",
        "logentry-contentmodel-change-revertlink": "還原",
        "undeleteviewlink": "檢視",
        "undeleteinvert": "反向選擇",
        "undeletecomment": "原因:",
-       "undeletedrevisions": "{{PLURAL:$1|$1 個修訂}}已還原",
-       "undeletedrevisions-files": "{{PLURAL:$1|$1 個修訂}}與 {{PLURAL:$2|$2 個檔案}}已還原",
-       "undeletedfiles": "{{PLURAL:$1|$1}} 個檔案已還原",
        "cannotundelete": "部份或全部的取消刪除失敗:\n$1",
        "undeletedpage": "<strong>$1 已還原</strong>\n\n請參考 [[Special:Log/delete|刪除日誌]] 以查詢最近刪除及還原的記錄。",
        "undelete-header": "請參考 [[Special:Log/delete|刪除日誌]] 查詢最近刪除的頁面。",
        "sp-contributions-username": "IP 位址或使用者名稱:",
        "sp-contributions-toponly": "只顯示最新修訂的編輯",
        "sp-contributions-newonly": "只顯示建立頁面的編輯",
-       "sp-contributions-hideminor": "隱藏小修訂",
+       "sp-contributions-hideminor": "隱藏次要編輯",
        "sp-contributions-submit": "搜尋",
        "whatlinkshere": "連結至此的頁面",
        "whatlinkshere-title": "連結至 \"$1\" 的頁面",
        "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": "監視這位使用者的使用者頁面及其對話頁面",
-       "ipb-disableusertalk": "阻止此使用者在封期間編輯自己的對話頁面",
+       "ipb-disableusertalk": "阻止此使用者在封期間編輯自己的對話頁面",
        "ipb-change-block": "使用現有設定重新封鎖使用者",
        "ipb-confirm": "確認封鎖",
        "badipaddress": "無效的 IP 位址",
        "emailblock": "停用電子郵件",
        "blocklist-nousertalk": "無法編輯自己的對話頁面",
        "ipblocklist-empty": "封鎖清單為空。",
-       "ipblocklist-no-results": "è¦\81求的 IP 位址或使用者名稱尚未被封鎖。",
+       "ipblocklist-no-results": "è«\8b求的 IP 位址或使用者名稱尚未被封鎖。",
        "blocklink": "封鎖",
        "unblocklink": "解除封鎖",
        "change-blocklink": "變更封鎖",
        "proxyblockreason": "因您的 IP 位址是開放代理伺服器,已被封鎖。\n請聯絡您的網路服務供應商或您所在組織的技術支援,告知他們此嚴重的安全性問題。",
        "sorbsreason": "您的 IP 位址在 {{SITENAME}} 使用的 DNSBL 列為開放代理伺服器。",
        "sorbs_create_account_reason": "您的 IP 位址在 {{SITENAME}} 使用的 DNSBL 列為開放代理伺服器。\n您不能建立帳號。",
-       "softblockrangesreason": "您的IP位址($1)不允許匿名貢獻,請登入。",
+       "softblockrangesreason": "您的 IP 位址 ($1) 不允許匿名貢獻,請登入。",
        "xffblockreason": "您的 IP 位址使用 X-Forwarded-For 標頭,您或您使用的代理伺服器已被封鎖。\n封鎖的原因為:$1",
        "cant-see-hidden-user": "您欲封鎖的使用者已經被封鎖並且隱藏。\n您沒有隱藏使用者的權限,您無法檢視或編輯該使用者的封鎖狀態。",
        "ipbblocked": "因您已被封鎖,故無法封鎖或解除封鎖其他使用者。",
        "cant-move-category-page": "您沒有權限移動分類頁面。",
        "cant-move-to-category-page": "您沒有權限移動頁面至分類頁面。",
        "cant-move-subpages": "您沒有權限移動子頁面。",
-       "namespace-nosubpages": "å\90\8då­\97空é\96\93ã\80\8c$1ã\80\8d不允許有子頁面。",
+       "namespace-nosubpages": "å\91½å\90\8d空é\96\93 \"$1\" 不允許有子頁面。",
        "newtitle": "新標題:",
        "move-watch": "監視來源以及目標頁面",
        "movepagebtn": "移動頁面",
        "import": "匯入頁面",
        "importinterwiki": "從其他 wiki 匯入",
        "import-interwiki-text": "請選擇一個 Wiki 與頁面標題以進行匯入。\n會同時記錄修訂日期和編輯者的名稱。\n所有的從跨 Wiki 匯入操作都會被記錄在 [[Special:Log/import|匯入日誌]]。",
-       "import-interwiki-sourcewiki": "來源 wiki:",
+       "import-interwiki-sourcewiki": "來源 Wiki:",
        "import-interwiki-sourcepage": "來源頁面:",
        "import-interwiki-history": "複製此頁面的所有歷史修訂",
        "import-interwiki-templates": "包含所有模板",
        "tooltip-n-mainpage-description": "前往首頁",
        "tooltip-n-portal": "關於本專案、您可以做什麼、哪裡可以找到您需要的事物",
        "tooltip-n-currentevents": "於新聞事件中找到相關背景資料",
-       "tooltip-n-recentchanges": "列出此 Wiki 中的最近變更清單",
+       "tooltip-n-recentchanges": "列出此 Wiki 中的近期變更清單",
        "tooltip-n-randompage": "隨機進入一個頁面",
        "tooltip-n-help": "尋求協助的地方",
        "tooltip-t-whatlinkshere": "列出所有連結此頁面的頁面",
-       "tooltip-t-recentchangeslinked": "此頁面連結至其他頁面的最近變更",
+       "tooltip-t-recentchangeslinked": "此頁面連結至其他頁面的近期變更",
        "tooltip-feed-rss": "此頁面的 RSS 來源",
        "tooltip-feed-atom": "此頁面的 Atom 來源",
        "tooltip-t-contributions": "{{GENDER:$1|此使用者}}的貢獻清單",
        "tooltip-ca-nstab-template": "檢視模板",
        "tooltip-ca-nstab-help": "檢視說明頁面",
        "tooltip-ca-nstab-category": "檢視分類頁面",
-       "tooltip-minoredit": "標記為小修訂",
+       "tooltip-minoredit": "標記此為次要編輯",
        "tooltip-save": "儲存您的變更",
        "tooltip-publish": "發佈您的更改",
        "tooltip-preview": "請在儲存前預覽您的變更!",
        "markaspatrolledtext-file": "標記此檔案版本為己巡查",
        "markedaspatrolled": "標記為已巡查",
        "markedaspatrolledtext": "已標記選擇的修訂 [[:$1]] 為已巡查。",
-       "rcpatroldisabled": "最近變更巡查已停用",
+       "rcpatroldisabled": "近期變更巡查已停用",
        "rcpatroldisabledtext": "最新變更巡查的功能目前已停用。",
        "markedaspatrollederror": "無法標記為已巡查",
        "markedaspatrollederrortext": "您需指定要標記為已巡查的修訂。",
        "newimages-summary": "此特殊頁面中顯示最新上傳的檔案。",
        "newimages-legend": "搜尋",
        "newimages-label": "檔案名稱 (或部份檔名):",
+       "newimages-user": "IP 位址或使用者名稱",
        "newimages-showbots": "顯示由機器人上傳的檔案",
        "newimages-hidepatrolled": "隱藏己巡查上傳",
        "noimages": "無任何圖片。",
        "confirmemail_body_set": "不明人士 (可能是您自己,來自 IP 位址 $1) 已將在 {{SITENAME}} 帳號 \"$2\" 的電子郵件地址設定至此。\n\n請確認這個帳號是屬於您的,並使用瀏覽器開啟下方連結以開啟在 {{SITENAME}} 上的電子郵件功能:\n\n$3\n\n若您 *未* 註冊此帳號,\n請開啟下方連結取消電子郵件確認:\n\n$5\n\n此確認代碼會於 $4 過期。",
        "confirmemail_invalidated": "已取消電子郵件地址確認",
        "invalidateemail": "取消電子郵件確認",
-       "notificationemail_subject_changed": "{{SITENAME}} 註冊的電子郵件址已變更",
-       "notificationemail_subject_removed": "{{SITENAME}} 註冊的電子郵件址已移除",
-       "notificationemail_body_changed": "來自IP位址$1的某個人(可能是您),在{{SITENAME}}上將帳號\"$2\"的電子郵件位址改成\"$3\"。\n\n如果非您本人所為,請立即跟網站管理員聯繫。",
-       "notificationemail_body_removed": "來自IP位址$1的某人(可能是您),在{{SITENAME}}上移除了帳號$2的電子郵件位址。\n\n如果非您本人所為,請立即跟網站管理員聯繫。",
+       "notificationemail_subject_changed": "{{SITENAME}} 註冊的電子郵件址已變更",
+       "notificationemail_subject_removed": "{{SITENAME}} 註冊的電子郵件址已移除",
+       "notificationemail_body_changed": "來自 IP 位址 $1 的某個人 (可能是您) ,在{{SITENAME}}上將帳號\"$2\"的電子郵件地址改成\"$3\"。\n\n如果非您本人所為,請立即跟網站管理員聯繫。",
+       "notificationemail_body_removed": "來自 IP 位址 $1 的某人 (可能是您) ,在{{SITENAME}}上移除了帳號 $2 的電子郵件地址。\n\n如果非您本人所為,請立即跟網站管理員聯繫。",
        "scarytranscludedisabled": "[Interwiki 轉換代碼不可用]",
        "scarytranscludefailed": "[模板 $1 讀取失敗]",
        "scarytranscludefailed-httpstatus": "[模板 $1 讀取失敗:HTTP $2]",
        "comma-separator": ",",
        "colon-separator": ":",
        "word-separator": "",
+       "ellipsis": "…",
        "parentheses": " ($1)",
        "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← 上一頁",
        "specialpages-group-maintenance": "維護報表",
        "specialpages-group-other": "其它特殊頁面",
        "specialpages-group-login": "登入 / 建立帳號",
-       "specialpages-group-changes": "最近變更與日誌",
+       "specialpages-group-changes": "近期變更與日誌",
        "specialpages-group-media": "媒體上傳與報表",
        "specialpages-group-users": "使用者與權限",
        "specialpages-group-highuse": "常用頁面",
        "specialpages-group-spam": "反垃圾訊息工具",
        "specialpages-group-developer": "開發人員工具",
        "blankpage": "空白頁面",
-       "intentionallyblankpage": "此頁面被故意設為空白。",
+       "intentionallyblankpage": "此頁故意留白。",
        "external_image_whitelist": " #請勿修改本行文字<pre>\n#請於下方填寫正規表示法 (只需 // 之間的內容)\n#將會檢查外部連結的圖片是否符合這些條件\n#符合條件的連結會以圖片顯示,否則只顯示連結\n#以 # 開頭的行會被做為註解\n#此條件不區分大小寫\n\n#請將所有正規表示法輸入在此行上方,請勿修改本行文字</pre>",
        "tags": "有效變更標籤",
        "tag-filter": "[[Special:Tags|標籤]]搜尋:",
        "htmlform-user-not-exists": "<strong>$1</strong> 並不存在。",
        "htmlform-user-not-valid": "<strong>$1</strong> 不是有效的使用者名稱。",
        "logentry-delete-delete": "$1 刪除頁面 $3",
-       "logentry-delete-delete_redir": "$1通過覆蓋,{{GENDER:$2|刪除了}}重定向$3。",
+       "logentry-delete-delete_redir": "$1 透過覆寫{{GENDER:$2|刪除了}}重新導向 $3",
        "logentry-delete-restore": "$1 還原頁面 $3",
        "logentry-delete-event": "$1 {{GENDER:$2|已更改}} $3 中 {{PLURAL:$5|1 筆日誌|$5 筆日誌}}的可見性:$4",
        "logentry-delete-revision": "$1 {{GENDER:$2|已更改}}頁面 $3 中 {{PLURAL:$5|1 筆修訂|$5 筆修訂}}的可見性:$4",
        "logentry-suppress-event-legacy": "$1 {{GENDER:$2|已暗中變更}} $3 中日誌的可見性",
        "logentry-suppress-revision-legacy": "$1 {{GENDER:$2|已暗中更改}}頁面 $3 中修訂的可見性",
        "revdelete-content-hid": "已隱藏內容",
-       "revdelete-summary-hid": "已隱藏摘要",
+       "revdelete-summary-hid": "已隱藏編輯摘要",
        "revdelete-uname-hid": "隱藏使用者名稱",
        "revdelete-content-unhid": "取消隱藏內容",
        "revdelete-summary-unhid": "取消隱藏編輯摘要",
        "logentry-tag-update-revision": "$1 {{GENDER:$2|已更新}}標籤於頁面 $3 的修訂 $4 ({{PLURAL:$7|加入}} $6; {{PLURAL:$9|移除}} $8)。",
        "logentry-tag-update-logentry": "$1 {{GENDER:$2|已更新}}標籤於頁面 $3 的日誌項目 $5 ({{PLURAL:$7|加入}} $6; {{PLURAL:$9|移除}} $8)。",
        "rightsnone": "(無)",
+       "rightslogentry-temporary-group": "$1 (臨時,直到 $2)",
        "feedback-adding": "正在新增意見回饋至頁面...",
        "feedback-back": "返回",
        "feedback-bugcheck": "很好! 檢查一下您的意見是不是已經被列為 [$1 已知問題]。",
        "pagelang-reason": "原因",
        "pagelang-submit": "送出",
        "pagelang-nonexistent-page": "頁面 $1 不存在。",
-       "pagelang-unchanged-language": "頁面$1的語言已經設為$2。",
-       "pagelang-unchanged-language-default": "頁面$1的語言已經設為wiki的預設內容語言。",
+       "pagelang-unchanged-language": "頁面 $1 的語言已經設為 $2。",
+       "pagelang-unchanged-language-default": "頁面 $1 的語言已經設為 wiki 的預設內容語言。",
        "pagelang-db-failed": "資料庫更改頁面語言失敗。",
        "right-pagelang": "變更頁面語言",
        "action-pagelang": "變更頁面語言",
        "mw-widgets-titleinput-description-new-page": "頁面不存在",
        "mw-widgets-titleinput-description-redirect": "重新導向至 $1",
        "mw-widgets-categoryselector-add-category-placeholder": "加入分類...",
-       "mw-widgets-usersmultiselect-placeholder": "添加更多...",
+       "mw-widgets-usersmultiselect-placeholder": "加入更多...",
        "sessionmanager-tie": "無法合併多個請求認証類型:$1。",
        "sessionprovider-generic": "$1 連線階段",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "以 cookie 為基礎的連線階段",
        "authmanager-authn-no-local-user": "提供的憑證沒有與任何在此 wiki 上的使用者相關聯。",
        "authmanager-authn-no-local-user-link": "提供的憑證有效但沒有與任何在此 wiki 上的使用者相關聯。請採用其他方式登入,或建立新使用者,您將會有選項可以連結您先前的憑證到新帳號。",
        "authmanager-authn-autocreate-failed": "自動建立本地帳號失敗:$1",
-       "authmanager-change-not-supported": "提供的認證無法變更,因為尚無法使用。",
+       "authmanager-change-not-supported": "提供的憑証無法變更,因為尚無法使用。",
        "authmanager-create-disabled": "已關閉帳號自動建立。",
        "authmanager-create-from-login": "要建立您的帳號,請先填寫此欄位。",
        "authmanager-create-not-in-progress": "帳號建立尚未進行或連線階段資料已遺失,請重頭再開始。",
        "authpage-cannot-link-continue": "無法繼續帳號連結,您的連線階段似乎已逾時。",
        "cannotauth-not-allowed-title": "權限不足",
        "cannotauth-not-allowed": "您不被允許使用此頁面",
-       "changecredentials": "變更認證",
+       "changecredentials": "變更憑証",
        "changecredentials-submit": "變更認證",
        "changecredentials-invalidsubpage": "$1 不是有效的憑証類型。",
        "changecredentials-success": "已變更您的認證。",
-       "removecredentials": "移除認證",
+       "removecredentials": "移除憑証",
        "removecredentials-submit": "移除認證",
        "removecredentials-invalidsubpage": "$1 不是有效的憑証類型。",
        "removecredentials-success": "已移除您的憑證。",
-       "credentialsform-provider": "認證類型:",
+       "credentialsform-provider": "憑証類型:",
        "credentialsform-account": "帳號名稱:",
        "cannotlink-no-provider-title": "沒有可連結的帳號",
        "cannotlink-no-provider": "沒有可連結的帳號。",
        "unlinkaccounts": "取消連結帳號",
        "unlinkaccounts-success": "已取消連結帳號。",
        "authenticationdatachange-ignored": "認証資料變更未被處理,可能未設定提供者?",
-       "userjsispublic": "è«\8b注æ\84\8fï¼\9aJavaScript å­\90é \81é\9d¢å\8f¯è¢«å\85¶ä»\96使ç\94¨è\80\85檢è¦\96ï¼\8cä¸\8dæ\87\89å\8c\85å\90«æ\86\91証資料。",
-       "usercssispublic": "è«\8b注æ\84\8fï¼\9aCSS å­\90é \81é\9d¢å\8f¯è¢«å\85¶ä»\96使ç\94¨è\80\85檢è¦\96ï¼\8cä¸\8dæ\87\89å\8c\85å\90«æ\86\91証資料。",
+       "userjsispublic": "è«\8b注æ\84\8fï¼\9aJavaScript å­\90é \81é\9d¢å\8f¯è¢«å\85¶ä»\96使ç\94¨è\80\85檢è¦\96ï¼\8cä¸\8dæ\87\89å\8c\85å\90«æ©\9få¯\86資料。",
+       "usercssispublic": "è«\8b注æ\84\8fï¼\9aCSS å­\90é \81é\9d¢å\8f¯è¢«å\85¶ä»\96使ç\94¨è\80\85檢è¦\96ï¼\8cä¸\8dæ\87\89å\8c\85å\90«æ©\9få¯\86資料。",
        "restrictionsfield-badip": "無效的 IP 位址或範圍:$1",
        "restrictionsfield-label": "允許的 IP 範圍:",
        "restrictionsfield-help": "一個 IP 位址或 CIDR 範圍一行,要開啟所有範圍可使用:<pre>0.0.0.0/0\n::/0</pre>",
        "revid": "修訂 $1",
-       "pageid": "頁面 ID $1"
+       "pageid": "頁面 ID $1",
+       "rawhtml-notallowed": "&lt;html&gt; 標籤無法在一般頁面之外使用。"
 }
diff --git a/languages/messages/MessagesAtj.php b/languages/messages/MessagesAtj.php
new file mode 100644 (file)
index 0000000..69bcaa5
--- /dev/null
@@ -0,0 +1,11 @@
+<?php
+/** Atikamekw
+ *
+ * To improve a translation please visit https://translatewiki.net
+ *
+ * @ingroup Language
+ * @file
+ *
+ */
+
+$fallback = 'fr';
index b9280ea..ac9f1b7 100644 (file)
@@ -400,6 +400,7 @@ $specialPageAliases = [
        'ApiHelp'                   => [ 'ApiHelp' ],
        'ApiSandbox'                => [ 'ApiSandbox' ],
        'Ancientpages'              => [ 'AncientPages' ],
+       'AutoblockList'             => [ 'AutoblockList', 'ListAutoblocks' ],
        'Badtitle'                  => [ 'Badtitle' ],
        'Blankpage'                 => [ 'BlankPage' ],
        'Block'                     => [ 'Block', 'BlockIP', 'BlockUser' ],
@@ -427,6 +428,7 @@ $specialPageAliases = [
        'Fewestrevisions'           => [ 'FewestRevisions' ],
        'FileDuplicateSearch'       => [ 'FileDuplicateSearch' ],
        'Filepath'                  => [ 'FilePath' ],
+       'GoToInterwiki'             => [ 'GoToInterwiki' ],
        'Import'                    => [ 'Import' ],
        'Invalidateemail'           => [ 'InvalidateEmail' ],
        'JavaScriptTest'            => [ 'JavaScriptTest' ],
index 62dc36c..e5ba411 100644 (file)
@@ -36,9 +36,11 @@ define( 'DO_MAINTENANCE', RUN_MAINTENANCE_IF_MAIN ); // original name, harmless
 
 $maintClass = false;
 
+use Wikimedia\Rdbms\IDatabase;
 use MediaWiki\Logger\LoggerFactory;
 use MediaWiki\MediaWikiServices;
 use Wikimedia\Rdbms\LBFactory;
+use Wikimedia\Rdbms\IMaintainableDatabase;
 
 /**
  * Abstract maintenance class for quickly writing and churning out
@@ -105,7 +107,7 @@ abstract class Maintenance {
 
        /**
         * Used by getDB() / setDB()
-        * @var Database
+        * @var IMaintainableDatabase
         */
        private $mDb = null;
 
@@ -205,7 +207,7 @@ abstract class Maintenance {
         * @param string $description The description of the param to show on --help
         * @param bool $required Is the param required?
         * @param bool $withArg Is an argument required with this option?
-        * @param string $shortName Character to use as short name
+        * @param string|bool $shortName Character to use as short name
         * @param bool $multiOccurrence Can this option be passed multiple times?
         */
        protected function addOption( $name, $description, $required = false,
@@ -1242,7 +1244,7 @@ abstract class Maintenance {
         * @param integer $db DB index (DB_REPLICA/DB_MASTER)
         * @param array $groups; default: empty array
         * @param string|bool $wiki; default: current wiki
-        * @return Database
+        * @return IMaintainableDatabase
         */
        protected function getDB( $db, $groups = [], $wiki = false ) {
                if ( is_null( $this->mDb ) ) {
@@ -1255,7 +1257,7 @@ abstract class Maintenance {
        /**
         * Sets database object to be returned by getDB().
         *
-        * @param IDatabase $db Database object to be used
+        * @param IDatabase $db
         */
        public function setDB( IDatabase $db ) {
                $this->mDb = $db;
@@ -1317,7 +1319,7 @@ abstract class Maintenance {
 
        /**
         * Lock the search index
-        * @param Database &$db
+        * @param IMaintainableDatabase &$db
         */
        private function lockSearchindex( $db ) {
                $write = [ 'searchindex' ];
@@ -1335,7 +1337,7 @@ abstract class Maintenance {
 
        /**
         * Unlock the tables
-        * @param Database &$db
+        * @param IMaintainableDatabase &$db
         */
        private function unlockSearchindex( $db ) {
                $db->unlockTables( __CLASS__ . '::' . __METHOD__ );
@@ -1344,7 +1346,7 @@ abstract class Maintenance {
        /**
         * Unlock and lock again
         * Since the lock is low-priority, queued reads will be able to complete
-        * @param Database &$db
+        * @param IMaintainableDatabase &$db
         */
        private function relockSearchindex( $db ) {
                $this->unlockSearchindex( $db );
@@ -1355,7 +1357,7 @@ abstract class Maintenance {
         * Perform a search index update with locking
         * @param int $maxLockTime The maximum time to keep the search index locked.
         * @param string $callback The function that will update the function.
-        * @param Database $dbw
+        * @param IMaintainableDatabase $dbw
         * @param array $results
         */
        public function updateSearchIndex( $maxLockTime, $callback, $dbw, $results ) {
@@ -1391,7 +1393,7 @@ abstract class Maintenance {
 
        /**
         * Update the searchindex table for a given pageid
-        * @param Database $dbw A database write handle
+        * @param IDatabase $dbw A database write handle
         * @param int $pageId The page ID to update.
         * @return null|string
         */
diff --git a/maintenance/archives/patch-rename-ar_usertext_timestamp.sql b/maintenance/archives/patch-rename-ar_usertext_timestamp.sql
new file mode 100644 (file)
index 0000000..658c179
--- /dev/null
@@ -0,0 +1,7 @@
+-- Rename the archive.ar_usertext_timestamp index to usertext_timestamp.
+-- This is for MySQL only and is only necessary on wikis freshly installed on
+-- 1.28.0 when bug T154872 was present. The patch will probably be removed in
+-- 1.29 since we plan on renaming the index properly to ar_usertext_timestamp.
+ALTER TABLE /*$wgDBprefix*/archive
+       DROP INDEX ar_usertext_timestamp,
+       ADD INDEX usertext_timestamp (ar_user_text,ar_timestamp);
index 0beff7c..13362e0 100644 (file)
@@ -23,6 +23,8 @@
 
 require __DIR__ . '/../commandLine.inc';
 
+use Wikimedia\Rdbms\IMaintainableDatabase;
+
 /**
  * Maintenance script that upgrade for log_id/log_deleted fields in a
  * replication-safe way.
@@ -32,7 +34,7 @@ require __DIR__ . '/../commandLine.inc';
 class UpdateLogging {
 
        /**
-        * @var Database
+        * @var IMaintainableDatabase
         */
        public $dbw;
        public $batchSize = 1000;
index 286fb58..60b8a7a 100644 (file)
@@ -28,6 +28,7 @@ require_once __DIR__ . '/Maintenance.php';
 require_once __DIR__ . '/../includes/export/DumpFilter.php';
 
 use Wikimedia\Rdbms\LoadBalancer;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * @ingroup Dump Maintenance
index 2a8d79a..2369d99 100644 (file)
@@ -23,6 +23,9 @@
 
 require_once __DIR__ . '/Benchmarker.php';
 
+use Wikimedia\Rdbms\IDatabase;
+use Wikimedia\Rdbms\IMaintainableDatabase;
+
 /**
  * Maintenance script that benchmarks SQL DELETE vs SQL TRUNCATE.
  *
@@ -69,7 +72,7 @@ class BenchmarkDeleteTruncate extends Benchmarker {
        }
 
        /**
-        * @param Database $dbw
+        * @param IDatabase $dbw
         * @return void
         */
        private function insertData( $dbw ) {
@@ -82,7 +85,7 @@ class BenchmarkDeleteTruncate extends Benchmarker {
        }
 
        /**
-        * @param Database $dbw
+        * @param IDatabase $dbw
         * @return void
         */
        private function delete( $dbw ) {
@@ -90,7 +93,7 @@ class BenchmarkDeleteTruncate extends Benchmarker {
        }
 
        /**
-        * @param Database $dbw
+        * @param IMaintainableDatabase $dbw
         * @return void
         */
        private function truncate( $dbw ) {
index 83ab35c..dbaf643 100644 (file)
@@ -23,6 +23,7 @@
  */
 
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\IDatabase;
 
 require_once __DIR__ . '/Maintenance.php';
 
index 70f3654..675d069 100644 (file)
@@ -24,6 +24,7 @@
 require_once __DIR__ . '/Maintenance.php';
 
 use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * Maintenance script to convert user options to the new `user_properties` table.
@@ -76,7 +77,7 @@ class ConvertUserOptions extends Maintenance {
 
        /**
         * @param ResultWrapper $res
-        * @param Database $dbw
+        * @param IDatabase $dbw
         * @return null|int
         */
        function convertOptionBatch( $res, $dbw ) {
index 388ad8a..f7e0c0f 100644 (file)
@@ -26,9 +26,11 @@ require_once __DIR__ . '/Maintenance.php';
 /**
  * Maintenance script to create common password cdb database.
  *
- * Meant to take a file like
- * https://github.com/danielmiessler/SecLists/blob/master/Passwords/rockyou.txt?raw=true
- * as input.
+ * Meant to take a file like those from
+ * https://github.com/danielmiessler/SecLists
+ * For example:
+ * https://github.com/danielmiessler/SecLists/blob/fe2b40dd84/Passwords/rockyou.txt?raw=true
+ *
  * @see serialized/commonpasswords.cdb and PasswordPolicyChecks::checkPopularPasswordBlacklist
  * @since 1.27
  * @ingroup Maintenance
index df496d4..e99f2b0 100644 (file)
@@ -26,6 +26,8 @@
 
 require_once __DIR__ . '/Maintenance.php';
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * Maintenance script that deletes revisions which refer to a nonexisting page.
  *
@@ -83,7 +85,7 @@ class DeleteOrphanedRevisions extends Maintenance {
         * Do this inside a transaction
         *
         * @param array $id Array of revision id values
-        * @param Database $dbw Database class (needs to be a master)
+        * @param IDatabase $dbw Master DB handle
         */
        private function deleteRevs( $id, &$dbw ) {
                if ( !is_array( $id ) ) {
index 0111ac5..3abbdab 100644 (file)
@@ -86,7 +86,6 @@ class DeleteRevision extends Maintenance {
                                );
                                $dbw->delete( 'revision', [ 'rev_id' => $revID ] );
                                if ( $pageLatest == $revID ) {
-                                       // Database integrity
                                        $newLatest = $dbw->selectField(
                                                'revision',
                                                'rev_id',
index 9f983c1..6dbad94 100644 (file)
@@ -117,7 +117,7 @@ abstract class DumpIterator extends Maintenance {
        /**
         * Callback function for each revision, child classes should override
         * processRevision instead.
-        * @param Database $rev
+        * @param WikiRevision $rev
         */
        public function handleRevision( $rev ) {
                $title = $rev->getTitle();
index 5d92eec..581f0d7 100644 (file)
@@ -27,7 +27,7 @@
 require_once __DIR__ . '/backup.inc';
 require_once __DIR__ . '/../includes/export/WikiExporter.php';
 
-use Wikimedia\Rdbms\LoadBalancer;
+use Wikimedia\Rdbms\IMaintainableDatabase;
 
 /**
  * @ingroup Maintenance
@@ -88,7 +88,7 @@ class TextPassDumper extends BackupDumper {
        protected $checkpointFiles = [];
 
        /**
-        * @var Database
+        * @var IMaintainableDatabase
         */
        protected $db;
 
index 9dee6e5..9c5a375 100644 (file)
@@ -24,6 +24,8 @@
 
 require_once __DIR__ . '/Maintenance.php';
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * Maintenance script used to fetch page text in a subprocess.
  *
@@ -71,7 +73,7 @@ class FetchText extends Maintenance {
 
        /**
         * May throw a database error if, say, the server dies during query.
-        * @param Database $db
+        * @param IDatabase $db
         * @param int $id The old_id
         * @return string
         */
index 677bfa2..ad2fdf8 100644 (file)
@@ -38,30 +38,37 @@ class GetLagTimes extends Maintenance {
        }
 
        public function execute() {
-               $lbFactory = MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
-               $stats = MediaWikiServices::getInstance()->getStatsdDataFactory();
+               $services = MediaWikiServices::getInstance();
+               $lbFactory = $services->getDBLoadBalancerFactory();
+               $stats = $services->getStatsdDataFactory();
+               $lbsByType = [
+                       'main' => $lbFactory->getAllMainLBs(),
+                       'external' => $lbFactory->getAllExternalLBs()
+               ];
 
-               $lbs = $lbFactory->getAllMainLBs() + $lbFactory->getAllExternalLBs();
-               foreach ( $lbs as $cluster => $lb ) {
-                       if ( $lb->getServerCount() <= 1 ) {
-                               continue;
-                       }
-                       $lags = $lb->getLagTimes();
-                       foreach ( $lags as $serverIndex => $lag ) {
-                               $host = $lb->getServerName( $serverIndex );
-                               if ( IP::isValid( $host ) ) {
-                                       $ip = $host;
-                                       $host = gethostbyaddr( $host );
-                               } else {
-                                       $ip = gethostbyname( $host );
+               foreach ( $lbsByType as $type => $lbs ) {
+                       foreach ( $lbs as $cluster => $lb ) {
+                               if ( $lb->getServerCount() <= 1 ) {
+                                       continue;
                                }
+                               $lags = $lb->getLagTimes();
+                               foreach ( $lags as $serverIndex => $lag ) {
+                                       $host = $lb->getServerName( $serverIndex );
+                                       if ( IP::isValid( $host ) ) {
+                                               $ip = $host;
+                                               $host = gethostbyaddr( $host );
+                                       } else {
+                                               $ip = gethostbyname( $host );
+                                       }
 
-                               $starLen = min( intval( $lag ), 40 );
-                               $stars = str_repeat( '*', $starLen );
-                               $this->output( sprintf( "%10s %20s %3d %s\n", $ip, $host, $lag, $stars ) );
+                                       $starLen = min( intval( $lag ), 40 );
+                                       $stars = str_repeat( '*', $starLen );
+                                       $this->output( sprintf( "%10s %20s %3d %s\n", $ip, $host, $lag, $stars ) );
 
-                               if ( $this->hasOption( 'report' ) ) {
-                                       $stats->gauge( "loadbalancer.lag.$cluster.$host", $lag );
+                                       if ( $this->hasOption( 'report' ) ) {
+                                               $group = ( $type === 'external' ) ? 'external' : $cluster;
+                                               $stats->gauge( "loadbalancer.lag.$group.$host", intval( $lag * 1e3 ) );
+                                       }
                                }
                        }
                }
index 9fe5009..2c8c8b0 100644 (file)
@@ -33,7 +33,8 @@
                                        "mw.plugin.*",
                                        "mw.cookie",
                                        "mw.experiments",
-                                       "mw.viewport"
+                                       "mw.viewport",
+                                       "mw.htmlform.*"
                                ]
                        },
                        {
index 2b59735..e7fdd7d 100644 (file)
                };
        </script>
        <script>
-               // Emulate startup.js
-               var mwPerformance = { mark: function () {} };
+               // Mock startup.js
+               var mwPerformance = { mark: function () {} },
+                       mwNow = Date.now;
 
                function startUp() {
                        mw.config = new mw.Map();
                }
        </script>
        <script src="modules/lib/jquery/jquery.js"></script>
-       <script src="modules/lib/phpjs-sha1/sha1.js"></script>
        <script src="modules/src/mediawiki/mediawiki.js"></script>
        <script src="modules/src/mediawiki/mediawiki.errorLogger.js"></script>
-       <script src="modules/src/mediawiki/mediawiki.startUp.js"></script>
        <script src="modules/lib/oojs/oojs.jquery.js"></script>
        <script src="modules/lib/oojs-ui/oojs-ui-core.js"></script>
        <script src="modules/lib/oojs-ui/oojs-ui-widgets.js"></script>
@@ -88,7 +87,7 @@
                        background: #fff;
                }
        </style>
-       <link rel="stylesheet" href="modules/src/oojs-ui/oojs-ui-local.css">
+       <link rel="stylesheet" href="modules/src/oojs-ui-local.css">
        <link rel="stylesheet" href="modules/lib/oojs-ui/oojs-ui-core-mediawiki.css">
        <link rel="stylesheet" href="modules/lib/oojs-ui/oojs-ui-widgets-mediawiki.css">
        <link rel="stylesheet" href="modules/lib/oojs-ui/oojs-ui-toolbars-mediawiki.css">
index 80e8011..0bd627f 100644 (file)
  * @ingroup Maintenance
  */
 
+require_once __DIR__ . '/Maintenance.php';
+
 use MediaWiki\Linker\LinkTarget;
 use MediaWiki\MediaWikiServices;
 use Wikimedia\Rdbms\ResultWrapper;
-
-require_once __DIR__ . '/Maintenance.php';
+use Wikimedia\Rdbms\IMaintainableDatabase;
 
 /**
  * Maintenance script that checks for articles to fix after
@@ -39,7 +40,7 @@ require_once __DIR__ . '/Maintenance.php';
 class NamespaceConflictChecker extends Maintenance {
 
        /**
-        * @var Database
+        * @var IMaintainableDatabase
         */
        protected $db;
 
index 2da8830..e36c5b6 100644 (file)
@@ -30,6 +30,8 @@
 
 require_once __DIR__ . '/Maintenance.php';
 
+use Wikimedia\Rdbms\IMaintainableDatabase;
+
 /**
  * Maintenance script that looks for 'orphan' revisions hooked to pages which
  * don't exist and 'childless' pages with no revisions.
@@ -56,7 +58,7 @@ class Orphans extends Maintenance {
 
        /**
         * Lock the appropriate tables for the script
-        * @param Database $db
+        * @param IMaintainableDatabase $db
         * @param string[] $extraTable The name of any extra tables to lock (eg: text)
         */
        private function lockTables( $db, $extraTable = [] ) {
index b41e0e0..7d83180 100644 (file)
 
 require_once __DIR__ . '/Maintenance.php';
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * Usage:
  *  populateContentModel.php --ns=1 --table=page
  */
 class PopulateContentModel extends Maintenance {
        protected $wikiId;
-
+       /** @var WANObjectCache */
        protected $wanCache;
 
        public function __construct() {
@@ -78,7 +80,7 @@ class PopulateContentModel extends Maintenance {
                $this->wanCache->delete( $revisionKey );
        }
 
-       private function updatePageRows( Database $dbw, $pageIds, $model ) {
+       private function updatePageRows( IDatabase $dbw, $pageIds, $model ) {
                $count = count( $pageIds );
                $this->output( "Setting $count rows to $model..." );
                $dbw->update(
@@ -91,7 +93,7 @@ class PopulateContentModel extends Maintenance {
                $this->output( "done.\n" );
        }
 
-       protected function populatePage( Database $dbw, $ns ) {
+       protected function populatePage( IDatabase $dbw, $ns ) {
                $toSave = [];
                $lastId = 0;
                $nsCondition = $ns === 'all' ? [] : [ 'page_namespace' => $ns ];
@@ -123,7 +125,7 @@ class PopulateContentModel extends Maintenance {
                }
        }
 
-       private function updateRevisionOrArchiveRows( Database $dbw, $ids, $model, $table ) {
+       private function updateRevisionOrArchiveRows( IDatabase $dbw, $ids, $model, $table ) {
                $prefix = $table === 'archive' ? 'ar' : 'rev';
                $model_column = "{$prefix}_content_model";
                $format_column = "{$prefix}_content_format";
@@ -142,7 +144,7 @@ class PopulateContentModel extends Maintenance {
                $this->output( "done.\n" );
        }
 
-       protected function populateRevisionOrArchive( Database $dbw, $table, $ns ) {
+       protected function populateRevisionOrArchive( IDatabase $dbw, $table, $ns ) {
                $prefix = $table === 'archive' ? 'ar' : 'rev';
                $model_column = "{$prefix}_content_model";
                $format_column = "{$prefix}_content_format";
index ac87cf3..5d5da89 100644 (file)
@@ -23,6 +23,8 @@
 
 require_once __DIR__ . '/Maintenance.php';
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * Maintenance script to populate the rc_source field.
  *
@@ -83,7 +85,7 @@ class PopulateRecentChangesSource extends LoggedUpdateMaintenance {
                return __CLASS__;
        }
 
-       protected function buildUpdateCondition( Database $dbw ) {
+       protected function buildUpdateCondition( IDatabase $dbw ) {
                $rcNew = $dbw->addQuotes( RC_NEW );
                $rcSrcNew = $dbw->addQuotes( RecentChange::SRC_NEW );
                $rcEdit = $dbw->addQuotes( RC_EDIT );
index 3088baa..feeeb65 100644 (file)
@@ -22,7 +22,7 @@
  * @author Timo Tijhof
  */
 
-use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\IDatabase;
 
 require_once __DIR__ . '/Maintenance.php';
 
index 6aa1f37..966864e 100644 (file)
@@ -32,6 +32,8 @@
 
 require_once __DIR__ . '/Maintenance.php';
 
+use Wikimedia\Rdbms\IMaintainableDatabase;
+
 /**
  * Maintenance script to update image metadata records.
  *
@@ -40,7 +42,7 @@ require_once __DIR__ . '/Maintenance.php';
 class ImageBuilder extends Maintenance {
 
        /**
-        * @var Database
+        * @var IMaintainableDatabase
         */
        protected $dbw;
 
index b7f0762..e4bb60e 100644 (file)
@@ -27,6 +27,8 @@
 
 require_once __DIR__ . '/Maintenance.php';
 
+use Wikimedia\Rdbms\IMaintainableDatabase;
+
 /**
  * Maintenance script that rebuilds search index table from scratch.
  *
@@ -36,7 +38,7 @@ class RebuildTextIndex extends Maintenance {
        const RTI_CHUNK_SIZE = 500;
 
        /**
-        * @var Database
+        * @var IMaintainableDatabase
         */
        private $db;
 
index 372c352..b557f3d 100644 (file)
@@ -29,6 +29,9 @@
 
 require_once __DIR__ . '/Maintenance.php';
 
+use Wikimedia\Rdbms\IDatabase;
+use Wikimedia\Rdbms\IMaintainableDatabase;
+
 /**
  * Maintenance script to refresh image metadata fields.
  *
@@ -37,7 +40,7 @@ require_once __DIR__ . '/Maintenance.php';
 class RefreshImageMetadata extends Maintenance {
 
        /**
-        * @var Database
+        * @var IMaintainableDatabase
         */
        protected $dbw;
 
@@ -205,7 +208,7 @@ class RefreshImageMetadata extends Maintenance {
        }
 
        /**
-        * @param Database $dbw
+        * @param IDatabase $dbw
         * @return array
         */
        function getConditions( $dbw ) {
index 06fcbaf..a6cd548 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup Maintenance
  */
 
+use Wikimedia\Rdbms\IDatabase;
+
 require_once __DIR__ . '/Maintenance.php';
 
 /**
@@ -388,7 +390,7 @@ class RefreshLinks extends Maintenance {
         * By specifying a null $start or $end, it is also possible to create
         * half-bounded or unbounded intervals using this function.
         *
-        * @param IDatabase $db Database connection
+        * @param IDatabase $db
         * @param string $var Field name
         * @param mixed $start First value to include or null
         * @param mixed $end Last value to include or null
index f8eedb3..b0a2b92 100644 (file)
@@ -25,6 +25,8 @@
 
 require_once __DIR__ . '/Maintenance.php';
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * Maintenance script to run a database query in batches and wait for replica DBs.
  *
index 58472e9..70f9aaa 100644 (file)
@@ -25,6 +25,7 @@
 require_once __DIR__ . '/Maintenance.php';
 
 use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * Maintenance script that sends SQL queries from the specified file to the database.
@@ -76,7 +77,7 @@ class MwSql extends Maintenance {
                        $index = DB_MASTER;
                }
 
-               /** @var Database $db DB handle for the appropriate cluster/wiki */
+               /** @var IDatabase $db DB handle for the appropriate cluster/wiki */
                $db = $lb->getConnection( $index, [], $wiki );
                if ( $replicaDB != '' && $db->getLBInfo( 'master' ) !== null ) {
                        $this->error( "The server selected ({$db->getServer()}) is not a replica DB.", 1 );
index d96cecd..5f705ba 100755 (executable)
@@ -27,6 +27,8 @@
 
 require_once __DIR__ . '/Maintenance.php';
 
+use Wikimedia\Rdbms\IMaintainableDatabase;
+
 /**
  * Maintenance script to run database schema updates.
  *
@@ -145,7 +147,7 @@ class UpdateMediaWiki extends Maintenance {
 
                $this->output( "Going to run database updates for " . wfWikiID() . "\n" );
                if ( $db->getType() === 'sqlite' ) {
-                       /** @var Database|DatabaseSqlite $db */
+                       /** @var IMaintainableDatabase|DatabaseSqlite $db */
                        $this->output( "Using SQLite file: '{$db->getDbFilePath()}'\n" );
                }
                $this->output( "Depending on the size of your database this may take a while!\n" );
index e70a176..84fc2d2 100644 (file)
@@ -26,6 +26,8 @@
 
 require_once __DIR__ . '/Maintenance.php';
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * Maintenance script that will find all rows in the categorylinks table
  * whose collation is out-of-date.
@@ -242,7 +244,7 @@ TEXT
         * Return an SQL expression selecting rows which sort above the given row,
         * assuming an ordering of cl_collation, cl_to, cl_type, cl_from
         * @param stdClass $row
-        * @param Database $dbw
+        * @param IDatabase $dbw
         * @return string
         */
        function getBatchCondition( $row, $dbw ) {
index b868295..762c5e7 100644 (file)
@@ -3,24 +3,32 @@
   "scripts": {
     "test": "grunt test",
     "doc": "jsduck",
-    "postdoc": "grunt copy:jsduck"
+    "postdoc": "grunt copy:jsduck",
+    "selenium": "killall -0 chromedriver 2>/dev/null || chromedriver --url-base=/wd/hub --port=4444 & grunt webdriver:test; killall chromedriver"
   },
   "devDependencies": {
+    "deepmerge": "1.3.2",
     "eslint": "3.12.2",
     "eslint-config-wikimedia": "0.3.0",
     "grunt": "1.0.1",
-    "grunt-banana-checker": "0.5.0",
+    "grunt-banana-checker": "0.6.0",
     "grunt-contrib-copy": "1.0.0",
     "grunt-contrib-watch": "1.0.0",
     "grunt-eslint": "19.0.0",
     "grunt-jsonlint": "1.1.0",
     "grunt-karma": "2.0.0",
     "grunt-stylelint": "0.7.0",
+    "grunt-webdriver": "2.0.3",
     "karma": "1.1.0",
     "karma-chrome-launcher": "2.0.0",
     "karma-firefox-launcher": "1.0.0",
+    "karma-mocha-reporter": "2.2.3",
     "karma-qunit": "1.0.0",
     "qunitjs": "1.22.0",
-    "stylelint-config-wikimedia": "0.4.1"
+    "stylelint-config-wikimedia": "0.4.1",
+    "wdio-junit-reporter": "0.2.0",
+    "wdio-mocha-framework": "0.5.8",
+    "wdio-spec-reporter": "0.0.5",
+    "webdriverio": "4.6.2"
   }
 }
index 6d08c44..33bdcb9 100644 (file)
@@ -151,21 +151,14 @@ return [
                'targets' => [ 'mobile', 'desktop' ],
        ],
        'jquery.appear' => [
-               'deprecated' => [
-                       'message' => 'Please use "mediawiki.viewport" instead.',
-               ],
+               'deprecated' => 'Please use "mediawiki.viewport" instead.',
                'scripts' => 'resources/lib/jquery/jquery.appear.js',
        ],
-       'jquery.arrowSteps' => [
-               'deprecated' => true,
-               'scripts' => 'resources/src/jquery/jquery.arrowSteps.js',
-               'styles' => 'resources/src/jquery/jquery.arrowSteps.css',
-               'targets' => [ 'desktop', 'mobile' ],
-       ],
        'jquery.async' => [
                'scripts' => 'resources/lib/jquery/jquery.async.js',
        ],
        'jquery.autoEllipsis' => [
+               'deprecated' => 'Use CSS text-overflow instead.',
                'scripts' => 'resources/src/jquery/jquery.autoEllipsis.js',
                'dependencies' => 'jquery.highlightText',
                'targets' => [ 'desktop', 'mobile' ],
@@ -307,6 +300,8 @@ return [
                'targets' => [ 'desktop', 'mobile' ],
        ],
        'jquery.placeholder' => [
+               'deprecated' => 'Use of "jquery.placeholder" is deprecated since MediaWiki 1.29.0',
+
                'scripts' => 'resources/src/jquery/jquery.placeholder.js',
                'targets' => [ 'desktop', 'mobile' ],
        ],
@@ -315,20 +310,13 @@ return [
                'styles' => 'resources/lib/qunitjs/qunit.css',
                'targets' => [ 'desktop', 'mobile' ],
        ],
-       'jquery.qunit.completenessTest' => [
-               'scripts' => 'resources/src/jquery/jquery.qunit.completenessTest.js',
-               'dependencies' => 'jquery.qunit',
-               'targets' => [ 'desktop', 'mobile' ],
-       ],
        'jquery.spinner' => [
                'scripts' => 'resources/src/jquery/jquery.spinner.js',
                'styles' => 'resources/src/jquery/jquery.spinner.css',
                'targets' => [ 'desktop', 'mobile' ],
        ],
        'jquery.jStorage' => [
-               'deprecated' => [
-                       'message' => 'Please use "mediawiki.storage" instead.',
-               ],
+               'deprecated' => 'Please use "mediawiki.storage" instead.',
                'scripts' => 'resources/lib/jquery/jquery.jStorage.js',
        ],
        'jquery.suggestions' => [
@@ -372,9 +360,7 @@ return [
        /* jQuery UI */
 
        'jquery.ui.core' => [
-               'deprecated' => [
-                       'message' => 'Please use "mediawiki.ui.button" or "oojs-ui" instead.',
-               ],
+               'deprecated' => 'Please use "mediawiki.ui.button" or "oojs-ui" instead.',
                'scripts' => 'resources/lib/jquery.ui/jquery.ui.core.js',
                'dependencies' => [
                        'jquery.ui.core.styles',
@@ -731,8 +717,6 @@ return [
        ],
 
        /* json2 */
-
-       // Deprecated since MediaWiki 1.29.0
        'json' => [
                'deprecated' => 'Use of the "json" module is deprecated since MediaWiki 1.29.0',
                'targets' => [ 'desktop', 'mobile' ],
@@ -1092,6 +1076,12 @@ return [
                ],
                'targets' => [ 'desktop', 'mobile' ],
        ],
+       'mediawiki.htmlform.checker' => [
+               'scripts' => [
+                       'resources/src/mediawiki/htmlform/htmlform.Checker.js',
+               ],
+               'targets' => [ 'desktop', 'mobile' ],
+       ],
        'mediawiki.htmlform.ooui' => [
                'scripts' => [
                        'resources/src/mediawiki/htmlform/htmlform.Element.js',
@@ -1188,7 +1178,6 @@ return [
                        'searchsuggest-containing',
                ],
                'dependencies' => [
-                       'jquery.placeholder',
                        'jquery.suggestions',
                        'jquery.getAttrs',
                        'mediawiki.api',
@@ -1312,7 +1301,7 @@ return [
                'dependencies' => [
                        'mediawiki.ForeignStructuredUpload',
                        'mediawiki.Upload.BookletLayout',
-                       'mediawiki.widgets.CategorySelector',
+                       'mediawiki.widgets.CategoryMultiselectWidget',
                        'mediawiki.widgets.DateInputWidget',
                        'mediawiki.jqueryMsg',
                        'mediawiki.api.messages',
@@ -1352,11 +1341,6 @@ 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' => [
@@ -1671,7 +1655,6 @@ return [
                'dependencies' => [
                        'jquery.accessKeyLabel',
                        'jquery.checkboxShiftClick',
-                       'jquery.placeholder',
                        'jquery.mw-jump',
                ],
                'targets' => [ 'desktop', 'mobile' ],
@@ -1796,6 +1779,12 @@ return [
                        'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.HighlightColorPickerWidget.less',
                        'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterItemHighlightButton.less',
                ],
+               'skinStyles' => [
+                       'monobook' => [
+                               'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.Overlay.monobook.less',
+                               'resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.CapsuleItemWidget.monobook.less',
+                       ],
+               ],
                'messages' => [
                        'rcfilters-activefilters',
                        'rcfilters-restore-default-filters',
@@ -1806,13 +1795,20 @@ return [
                        'rcfilters-filterlist-title',
                        'rcfilters-filterlist-feedbacklink',
                        'rcfilters-filterlist-noresults',
+                       'rcfilters-filterlist-whatsthis',
                        'rcfilters-highlightbutton-title',
                        'rcfilters-highlightmenu-title',
                        'rcfilters-highlightmenu-help',
+                       'rcfilters-noresults-conflict',
+                       'rcfilters-state-message-subset',
+                       'rcfilters-state-message-fullcoverage',
                        'recentchanges-noresult',
+                       'quotation-marks',
                ],
                'dependencies' => [
                        'oojs-ui',
+                       'mediawiki.language',
+                       'mediawiki.user',
                        'mediawiki.rcfilters.filters.dm',
                        'oojs-ui.styles.icons-moderation',
                        'oojs-ui.styles.icons-editing-core',
@@ -1899,6 +1895,14 @@ return [
                        'mediawiki.htmlform',
                ],
        ],
+       'mediawiki.special.changecredentials.js' => [
+               'scripts' => 'resources/src/mediawiki.special/mediawiki.special.changecredentials.js',
+               'dependencies' => [
+                       'mediawiki.api',
+                       'mediawiki.htmlform.ooui'
+               ],
+               'targets' => [ 'desktop', 'mobile' ],
+       ],
        'mediawiki.special.changeslist' => [
                'styles' => 'resources/src/mediawiki.special/mediawiki.special.changeslist.css',
                'targets' => [ 'desktop', 'mobile' ],
@@ -2070,7 +2074,6 @@ return [
        'mediawiki.special.userlogin.signup.js' => [
                'scripts' => 'resources/src/mediawiki.special/mediawiki.special.userlogin.signup.js',
                'messages' => [
-                       'createacct-error',
                        'createacct-emailrequired',
                        'noname',
                        'userexists',
@@ -2079,6 +2082,7 @@ return [
                        'mediawiki.api',
                        'mediawiki.jqueryMsg',
                        'jquery.throttle-debounce',
+                       'mediawiki.htmlform.checker',
                ],
        ],
        'mediawiki.special.unwatchedPages' => [
@@ -2244,7 +2248,7 @@ return [
                        'mediawiki.api',
                        'jquery.byteLimit',
                        // TitleOptionWidget
-                       'jquery.autoEllipsis',
+                       'jquery.highlightText',
                ],
                'messages' => [
                        // NamespaceInputWidget
@@ -2351,9 +2355,15 @@ return [
                'targets' => [ 'desktop', 'mobile' ],
        ],
        'mediawiki.widgets.CategorySelector' => [
+               'deprecated' => 'Use "mw.widgets.CategoryMultiselectWidget" instead. See T161285.',
+               'dependencies' => [
+                       'mediawiki.widgets.CategoryMultiselectWidget',
+               ],
+       ],
+       'mediawiki.widgets.CategoryMultiselectWidget' => [
                'scripts' => [
                        'resources/src/mediawiki.widgets/mw.widgets.CategoryCapsuleItemWidget.js',
-                       'resources/src/mediawiki.widgets/mw.widgets.CategorySelector.js',
+                       'resources/src/mediawiki.widgets/mw.widgets.CategoryMultiselectWidget.js',
                ],
                'dependencies' => [
                        'oojs-ui-widgets',
@@ -2363,7 +2373,7 @@ return [
                ],
                'messages' => [
                        'red-link-title',
-                       'mw-widgets-categoryselector-add-category-placeholder'
+                       'mw-widgets-categoryselector-add-category-placeholder',
                ],
                'targets' => [ 'desktop', 'mobile' ],
        ],
@@ -2442,18 +2452,14 @@ return [
                        'oojs-ui-core',
                ],
        ],
+
        /* es5-shim */
        'es5-shim' => [
-               'scripts' => [
-                       'resources/lib/es5-shim/es5-shim.js',
-                       'resources/src/polyfill-object-create.js',
-               ],
+               'deprecated' => 'Use of the "es5-shim" module is deprecated since MediaWiki 1.29.0',
                'targets' => [ 'desktop', 'mobile' ],
-               'skipFunction' => 'resources/src/es5-skip.js',
        ],
 
        /* dom-level2-shim */
-       // Deprecated since MediaWiki 1.29.0
        'dom-level2-shim' => [
                'deprecated' => 'Use of the "dom-level2-shim" module is deprecated since MediaWiki 1.29.0',
                'targets' => [ 'desktop', 'mobile' ],
@@ -2466,9 +2472,6 @@ return [
                        'resources/src/oojs-global.js',
                ],
                'targets' => [ 'desktop', 'mobile' ],
-               'dependencies' => [
-                       'es5-shim',
-               ],
        ],
 
        'mediawiki.router' => [
index c3a287d..9339e98 100644 (file)
@@ -65,7 +65,6 @@ return call_user_func( function () {
                ],
                'skinScripts' => $getSkinSpecific( null, 'js' ),
                'dependencies' => [
-                       'es5-shim',
                        'oojs',
                        'oojs-ui-core.styles',
                        'oojs-ui.styles.icons',
diff --git a/resources/lib/es5-shim/es5-shim.js b/resources/lib/es5-shim/es5-shim.js
deleted file mode 100644 (file)
index 91a7a39..0000000
+++ /dev/null
@@ -1,2051 +0,0 @@
-/*!
- * https://github.com/es-shims/es5-shim
- * @license es5-shim Copyright 2009-2015 by contributors, MIT License
- * see https://github.com/es-shims/es5-shim/blob/master/LICENSE
- */
-
-// vim: ts=4 sts=4 sw=4 expandtab
-
-// Add semicolon to prevent IIFE from being passed as argument to concatenated code.
-;
-
-// UMD (Universal Module Definition)
-// see https://github.com/umdjs/umd/blob/master/templates/returnExports.js
-(function (root, factory) {
-    'use strict';
-
-    /* global define, exports, module */
-    if (typeof define === 'function' && define.amd) {
-        // AMD. Register as an anonymous module.
-        define(factory);
-    } else if (typeof exports === 'object') {
-        // Node. Does not work with strict CommonJS, but
-        // only CommonJS-like enviroments that support module.exports,
-        // like Node.
-        module.exports = factory();
-    } else {
-        // Browser globals (root is window)
-        root.returnExports = factory();
-    }
-}(this, function () {
-
-/**
- * Brings an environment as close to ECMAScript 5 compliance
- * as is possible with the facilities of erstwhile engines.
- *
- * Annotated ES5: http://es5.github.com/ (specific links below)
- * ES5 Spec: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf
- * Required reading: http://javascriptweblog.wordpress.com/2011/12/05/extending-javascript-natives/
- */
-
-// Shortcut to an often accessed properties, in order to avoid multiple
-// dereference that costs universally. This also holds a reference to known-good
-// functions.
-var $Array = Array;
-var ArrayPrototype = $Array.prototype;
-var $Object = Object;
-var ObjectPrototype = $Object.prototype;
-var $Function = Function;
-var FunctionPrototype = $Function.prototype;
-var $String = String;
-var StringPrototype = $String.prototype;
-var $Number = Number;
-var NumberPrototype = $Number.prototype;
-var array_slice = ArrayPrototype.slice;
-var array_splice = ArrayPrototype.splice;
-var array_push = ArrayPrototype.push;
-var array_unshift = ArrayPrototype.unshift;
-var array_concat = ArrayPrototype.concat;
-var array_join = ArrayPrototype.join;
-var call = FunctionPrototype.call;
-var apply = FunctionPrototype.apply;
-var max = Math.max;
-var min = Math.min;
-
-// Having a toString local variable name breaks in Opera so use to_string.
-var to_string = ObjectPrototype.toString;
-
-/* global Symbol */
-/* eslint-disable one-var-declaration-per-line, no-redeclare, max-statements-per-line */
-var hasToStringTag = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol';
-var isCallable; /* inlined from https://npmjs.com/is-callable */ var fnToStr = Function.prototype.toString, constructorRegex = /^\s*class /, isES6ClassFn = function isES6ClassFn(value) { try { var fnStr = fnToStr.call(value); var singleStripped = fnStr.replace(/\/\/.*\n/g, ''); var multiStripped = singleStripped.replace(/\/\*[.\s\S]*\*\//g, ''); var spaceStripped = multiStripped.replace(/\n/mg, ' ').replace(/ {2}/g, ' '); return constructorRegex.test(spaceStripped); } catch (e) { return false; /* not a function */ } }, tryFunctionObject = function tryFunctionObject(value) { try { if (isES6ClassFn(value)) { return false; } fnToStr.call(value); return true; } catch (e) { return false; } }, fnClass = '[object Function]', genClass = '[object GeneratorFunction]', isCallable = function isCallable(value) { if (!value) { return false; } if (typeof value !== 'function' && typeof value !== 'object') { return false; } if (hasToStringTag) { return tryFunctionObject(value); } if (isES6ClassFn(value)) { return false; } var strClass = to_string.call(value); return strClass === fnClass || strClass === genClass; };
-
-var isRegex; /* inlined from https://npmjs.com/is-regex */ var regexExec = RegExp.prototype.exec, tryRegexExec = function tryRegexExec(value) { try { regexExec.call(value); return true; } catch (e) { return false; } }, regexClass = '[object RegExp]'; isRegex = function isRegex(value) { if (typeof value !== 'object') { return false; } return hasToStringTag ? tryRegexExec(value) : to_string.call(value) === regexClass; };
-var isString; /* inlined from https://npmjs.com/is-string */ var strValue = String.prototype.valueOf, tryStringObject = function tryStringObject(value) { try { strValue.call(value); return true; } catch (e) { return false; } }, stringClass = '[object String]'; isString = function isString(value) { if (typeof value === 'string') { return true; } if (typeof value !== 'object') { return false; } return hasToStringTag ? tryStringObject(value) : to_string.call(value) === stringClass; };
-/* eslint-enable one-var-declaration-per-line, no-redeclare, max-statements-per-line */
-
-/* inlined from http://npmjs.com/define-properties */
-var supportsDescriptors = $Object.defineProperty && (function () {
-    try {
-        var obj = {};
-        $Object.defineProperty(obj, 'x', { enumerable: false, value: obj });
-        for (var _ in obj) { return false; }
-        return obj.x === obj;
-    } catch (e) { /* this is ES3 */
-        return false;
-    }
-}());
-var defineProperties = (function (has) {
-  // Define configurable, writable, and non-enumerable props
-  // if they don't exist.
-  var defineProperty;
-  if (supportsDescriptors) {
-      defineProperty = function (object, name, method, forceAssign) {
-          if (!forceAssign && (name in object)) { return; }
-          $Object.defineProperty(object, name, {
-              configurable: true,
-              enumerable: false,
-              writable: true,
-              value: method
-          });
-      };
-  } else {
-      defineProperty = function (object, name, method, forceAssign) {
-          if (!forceAssign && (name in object)) { return; }
-          object[name] = method;
-      };
-  }
-  return function defineProperties(object, map, forceAssign) {
-      for (var name in map) {
-          if (has.call(map, name)) {
-            defineProperty(object, name, map[name], forceAssign);
-          }
-      }
-  };
-}(ObjectPrototype.hasOwnProperty));
-
-//
-// Util
-// ======
-//
-
-/* replaceable with https://npmjs.com/package/es-abstract /helpers/isPrimitive */
-var isPrimitive = function isPrimitive(input) {
-    var type = typeof input;
-    return input === null || (type !== 'object' && type !== 'function');
-};
-
-var isActualNaN = $Number.isNaN || function (x) { return x !== x; };
-
-var ES = {
-    // ES5 9.4
-    // http://es5.github.com/#x9.4
-    // http://jsperf.com/to-integer
-    /* replaceable with https://npmjs.com/package/es-abstract ES5.ToInteger */
-    ToInteger: function ToInteger(num) {
-        var n = +num;
-        if (isActualNaN(n)) {
-            n = 0;
-        } else if (n !== 0 && n !== (1 / 0) && n !== -(1 / 0)) {
-            n = (n > 0 || -1) * Math.floor(Math.abs(n));
-        }
-        return n;
-    },
-
-    /* replaceable with https://npmjs.com/package/es-abstract ES5.ToPrimitive */
-    ToPrimitive: function ToPrimitive(input) {
-        var val, valueOf, toStr;
-        if (isPrimitive(input)) {
-            return input;
-        }
-        valueOf = input.valueOf;
-        if (isCallable(valueOf)) {
-            val = valueOf.call(input);
-            if (isPrimitive(val)) {
-                return val;
-            }
-        }
-        toStr = input.toString;
-        if (isCallable(toStr)) {
-            val = toStr.call(input);
-            if (isPrimitive(val)) {
-                return val;
-            }
-        }
-        throw new TypeError();
-    },
-
-    // ES5 9.9
-    // http://es5.github.com/#x9.9
-    /* replaceable with https://npmjs.com/package/es-abstract ES5.ToObject */
-    ToObject: function (o) {
-        if (o == null) { // this matches both null and undefined
-            throw new TypeError("can't convert " + o + ' to object');
-        }
-        return $Object(o);
-    },
-
-    /* replaceable with https://npmjs.com/package/es-abstract ES5.ToUint32 */
-    ToUint32: function ToUint32(x) {
-        return x >>> 0;
-    }
-};
-
-//
-// Function
-// ========
-//
-
-// ES-5 15.3.4.5
-// http://es5.github.com/#x15.3.4.5
-
-var Empty = function Empty() {};
-
-defineProperties(FunctionPrototype, {
-    bind: function bind(that) { // .length is 1
-        // 1. Let Target be the this value.
-        var target = this;
-        // 2. If IsCallable(Target) is false, throw a TypeError exception.
-        if (!isCallable(target)) {
-            throw new TypeError('Function.prototype.bind called on incompatible ' + target);
-        }
-        // 3. Let A be a new (possibly empty) internal list of all of the
-        //   argument values provided after thisArg (arg1, arg2 etc), in order.
-        // XXX slicedArgs will stand in for "A" if used
-        var args = array_slice.call(arguments, 1); // for normal call
-        // 4. Let F be a new native ECMAScript object.
-        // 11. Set the [[Prototype]] internal property of F to the standard
-        //   built-in Function prototype object as specified in 15.3.3.1.
-        // 12. Set the [[Call]] internal property of F as described in
-        //   15.3.4.5.1.
-        // 13. Set the [[Construct]] internal property of F as described in
-        //   15.3.4.5.2.
-        // 14. Set the [[HasInstance]] internal property of F as described in
-        //   15.3.4.5.3.
-        var bound;
-        var binder = function () {
-
-            if (this instanceof bound) {
-                // 15.3.4.5.2 [[Construct]]
-                // When the [[Construct]] internal method of a function object,
-                // F that was created using the bind function is called with a
-                // list of arguments ExtraArgs, the following steps are taken:
-                // 1. Let target be the value of F's [[TargetFunction]]
-                //   internal property.
-                // 2. If target has no [[Construct]] internal method, a
-                //   TypeError exception is thrown.
-                // 3. Let boundArgs be the value of F's [[BoundArgs]] internal
-                //   property.
-                // 4. Let args be a new list containing the same values as the
-                //   list boundArgs in the same order followed by the same
-                //   values as the list ExtraArgs in the same order.
-                // 5. Return the result of calling the [[Construct]] internal
-                //   method of target providing args as the arguments.
-
-                var result = apply.call(
-                    target,
-                    this,
-                    array_concat.call(args, array_slice.call(arguments))
-                );
-                if ($Object(result) === result) {
-                    return result;
-                }
-                return this;
-
-            } else {
-                // 15.3.4.5.1 [[Call]]
-                // When the [[Call]] internal method of a function object, F,
-                // which was created using the bind function is called with a
-                // this value and a list of arguments ExtraArgs, the following
-                // steps are taken:
-                // 1. Let boundArgs be the value of F's [[BoundArgs]] internal
-                //   property.
-                // 2. Let boundThis be the value of F's [[BoundThis]] internal
-                //   property.
-                // 3. Let target be the value of F's [[TargetFunction]] internal
-                //   property.
-                // 4. Let args be a new list containing the same values as the
-                //   list boundArgs in the same order followed by the same
-                //   values as the list ExtraArgs in the same order.
-                // 5. Return the result of calling the [[Call]] internal method
-                //   of target providing boundThis as the this value and
-                //   providing args as the arguments.
-
-                // equiv: target.call(this, ...boundArgs, ...args)
-                return apply.call(
-                    target,
-                    that,
-                    array_concat.call(args, array_slice.call(arguments))
-                );
-
-            }
-
-        };
-
-        // 15. If the [[Class]] internal property of Target is "Function", then
-        //     a. Let L be the length property of Target minus the length of A.
-        //     b. Set the length own property of F to either 0 or L, whichever is
-        //       larger.
-        // 16. Else set the length own property of F to 0.
-
-        var boundLength = max(0, target.length - args.length);
-
-        // 17. Set the attributes of the length own property of F to the values
-        //   specified in 15.3.5.1.
-        var boundArgs = [];
-        for (var i = 0; i < boundLength; i++) {
-            array_push.call(boundArgs, '$' + i);
-        }
-
-        // XXX Build a dynamic function with desired amount of arguments is the only
-        // way to set the length property of a function.
-        // In environments where Content Security Policies enabled (Chrome extensions,
-        // for ex.) all use of eval or Function costructor throws an exception.
-        // However in all of these environments Function.prototype.bind exists
-        // and so this code will never be executed.
-        bound = $Function('binder', 'return function (' + array_join.call(boundArgs, ',') + '){ return binder.apply(this, arguments); }')(binder);
-
-        if (target.prototype) {
-            Empty.prototype = target.prototype;
-            bound.prototype = new Empty();
-            // Clean up dangling references.
-            Empty.prototype = null;
-        }
-
-        // TODO
-        // 18. Set the [[Extensible]] internal property of F to true.
-
-        // TODO
-        // 19. Let thrower be the [[ThrowTypeError]] function Object (13.2.3).
-        // 20. Call the [[DefineOwnProperty]] internal method of F with
-        //   arguments "caller", PropertyDescriptor {[[Get]]: thrower, [[Set]]:
-        //   thrower, [[Enumerable]]: false, [[Configurable]]: false}, and
-        //   false.
-        // 21. Call the [[DefineOwnProperty]] internal method of F with
-        //   arguments "arguments", PropertyDescriptor {[[Get]]: thrower,
-        //   [[Set]]: thrower, [[Enumerable]]: false, [[Configurable]]: false},
-        //   and false.
-
-        // TODO
-        // NOTE Function objects created using Function.prototype.bind do not
-        // have a prototype property or the [[Code]], [[FormalParameters]], and
-        // [[Scope]] internal properties.
-        // XXX can't delete prototype in pure-js.
-
-        // 22. Return F.
-        return bound;
-    }
-});
-
-// _Please note: Shortcuts are defined after `Function.prototype.bind` as we
-// use it in defining shortcuts.
-var owns = call.bind(ObjectPrototype.hasOwnProperty);
-var toStr = call.bind(ObjectPrototype.toString);
-var arraySlice = call.bind(array_slice);
-var arraySliceApply = apply.bind(array_slice);
-var strSlice = call.bind(StringPrototype.slice);
-var strSplit = call.bind(StringPrototype.split);
-var strIndexOf = call.bind(StringPrototype.indexOf);
-var pushCall = call.bind(array_push);
-var isEnum = call.bind(ObjectPrototype.propertyIsEnumerable);
-var arraySort = call.bind(ArrayPrototype.sort);
-
-//
-// Array
-// =====
-//
-
-var isArray = $Array.isArray || function isArray(obj) {
-    return toStr(obj) === '[object Array]';
-};
-
-// ES5 15.4.4.12
-// http://es5.github.com/#x15.4.4.13
-// Return len+argCount.
-// [bugfix, ielt8]
-// IE < 8 bug: [].unshift(0) === undefined but should be "1"
-var hasUnshiftReturnValueBug = [].unshift(0) !== 1;
-defineProperties(ArrayPrototype, {
-    unshift: function () {
-        array_unshift.apply(this, arguments);
-        return this.length;
-    }
-}, hasUnshiftReturnValueBug);
-
-// ES5 15.4.3.2
-// http://es5.github.com/#x15.4.3.2
-// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/isArray
-defineProperties($Array, { isArray: isArray });
-
-// The IsCallable() check in the Array functions
-// has been replaced with a strict check on the
-// internal class of the object to trap cases where
-// the provided function was actually a regular
-// expression literal, which in V8 and
-// JavaScriptCore is a typeof "function".  Only in
-// V8 are regular expression literals permitted as
-// reduce parameters, so it is desirable in the
-// general case for the shim to match the more
-// strict and common behavior of rejecting regular
-// expressions.
-
-// ES5 15.4.4.18
-// http://es5.github.com/#x15.4.4.18
-// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/array/forEach
-
-// Check failure of by-index access of string characters (IE < 9)
-// and failure of `0 in boxedString` (Rhino)
-var boxedString = $Object('a');
-var splitString = boxedString[0] !== 'a' || !(0 in boxedString);
-
-var properlyBoxesContext = function properlyBoxed(method) {
-    // Check node 0.6.21 bug where third parameter is not boxed
-    var properlyBoxesNonStrict = true;
-    var properlyBoxesStrict = true;
-    var threwException = false;
-    if (method) {
-        try {
-            method.call('foo', function (_, __, context) {
-                if (typeof context !== 'object') {
-                    properlyBoxesNonStrict = false;
-                }
-            });
-
-            method.call([1], function () {
-                'use strict';
-
-                properlyBoxesStrict = typeof this === 'string';
-            }, 'x');
-        } catch (e) {
-            threwException = true;
-        }
-    }
-    return !!method && !threwException && properlyBoxesNonStrict && properlyBoxesStrict;
-};
-
-defineProperties(ArrayPrototype, {
-    forEach: function forEach(callbackfn/*, thisArg*/) {
-        var object = ES.ToObject(this);
-        var self = splitString && isString(this) ? strSplit(this, '') : object;
-        var i = -1;
-        var length = ES.ToUint32(self.length);
-        var T;
-        if (arguments.length > 1) {
-          T = arguments[1];
-        }
-
-        // If no callback function or if callback is not a callable function
-        if (!isCallable(callbackfn)) {
-            throw new TypeError('Array.prototype.forEach callback must be a function');
-        }
-
-        while (++i < length) {
-            if (i in self) {
-                // Invoke the callback function with call, passing arguments:
-                // context, property value, property key, thisArg object
-                if (typeof T === 'undefined') {
-                    callbackfn(self[i], i, object);
-                } else {
-                    callbackfn.call(T, self[i], i, object);
-                }
-            }
-        }
-    }
-}, !properlyBoxesContext(ArrayPrototype.forEach));
-
-// ES5 15.4.4.19
-// http://es5.github.com/#x15.4.4.19
-// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/map
-defineProperties(ArrayPrototype, {
-    map: function map(callbackfn/*, thisArg*/) {
-        var object = ES.ToObject(this);
-        var self = splitString && isString(this) ? strSplit(this, '') : object;
-        var length = ES.ToUint32(self.length);
-        var result = $Array(length);
-        var T;
-        if (arguments.length > 1) {
-            T = arguments[1];
-        }
-
-        // If no callback function or if callback is not a callable function
-        if (!isCallable(callbackfn)) {
-            throw new TypeError('Array.prototype.map callback must be a function');
-        }
-
-        for (var i = 0; i < length; i++) {
-            if (i in self) {
-                if (typeof T === 'undefined') {
-                    result[i] = callbackfn(self[i], i, object);
-                } else {
-                    result[i] = callbackfn.call(T, self[i], i, object);
-                }
-            }
-        }
-        return result;
-    }
-}, !properlyBoxesContext(ArrayPrototype.map));
-
-// ES5 15.4.4.20
-// http://es5.github.com/#x15.4.4.20
-// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/filter
-defineProperties(ArrayPrototype, {
-    filter: function filter(callbackfn/*, thisArg*/) {
-        var object = ES.ToObject(this);
-        var self = splitString && isString(this) ? strSplit(this, '') : object;
-        var length = ES.ToUint32(self.length);
-        var result = [];
-        var value;
-        var T;
-        if (arguments.length > 1) {
-            T = arguments[1];
-        }
-
-        // If no callback function or if callback is not a callable function
-        if (!isCallable(callbackfn)) {
-            throw new TypeError('Array.prototype.filter callback must be a function');
-        }
-
-        for (var i = 0; i < length; i++) {
-            if (i in self) {
-                value = self[i];
-                if (typeof T === 'undefined' ? callbackfn(value, i, object) : callbackfn.call(T, value, i, object)) {
-                    pushCall(result, value);
-                }
-            }
-        }
-        return result;
-    }
-}, !properlyBoxesContext(ArrayPrototype.filter));
-
-// ES5 15.4.4.16
-// http://es5.github.com/#x15.4.4.16
-// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/every
-defineProperties(ArrayPrototype, {
-    every: function every(callbackfn/*, thisArg*/) {
-        var object = ES.ToObject(this);
-        var self = splitString && isString(this) ? strSplit(this, '') : object;
-        var length = ES.ToUint32(self.length);
-        var T;
-        if (arguments.length > 1) {
-            T = arguments[1];
-        }
-
-        // If no callback function or if callback is not a callable function
-        if (!isCallable(callbackfn)) {
-            throw new TypeError('Array.prototype.every callback must be a function');
-        }
-
-        for (var i = 0; i < length; i++) {
-            if (i in self && !(typeof T === 'undefined' ? callbackfn(self[i], i, object) : callbackfn.call(T, self[i], i, object))) {
-                return false;
-            }
-        }
-        return true;
-    }
-}, !properlyBoxesContext(ArrayPrototype.every));
-
-// ES5 15.4.4.17
-// http://es5.github.com/#x15.4.4.17
-// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/some
-defineProperties(ArrayPrototype, {
-    some: function some(callbackfn/*, thisArg */) {
-        var object = ES.ToObject(this);
-        var self = splitString && isString(this) ? strSplit(this, '') : object;
-        var length = ES.ToUint32(self.length);
-        var T;
-        if (arguments.length > 1) {
-            T = arguments[1];
-        }
-
-        // If no callback function or if callback is not a callable function
-        if (!isCallable(callbackfn)) {
-            throw new TypeError('Array.prototype.some callback must be a function');
-        }
-
-        for (var i = 0; i < length; i++) {
-            if (i in self && (typeof T === 'undefined' ? callbackfn(self[i], i, object) : callbackfn.call(T, self[i], i, object))) {
-                return true;
-            }
-        }
-        return false;
-    }
-}, !properlyBoxesContext(ArrayPrototype.some));
-
-// ES5 15.4.4.21
-// http://es5.github.com/#x15.4.4.21
-// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/reduce
-var reduceCoercesToObject = false;
-if (ArrayPrototype.reduce) {
-    reduceCoercesToObject = typeof ArrayPrototype.reduce.call('es5', function (_, __, ___, list) {
-        return list;
-    }) === 'object';
-}
-defineProperties(ArrayPrototype, {
-    reduce: function reduce(callbackfn/*, initialValue*/) {
-        var object = ES.ToObject(this);
-        var self = splitString && isString(this) ? strSplit(this, '') : object;
-        var length = ES.ToUint32(self.length);
-
-        // If no callback function or if callback is not a callable function
-        if (!isCallable(callbackfn)) {
-            throw new TypeError('Array.prototype.reduce callback must be a function');
-        }
-
-        // no value to return if no initial value and an empty array
-        if (length === 0 && arguments.length === 1) {
-            throw new TypeError('reduce of empty array with no initial value');
-        }
-
-        var i = 0;
-        var result;
-        if (arguments.length >= 2) {
-            result = arguments[1];
-        } else {
-            do {
-                if (i in self) {
-                    result = self[i++];
-                    break;
-                }
-
-                // if array contains no values, no initial value to return
-                if (++i >= length) {
-                    throw new TypeError('reduce of empty array with no initial value');
-                }
-            } while (true);
-        }
-
-        for (; i < length; i++) {
-            if (i in self) {
-                result = callbackfn(result, self[i], i, object);
-            }
-        }
-
-        return result;
-    }
-}, !reduceCoercesToObject);
-
-// ES5 15.4.4.22
-// http://es5.github.com/#x15.4.4.22
-// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/reduceRight
-var reduceRightCoercesToObject = false;
-if (ArrayPrototype.reduceRight) {
-    reduceRightCoercesToObject = typeof ArrayPrototype.reduceRight.call('es5', function (_, __, ___, list) {
-        return list;
-    }) === 'object';
-}
-defineProperties(ArrayPrototype, {
-    reduceRight: function reduceRight(callbackfn/*, initial*/) {
-        var object = ES.ToObject(this);
-        var self = splitString && isString(this) ? strSplit(this, '') : object;
-        var length = ES.ToUint32(self.length);
-
-        // If no callback function or if callback is not a callable function
-        if (!isCallable(callbackfn)) {
-            throw new TypeError('Array.prototype.reduceRight callback must be a function');
-        }
-
-        // no value to return if no initial value, empty array
-        if (length === 0 && arguments.length === 1) {
-            throw new TypeError('reduceRight of empty array with no initial value');
-        }
-
-        var result;
-        var i = length - 1;
-        if (arguments.length >= 2) {
-            result = arguments[1];
-        } else {
-            do {
-                if (i in self) {
-                    result = self[i--];
-                    break;
-                }
-
-                // if array contains no values, no initial value to return
-                if (--i < 0) {
-                    throw new TypeError('reduceRight of empty array with no initial value');
-                }
-            } while (true);
-        }
-
-        if (i < 0) {
-            return result;
-        }
-
-        do {
-            if (i in self) {
-                result = callbackfn(result, self[i], i, object);
-            }
-        } while (i--);
-
-        return result;
-    }
-}, !reduceRightCoercesToObject);
-
-// ES5 15.4.4.14
-// http://es5.github.com/#x15.4.4.14
-// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/indexOf
-var hasFirefox2IndexOfBug = ArrayPrototype.indexOf && [0, 1].indexOf(1, 2) !== -1;
-defineProperties(ArrayPrototype, {
-    indexOf: function indexOf(searchElement/*, fromIndex */) {
-        var self = splitString && isString(this) ? strSplit(this, '') : ES.ToObject(this);
-        var length = ES.ToUint32(self.length);
-
-        if (length === 0) {
-            return -1;
-        }
-
-        var i = 0;
-        if (arguments.length > 1) {
-            i = ES.ToInteger(arguments[1]);
-        }
-
-        // handle negative indices
-        i = i >= 0 ? i : max(0, length + i);
-        for (; i < length; i++) {
-            if (i in self && self[i] === searchElement) {
-                return i;
-            }
-        }
-        return -1;
-    }
-}, hasFirefox2IndexOfBug);
-
-// ES5 15.4.4.15
-// http://es5.github.com/#x15.4.4.15
-// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/lastIndexOf
-var hasFirefox2LastIndexOfBug = ArrayPrototype.lastIndexOf && [0, 1].lastIndexOf(0, -3) !== -1;
-defineProperties(ArrayPrototype, {
-    lastIndexOf: function lastIndexOf(searchElement/*, fromIndex */) {
-        var self = splitString && isString(this) ? strSplit(this, '') : ES.ToObject(this);
-        var length = ES.ToUint32(self.length);
-
-        if (length === 0) {
-            return -1;
-        }
-        var i = length - 1;
-        if (arguments.length > 1) {
-            i = min(i, ES.ToInteger(arguments[1]));
-        }
-        // handle negative indices
-        i = i >= 0 ? i : length - Math.abs(i);
-        for (; i >= 0; i--) {
-            if (i in self && searchElement === self[i]) {
-                return i;
-            }
-        }
-        return -1;
-    }
-}, hasFirefox2LastIndexOfBug);
-
-// ES5 15.4.4.12
-// http://es5.github.com/#x15.4.4.12
-var spliceNoopReturnsEmptyArray = (function () {
-    var a = [1, 2];
-    var result = a.splice();
-    return a.length === 2 && isArray(result) && result.length === 0;
-}());
-defineProperties(ArrayPrototype, {
-    // Safari 5.0 bug where .splice() returns undefined
-    splice: function splice(start, deleteCount) {
-        if (arguments.length === 0) {
-            return [];
-        } else {
-            return array_splice.apply(this, arguments);
-        }
-    }
-}, !spliceNoopReturnsEmptyArray);
-
-var spliceWorksWithEmptyObject = (function () {
-    var obj = {};
-    ArrayPrototype.splice.call(obj, 0, 0, 1);
-    return obj.length === 1;
-}());
-defineProperties(ArrayPrototype, {
-    splice: function splice(start, deleteCount) {
-        if (arguments.length === 0) { return []; }
-        var args = arguments;
-        this.length = max(ES.ToInteger(this.length), 0);
-        if (arguments.length > 0 && typeof deleteCount !== 'number') {
-            args = arraySlice(arguments);
-            if (args.length < 2) {
-                pushCall(args, this.length - start);
-            } else {
-                args[1] = ES.ToInteger(deleteCount);
-            }
-        }
-        return array_splice.apply(this, args);
-    }
-}, !spliceWorksWithEmptyObject);
-var spliceWorksWithLargeSparseArrays = (function () {
-    // Per https://github.com/es-shims/es5-shim/issues/295
-    // Safari 7/8 breaks with sparse arrays of size 1e5 or greater
-    var arr = new $Array(1e5);
-    // note: the index MUST be 8 or larger or the test will false pass
-    arr[8] = 'x';
-    arr.splice(1, 1);
-    // note: this test must be defined *after* the indexOf shim
-    // per https://github.com/es-shims/es5-shim/issues/313
-    return arr.indexOf('x') === 7;
-}());
-var spliceWorksWithSmallSparseArrays = (function () {
-    // Per https://github.com/es-shims/es5-shim/issues/295
-    // Opera 12.15 breaks on this, no idea why.
-    var n = 256;
-    var arr = [];
-    arr[n] = 'a';
-    arr.splice(n + 1, 0, 'b');
-    return arr[n] === 'a';
-}());
-defineProperties(ArrayPrototype, {
-    splice: function splice(start, deleteCount) {
-        var O = ES.ToObject(this);
-        var A = [];
-        var len = ES.ToUint32(O.length);
-        var relativeStart = ES.ToInteger(start);
-        var actualStart = relativeStart < 0 ? max((len + relativeStart), 0) : min(relativeStart, len);
-        var actualDeleteCount = min(max(ES.ToInteger(deleteCount), 0), len - actualStart);
-
-        var k = 0;
-        var from;
-        while (k < actualDeleteCount) {
-            from = $String(actualStart + k);
-            if (owns(O, from)) {
-                A[k] = O[from];
-            }
-            k += 1;
-        }
-
-        var items = arraySlice(arguments, 2);
-        var itemCount = items.length;
-        var to;
-        if (itemCount < actualDeleteCount) {
-            k = actualStart;
-            var maxK = len - actualDeleteCount;
-            while (k < maxK) {
-                from = $String(k + actualDeleteCount);
-                to = $String(k + itemCount);
-                if (owns(O, from)) {
-                    O[to] = O[from];
-                } else {
-                    delete O[to];
-                }
-                k += 1;
-            }
-            k = len;
-            var minK = len - actualDeleteCount + itemCount;
-            while (k > minK) {
-                delete O[k - 1];
-                k -= 1;
-            }
-        } else if (itemCount > actualDeleteCount) {
-            k = len - actualDeleteCount;
-            while (k > actualStart) {
-                from = $String(k + actualDeleteCount - 1);
-                to = $String(k + itemCount - 1);
-                if (owns(O, from)) {
-                    O[to] = O[from];
-                } else {
-                    delete O[to];
-                }
-                k -= 1;
-            }
-        }
-        k = actualStart;
-        for (var i = 0; i < items.length; ++i) {
-            O[k] = items[i];
-            k += 1;
-        }
-        O.length = len - actualDeleteCount + itemCount;
-
-        return A;
-    }
-}, !spliceWorksWithLargeSparseArrays || !spliceWorksWithSmallSparseArrays);
-
-var originalJoin = ArrayPrototype.join;
-var hasStringJoinBug;
-try {
-    hasStringJoinBug = Array.prototype.join.call('123', ',') !== '1,2,3';
-} catch (e) {
-    hasStringJoinBug = true;
-}
-if (hasStringJoinBug) {
-    defineProperties(ArrayPrototype, {
-        join: function join(separator) {
-            var sep = typeof separator === 'undefined' ? ',' : separator;
-            return originalJoin.call(isString(this) ? strSplit(this, '') : this, sep);
-        }
-    }, hasStringJoinBug);
-}
-
-var hasJoinUndefinedBug = [1, 2].join(undefined) !== '1,2';
-if (hasJoinUndefinedBug) {
-    defineProperties(ArrayPrototype, {
-        join: function join(separator) {
-            var sep = typeof separator === 'undefined' ? ',' : separator;
-            return originalJoin.call(this, sep);
-        }
-    }, hasJoinUndefinedBug);
-}
-
-var pushShim = function push(item) {
-    var O = ES.ToObject(this);
-    var n = ES.ToUint32(O.length);
-    var i = 0;
-    while (i < arguments.length) {
-        O[n + i] = arguments[i];
-        i += 1;
-    }
-    O.length = n + i;
-    return n + i;
-};
-
-var pushIsNotGeneric = (function () {
-    var obj = {};
-    var result = Array.prototype.push.call(obj, undefined);
-    return result !== 1 || obj.length !== 1 || typeof obj[0] !== 'undefined' || !owns(obj, 0);
-}());
-defineProperties(ArrayPrototype, {
-    push: function push(item) {
-        if (isArray(this)) {
-            return array_push.apply(this, arguments);
-        }
-        return pushShim.apply(this, arguments);
-    }
-}, pushIsNotGeneric);
-
-// This fixes a very weird bug in Opera 10.6 when pushing `undefined
-var pushUndefinedIsWeird = (function () {
-    var arr = [];
-    var result = arr.push(undefined);
-    return result !== 1 || arr.length !== 1 || typeof arr[0] !== 'undefined' || !owns(arr, 0);
-}());
-defineProperties(ArrayPrototype, { push: pushShim }, pushUndefinedIsWeird);
-
-// ES5 15.2.3.14
-// http://es5.github.io/#x15.4.4.10
-// Fix boxed string bug
-defineProperties(ArrayPrototype, {
-    slice: function (start, end) {
-        var arr = isString(this) ? strSplit(this, '') : this;
-        return arraySliceApply(arr, arguments);
-    }
-}, splitString);
-
-var sortIgnoresNonFunctions = (function () {
-    try {
-        [1, 2].sort(null);
-        [1, 2].sort({});
-        return true;
-    } catch (e) { /**/ }
-    return false;
-}());
-var sortThrowsOnRegex = (function () {
-    // this is a problem in Firefox 4, in which `typeof /a/ === 'function'`
-    try {
-        [1, 2].sort(/a/);
-        return false;
-    } catch (e) { /**/ }
-    return true;
-}());
-var sortIgnoresUndefined = (function () {
-    // applies in IE 8, for one.
-    try {
-        [1, 2].sort(undefined);
-        return true;
-    } catch (e) { /**/ }
-    return false;
-}());
-defineProperties(ArrayPrototype, {
-    sort: function sort(compareFn) {
-        if (typeof compareFn === 'undefined') {
-            return arraySort(this);
-        }
-        if (!isCallable(compareFn)) {
-            throw new TypeError('Array.prototype.sort callback must be a function');
-        }
-        return arraySort(this, compareFn);
-    }
-}, sortIgnoresNonFunctions || !sortIgnoresUndefined || !sortThrowsOnRegex);
-
-//
-// Object
-// ======
-//
-
-// ES5 15.2.3.14
-// http://es5.github.com/#x15.2.3.14
-
-// http://whattheheadsaid.com/2010/10/a-safer-object-keys-compatibility-implementation
-var hasDontEnumBug = !({ 'toString': null }).propertyIsEnumerable('toString');
-var hasProtoEnumBug = function () {}.propertyIsEnumerable('prototype');
-var hasStringEnumBug = !owns('x', '0');
-var equalsConstructorPrototype = function (o) {
-    var ctor = o.constructor;
-    return ctor && ctor.prototype === o;
-};
-var blacklistedKeys = {
-    $window: true,
-    $console: true,
-    $parent: true,
-    $self: true,
-    $frame: true,
-    $frames: true,
-    $frameElement: true,
-    $webkitIndexedDB: true,
-    $webkitStorageInfo: true,
-    $external: true
-};
-var hasAutomationEqualityBug = (function () {
-    /* globals window */
-    if (typeof window === 'undefined') { return false; }
-    for (var k in window) {
-        try {
-            if (!blacklistedKeys['$' + k] && owns(window, k) && window[k] !== null && typeof window[k] === 'object') {
-                equalsConstructorPrototype(window[k]);
-            }
-        } catch (e) {
-            return true;
-        }
-    }
-    return false;
-}());
-var equalsConstructorPrototypeIfNotBuggy = function (object) {
-    if (typeof window === 'undefined' || !hasAutomationEqualityBug) { return equalsConstructorPrototype(object); }
-    try {
-        return equalsConstructorPrototype(object);
-    } catch (e) {
-        return false;
-    }
-};
-var dontEnums = [
-    'toString',
-    'toLocaleString',
-    'valueOf',
-    'hasOwnProperty',
-    'isPrototypeOf',
-    'propertyIsEnumerable',
-    'constructor'
-];
-var dontEnumsLength = dontEnums.length;
-
-// taken directly from https://github.com/ljharb/is-arguments/blob/master/index.js
-// can be replaced with require('is-arguments') if we ever use a build process instead
-var isStandardArguments = function isArguments(value) {
-    return toStr(value) === '[object Arguments]';
-};
-var isLegacyArguments = function isArguments(value) {
-    return value !== null &&
-        typeof value === 'object' &&
-        typeof value.length === 'number' &&
-        value.length >= 0 &&
-        !isArray(value) &&
-        isCallable(value.callee);
-};
-var isArguments = isStandardArguments(arguments) ? isStandardArguments : isLegacyArguments;
-
-defineProperties($Object, {
-    keys: function keys(object) {
-        var isFn = isCallable(object);
-        var isArgs = isArguments(object);
-        var isObject = object !== null && typeof object === 'object';
-        var isStr = isObject && isString(object);
-
-        if (!isObject && !isFn && !isArgs) {
-            throw new TypeError('Object.keys called on a non-object');
-        }
-
-        var theKeys = [];
-        var skipProto = hasProtoEnumBug && isFn;
-        if ((isStr && hasStringEnumBug) || isArgs) {
-            for (var i = 0; i < object.length; ++i) {
-                pushCall(theKeys, $String(i));
-            }
-        }
-
-        if (!isArgs) {
-            for (var name in object) {
-                if (!(skipProto && name === 'prototype') && owns(object, name)) {
-                    pushCall(theKeys, $String(name));
-                }
-            }
-        }
-
-        if (hasDontEnumBug) {
-            var skipConstructor = equalsConstructorPrototypeIfNotBuggy(object);
-            for (var j = 0; j < dontEnumsLength; j++) {
-                var dontEnum = dontEnums[j];
-                if (!(skipConstructor && dontEnum === 'constructor') && owns(object, dontEnum)) {
-                    pushCall(theKeys, dontEnum);
-                }
-            }
-        }
-        return theKeys;
-    }
-});
-
-var keysWorksWithArguments = $Object.keys && (function () {
-    // Safari 5.0 bug
-    return $Object.keys(arguments).length === 2;
-}(1, 2));
-var keysHasArgumentsLengthBug = $Object.keys && (function () {
-    var argKeys = $Object.keys(arguments);
-    return arguments.length !== 1 || argKeys.length !== 1 || argKeys[0] !== 1;
-}(1));
-var originalKeys = $Object.keys;
-defineProperties($Object, {
-    keys: function keys(object) {
-        if (isArguments(object)) {
-            return originalKeys(arraySlice(object));
-        } else {
-            return originalKeys(object);
-        }
-    }
-}, !keysWorksWithArguments || keysHasArgumentsLengthBug);
-
-//
-// Date
-// ====
-//
-
-var hasNegativeMonthYearBug = new Date(-3509827329600292).getUTCMonth() !== 0;
-var aNegativeTestDate = new Date(-1509842289600292);
-var aPositiveTestDate = new Date(1449662400000);
-var hasToUTCStringFormatBug = aNegativeTestDate.toUTCString() !== 'Mon, 01 Jan -45875 11:59:59 GMT';
-var hasToDateStringFormatBug;
-var hasToStringFormatBug;
-var timeZoneOffset = aNegativeTestDate.getTimezoneOffset();
-if (timeZoneOffset < -720) {
-    hasToDateStringFormatBug = aNegativeTestDate.toDateString() !== 'Tue Jan 02 -45875';
-    hasToStringFormatBug = !(/^Thu Dec 10 2015 \d\d:\d\d:\d\d GMT[-\+]\d\d\d\d(?: |$)/).test(aPositiveTestDate.toString());
-} else {
-    hasToDateStringFormatBug = aNegativeTestDate.toDateString() !== 'Mon Jan 01 -45875';
-    hasToStringFormatBug = !(/^Wed Dec 09 2015 \d\d:\d\d:\d\d GMT[-\+]\d\d\d\d(?: |$)/).test(aPositiveTestDate.toString());
-}
-
-var originalGetFullYear = call.bind(Date.prototype.getFullYear);
-var originalGetMonth = call.bind(Date.prototype.getMonth);
-var originalGetDate = call.bind(Date.prototype.getDate);
-var originalGetUTCFullYear = call.bind(Date.prototype.getUTCFullYear);
-var originalGetUTCMonth = call.bind(Date.prototype.getUTCMonth);
-var originalGetUTCDate = call.bind(Date.prototype.getUTCDate);
-var originalGetUTCDay = call.bind(Date.prototype.getUTCDay);
-var originalGetUTCHours = call.bind(Date.prototype.getUTCHours);
-var originalGetUTCMinutes = call.bind(Date.prototype.getUTCMinutes);
-var originalGetUTCSeconds = call.bind(Date.prototype.getUTCSeconds);
-var originalGetUTCMilliseconds = call.bind(Date.prototype.getUTCMilliseconds);
-var dayName = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
-var monthName = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
-var daysInMonth = function daysInMonth(month, year) {
-    return originalGetDate(new Date(year, month, 0));
-};
-
-defineProperties(Date.prototype, {
-    getFullYear: function getFullYear() {
-        if (!this || !(this instanceof Date)) {
-            throw new TypeError('this is not a Date object.');
-        }
-        var year = originalGetFullYear(this);
-        if (year < 0 && originalGetMonth(this) > 11) {
-            return year + 1;
-        }
-        return year;
-    },
-    getMonth: function getMonth() {
-        if (!this || !(this instanceof Date)) {
-            throw new TypeError('this is not a Date object.');
-        }
-        var year = originalGetFullYear(this);
-        var month = originalGetMonth(this);
-        if (year < 0 && month > 11) {
-            return 0;
-        }
-        return month;
-    },
-    getDate: function getDate() {
-        if (!this || !(this instanceof Date)) {
-            throw new TypeError('this is not a Date object.');
-        }
-        var year = originalGetFullYear(this);
-        var month = originalGetMonth(this);
-        var date = originalGetDate(this);
-        if (year < 0 && month > 11) {
-            if (month === 12) {
-                return date;
-            }
-            var days = daysInMonth(0, year + 1);
-            return (days - date) + 1;
-        }
-        return date;
-    },
-    getUTCFullYear: function getUTCFullYear() {
-        if (!this || !(this instanceof Date)) {
-            throw new TypeError('this is not a Date object.');
-        }
-        var year = originalGetUTCFullYear(this);
-        if (year < 0 && originalGetUTCMonth(this) > 11) {
-            return year + 1;
-        }
-        return year;
-    },
-    getUTCMonth: function getUTCMonth() {
-        if (!this || !(this instanceof Date)) {
-            throw new TypeError('this is not a Date object.');
-        }
-        var year = originalGetUTCFullYear(this);
-        var month = originalGetUTCMonth(this);
-        if (year < 0 && month > 11) {
-            return 0;
-        }
-        return month;
-    },
-    getUTCDate: function getUTCDate() {
-        if (!this || !(this instanceof Date)) {
-            throw new TypeError('this is not a Date object.');
-        }
-        var year = originalGetUTCFullYear(this);
-        var month = originalGetUTCMonth(this);
-        var date = originalGetUTCDate(this);
-        if (year < 0 && month > 11) {
-            if (month === 12) {
-                return date;
-            }
-            var days = daysInMonth(0, year + 1);
-            return (days - date) + 1;
-        }
-        return date;
-    }
-}, hasNegativeMonthYearBug);
-
-defineProperties(Date.prototype, {
-    toUTCString: function toUTCString() {
-        if (!this || !(this instanceof Date)) {
-            throw new TypeError('this is not a Date object.');
-        }
-        var day = originalGetUTCDay(this);
-        var date = originalGetUTCDate(this);
-        var month = originalGetUTCMonth(this);
-        var year = originalGetUTCFullYear(this);
-        var hour = originalGetUTCHours(this);
-        var minute = originalGetUTCMinutes(this);
-        var second = originalGetUTCSeconds(this);
-        return dayName[day] + ', ' +
-            (date < 10 ? '0' + date : date) + ' ' +
-            monthName[month] + ' ' +
-            year + ' ' +
-            (hour < 10 ? '0' + hour : hour) + ':' +
-            (minute < 10 ? '0' + minute : minute) + ':' +
-            (second < 10 ? '0' + second : second) + ' GMT';
-    }
-}, hasNegativeMonthYearBug || hasToUTCStringFormatBug);
-
-// Opera 12 has `,`
-defineProperties(Date.prototype, {
-    toDateString: function toDateString() {
-        if (!this || !(this instanceof Date)) {
-            throw new TypeError('this is not a Date object.');
-        }
-        var day = this.getDay();
-        var date = this.getDate();
-        var month = this.getMonth();
-        var year = this.getFullYear();
-        return dayName[day] + ' ' +
-            monthName[month] + ' ' +
-            (date < 10 ? '0' + date : date) + ' ' +
-            year;
-    }
-}, hasNegativeMonthYearBug || hasToDateStringFormatBug);
-
-// can't use defineProperties here because of toString enumeration issue in IE <= 8
-if (hasNegativeMonthYearBug || hasToStringFormatBug) {
-    Date.prototype.toString = function toString() {
-        if (!this || !(this instanceof Date)) {
-            throw new TypeError('this is not a Date object.');
-        }
-        var day = this.getDay();
-        var date = this.getDate();
-        var month = this.getMonth();
-        var year = this.getFullYear();
-        var hour = this.getHours();
-        var minute = this.getMinutes();
-        var second = this.getSeconds();
-        var timezoneOffset = this.getTimezoneOffset();
-        var hoursOffset = Math.floor(Math.abs(timezoneOffset) / 60);
-        var minutesOffset = Math.floor(Math.abs(timezoneOffset) % 60);
-        return dayName[day] + ' ' +
-            monthName[month] + ' ' +
-            (date < 10 ? '0' + date : date) + ' ' +
-            year + ' ' +
-            (hour < 10 ? '0' + hour : hour) + ':' +
-            (minute < 10 ? '0' + minute : minute) + ':' +
-            (second < 10 ? '0' + second : second) + ' GMT' +
-            (timezoneOffset > 0 ? '-' : '+') +
-            (hoursOffset < 10 ? '0' + hoursOffset : hoursOffset) +
-            (minutesOffset < 10 ? '0' + minutesOffset : minutesOffset);
-    };
-    if (supportsDescriptors) {
-        $Object.defineProperty(Date.prototype, 'toString', {
-            configurable: true,
-            enumerable: false,
-            writable: true
-        });
-    }
-}
-
-// ES5 15.9.5.43
-// http://es5.github.com/#x15.9.5.43
-// This function returns a String value represent the instance in time
-// represented by this Date object. The format of the String is the Date Time
-// string format defined in 15.9.1.15. All fields are present in the String.
-// The time zone is always UTC, denoted by the suffix Z. If the time value of
-// this object is not a finite Number a RangeError exception is thrown.
-var negativeDate = -62198755200000;
-var negativeYearString = '-000001';
-var hasNegativeDateBug = Date.prototype.toISOString && new Date(negativeDate).toISOString().indexOf(negativeYearString) === -1;
-var hasSafari51DateBug = Date.prototype.toISOString && new Date(-1).toISOString() !== '1969-12-31T23:59:59.999Z';
-
-var getTime = call.bind(Date.prototype.getTime);
-
-defineProperties(Date.prototype, {
-    toISOString: function toISOString() {
-        if (!isFinite(this) || !isFinite(getTime(this))) {
-            // Adope Photoshop requires the second check.
-            throw new RangeError('Date.prototype.toISOString called on non-finite value.');
-        }
-
-        var year = originalGetUTCFullYear(this);
-
-        var month = originalGetUTCMonth(this);
-        // see https://github.com/es-shims/es5-shim/issues/111
-        year += Math.floor(month / 12);
-        month = (month % 12 + 12) % 12;
-
-        // the date time string format is specified in 15.9.1.15.
-        var result = [month + 1, originalGetUTCDate(this), originalGetUTCHours(this), originalGetUTCMinutes(this), originalGetUTCSeconds(this)];
-        year = (
-            (year < 0 ? '-' : (year > 9999 ? '+' : '')) +
-            strSlice('00000' + Math.abs(year), (0 <= year && year <= 9999) ? -4 : -6)
-        );
-
-        for (var i = 0; i < result.length; ++i) {
-          // pad months, days, hours, minutes, and seconds to have two digits.
-          result[i] = strSlice('00' + result[i], -2);
-        }
-        // pad milliseconds to have three digits.
-        return (
-            year + '-' + arraySlice(result, 0, 2).join('-') +
-            'T' + arraySlice(result, 2).join(':') + '.' +
-            strSlice('000' + originalGetUTCMilliseconds(this), -3) + 'Z'
-        );
-    }
-}, hasNegativeDateBug || hasSafari51DateBug);
-
-// ES5 15.9.5.44
-// http://es5.github.com/#x15.9.5.44
-// This function provides a String representation of a Date object for use by
-// JSON.stringify (15.12.3).
-var dateToJSONIsSupported = (function () {
-    try {
-        return Date.prototype.toJSON &&
-            new Date(NaN).toJSON() === null &&
-            new Date(negativeDate).toJSON().indexOf(negativeYearString) !== -1 &&
-            Date.prototype.toJSON.call({ // generic
-                toISOString: function () { return true; }
-            });
-    } catch (e) {
-        return false;
-    }
-}());
-if (!dateToJSONIsSupported) {
-    Date.prototype.toJSON = function toJSON(key) {
-        // When the toJSON method is called with argument key, the following
-        // steps are taken:
-
-        // 1.  Let O be the result of calling ToObject, giving it the this
-        // value as its argument.
-        // 2. Let tv be ES.ToPrimitive(O, hint Number).
-        var O = $Object(this);
-        var tv = ES.ToPrimitive(O);
-        // 3. If tv is a Number and is not finite, return null.
-        if (typeof tv === 'number' && !isFinite(tv)) {
-            return null;
-        }
-        // 4. Let toISO be the result of calling the [[Get]] internal method of
-        // O with argument "toISOString".
-        var toISO = O.toISOString;
-        // 5. If IsCallable(toISO) is false, throw a TypeError exception.
-        if (!isCallable(toISO)) {
-            throw new TypeError('toISOString property is not callable');
-        }
-        // 6. Return the result of calling the [[Call]] internal method of
-        //  toISO with O as the this value and an empty argument list.
-        return toISO.call(O);
-
-        // NOTE 1 The argument is ignored.
-
-        // NOTE 2 The toJSON function is intentionally generic; it does not
-        // require that its this value be a Date object. Therefore, it can be
-        // transferred to other kinds of objects for use as a method. However,
-        // it does require that any such object have a toISOString method. An
-        // object is free to use the argument key to filter its
-        // stringification.
-    };
-}
-
-// ES5 15.9.4.2
-// http://es5.github.com/#x15.9.4.2
-// based on work shared by Daniel Friesen (dantman)
-// http://gist.github.com/303249
-var supportsExtendedYears = Date.parse('+033658-09-27T01:46:40.000Z') === 1e15;
-var acceptsInvalidDates = !isNaN(Date.parse('2012-04-04T24:00:00.500Z')) || !isNaN(Date.parse('2012-11-31T23:59:59.000Z')) || !isNaN(Date.parse('2012-12-31T23:59:60.000Z'));
-var doesNotParseY2KNewYear = isNaN(Date.parse('2000-01-01T00:00:00.000Z'));
-if (doesNotParseY2KNewYear || acceptsInvalidDates || !supportsExtendedYears) {
-    // XXX global assignment won't work in embeddings that use
-    // an alternate object for the context.
-    /* global Date: true */
-    /* eslint-disable no-undef */
-    var maxSafeUnsigned32Bit = Math.pow(2, 31) - 1;
-    var hasSafariSignedIntBug = isActualNaN(new Date(1970, 0, 1, 0, 0, 0, maxSafeUnsigned32Bit + 1).getTime());
-    /* eslint-disable no-implicit-globals */
-    Date = (function (NativeDate) {
-    /* eslint-enable no-implicit-globals */
-    /* eslint-enable no-undef */
-        // Date.length === 7
-        var DateShim = function Date(Y, M, D, h, m, s, ms) {
-            var length = arguments.length;
-            var date;
-            if (this instanceof NativeDate) {
-                var seconds = s;
-                var millis = ms;
-                if (hasSafariSignedIntBug && length >= 7 && ms > maxSafeUnsigned32Bit) {
-                    // work around a Safari 8/9 bug where it treats the seconds as signed
-                    var msToShift = Math.floor(ms / maxSafeUnsigned32Bit) * maxSafeUnsigned32Bit;
-                    var sToShift = Math.floor(msToShift / 1e3);
-                    seconds += sToShift;
-                    millis -= sToShift * 1e3;
-                }
-                date = length === 1 && $String(Y) === Y ? // isString(Y)
-                    // We explicitly pass it through parse:
-                    new NativeDate(DateShim.parse(Y)) :
-                    // We have to manually make calls depending on argument
-                    // length here
-                    length >= 7 ? new NativeDate(Y, M, D, h, m, seconds, millis) :
-                    length >= 6 ? new NativeDate(Y, M, D, h, m, seconds) :
-                    length >= 5 ? new NativeDate(Y, M, D, h, m) :
-                    length >= 4 ? new NativeDate(Y, M, D, h) :
-                    length >= 3 ? new NativeDate(Y, M, D) :
-                    length >= 2 ? new NativeDate(Y, M) :
-                    length >= 1 ? new NativeDate(Y instanceof NativeDate ? +Y : Y) :
-                                  new NativeDate();
-            } else {
-                date = NativeDate.apply(this, arguments);
-            }
-            if (!isPrimitive(date)) {
-              // Prevent mixups with unfixed Date object
-              defineProperties(date, { constructor: DateShim }, true);
-            }
-            return date;
-        };
-
-        // 15.9.1.15 Date Time String Format.
-        var isoDateExpression = new RegExp('^' +
-            '(\\d{4}|[+-]\\d{6})' + // four-digit year capture or sign +
-                                      // 6-digit extended year
-            '(?:-(\\d{2})' + // optional month capture
-            '(?:-(\\d{2})' + // optional day capture
-            '(?:' + // capture hours:minutes:seconds.milliseconds
-                'T(\\d{2})' + // hours capture
-                ':(\\d{2})' + // minutes capture
-                '(?:' + // optional :seconds.milliseconds
-                    ':(\\d{2})' + // seconds capture
-                    '(?:(\\.\\d{1,}))?' + // milliseconds capture
-                ')?' +
-            '(' + // capture UTC offset component
-                'Z|' + // UTC capture
-                '(?:' + // offset specifier +/-hours:minutes
-                    '([-+])' + // sign capture
-                    '(\\d{2})' + // hours offset capture
-                    ':(\\d{2})' + // minutes offset capture
-                ')' +
-            ')?)?)?)?' +
-        '$');
-
-        var months = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365];
-
-        var dayFromMonth = function dayFromMonth(year, month) {
-            var t = month > 1 ? 1 : 0;
-            return (
-                months[month] +
-                Math.floor((year - 1969 + t) / 4) -
-                Math.floor((year - 1901 + t) / 100) +
-                Math.floor((year - 1601 + t) / 400) +
-                365 * (year - 1970)
-            );
-        };
-
-        var toUTC = function toUTC(t) {
-            var s = 0;
-            var ms = t;
-            if (hasSafariSignedIntBug && ms > maxSafeUnsigned32Bit) {
-                // work around a Safari 8/9 bug where it treats the seconds as signed
-                var msToShift = Math.floor(ms / maxSafeUnsigned32Bit) * maxSafeUnsigned32Bit;
-                var sToShift = Math.floor(msToShift / 1e3);
-                s += sToShift;
-                ms -= sToShift * 1e3;
-            }
-            return $Number(new NativeDate(1970, 0, 1, 0, 0, s, ms));
-        };
-
-        // Copy any custom methods a 3rd party library may have added
-        for (var key in NativeDate) {
-            if (owns(NativeDate, key)) {
-                DateShim[key] = NativeDate[key];
-            }
-        }
-
-        // Copy "native" methods explicitly; they may be non-enumerable
-        defineProperties(DateShim, {
-            now: NativeDate.now,
-            UTC: NativeDate.UTC
-        }, true);
-        DateShim.prototype = NativeDate.prototype;
-        defineProperties(DateShim.prototype, {
-            constructor: DateShim
-        }, true);
-
-        // Upgrade Date.parse to handle simplified ISO 8601 strings
-        var parseShim = function parse(string) {
-            var match = isoDateExpression.exec(string);
-            if (match) {
-                // parse months, days, hours, minutes, seconds, and milliseconds
-                // provide default values if necessary
-                // parse the UTC offset component
-                var year = $Number(match[1]),
-                    month = $Number(match[2] || 1) - 1,
-                    day = $Number(match[3] || 1) - 1,
-                    hour = $Number(match[4] || 0),
-                    minute = $Number(match[5] || 0),
-                    second = $Number(match[6] || 0),
-                    millisecond = Math.floor($Number(match[7] || 0) * 1000),
-                    // When time zone is missed, local offset should be used
-                    // (ES 5.1 bug)
-                    // see https://bugs.ecmascript.org/show_bug.cgi?id=112
-                    isLocalTime = Boolean(match[4] && !match[8]),
-                    signOffset = match[9] === '-' ? 1 : -1,
-                    hourOffset = $Number(match[10] || 0),
-                    minuteOffset = $Number(match[11] || 0),
-                    result;
-                var hasMinutesOrSecondsOrMilliseconds = minute > 0 || second > 0 || millisecond > 0;
-                if (
-                    hour < (hasMinutesOrSecondsOrMilliseconds ? 24 : 25) &&
-                    minute < 60 && second < 60 && millisecond < 1000 &&
-                    month > -1 && month < 12 && hourOffset < 24 &&
-                    minuteOffset < 60 && // detect invalid offsets
-                    day > -1 &&
-                    day < (dayFromMonth(year, month + 1) - dayFromMonth(year, month))
-                ) {
-                    result = (
-                        (dayFromMonth(year, month) + day) * 24 +
-                        hour +
-                        hourOffset * signOffset
-                    ) * 60;
-                    result = (
-                        (result + minute + minuteOffset * signOffset) * 60 +
-                        second
-                    ) * 1000 + millisecond;
-                    if (isLocalTime) {
-                        result = toUTC(result);
-                    }
-                    if (-8.64e15 <= result && result <= 8.64e15) {
-                        return result;
-                    }
-                }
-                return NaN;
-            }
-            return NativeDate.parse.apply(this, arguments);
-        };
-        defineProperties(DateShim, { parse: parseShim });
-
-        return DateShim;
-    }(Date));
-    /* global Date: false */
-}
-
-// ES5 15.9.4.4
-// http://es5.github.com/#x15.9.4.4
-if (!Date.now) {
-    Date.now = function now() {
-        return new Date().getTime();
-    };
-}
-
-//
-// Number
-// ======
-//
-
-// ES5.1 15.7.4.5
-// http://es5.github.com/#x15.7.4.5
-var hasToFixedBugs = NumberPrototype.toFixed && (
-  (0.00008).toFixed(3) !== '0.000' ||
-  (0.9).toFixed(0) !== '1' ||
-  (1.255).toFixed(2) !== '1.25' ||
-  (1000000000000000128).toFixed(0) !== '1000000000000000128'
-);
-
-var toFixedHelpers = {
-  base: 1e7,
-  size: 6,
-  data: [0, 0, 0, 0, 0, 0],
-  multiply: function multiply(n, c) {
-      var i = -1;
-      var c2 = c;
-      while (++i < toFixedHelpers.size) {
-          c2 += n * toFixedHelpers.data[i];
-          toFixedHelpers.data[i] = c2 % toFixedHelpers.base;
-          c2 = Math.floor(c2 / toFixedHelpers.base);
-      }
-  },
-  divide: function divide(n) {
-      var i = toFixedHelpers.size;
-      var c = 0;
-      while (--i >= 0) {
-          c += toFixedHelpers.data[i];
-          toFixedHelpers.data[i] = Math.floor(c / n);
-          c = (c % n) * toFixedHelpers.base;
-      }
-  },
-  numToString: function numToString() {
-      var i = toFixedHelpers.size;
-      var s = '';
-      while (--i >= 0) {
-          if (s !== '' || i === 0 || toFixedHelpers.data[i] !== 0) {
-              var t = $String(toFixedHelpers.data[i]);
-              if (s === '') {
-                  s = t;
-              } else {
-                  s += strSlice('0000000', 0, 7 - t.length) + t;
-              }
-          }
-      }
-      return s;
-  },
-  pow: function pow(x, n, acc) {
-      return (n === 0 ? acc : (n % 2 === 1 ? pow(x, n - 1, acc * x) : pow(x * x, n / 2, acc)));
-  },
-  log: function log(x) {
-      var n = 0;
-      var x2 = x;
-      while (x2 >= 4096) {
-          n += 12;
-          x2 /= 4096;
-      }
-      while (x2 >= 2) {
-          n += 1;
-          x2 /= 2;
-      }
-      return n;
-  }
-};
-
-var toFixedShim = function toFixed(fractionDigits) {
-    var f, x, s, m, e, z, j, k;
-
-    // Test for NaN and round fractionDigits down
-    f = $Number(fractionDigits);
-    f = isActualNaN(f) ? 0 : Math.floor(f);
-
-    if (f < 0 || f > 20) {
-        throw new RangeError('Number.toFixed called with invalid number of decimals');
-    }
-
-    x = $Number(this);
-
-    if (isActualNaN(x)) {
-        return 'NaN';
-    }
-
-    // If it is too big or small, return the string value of the number
-    if (x <= -1e21 || x >= 1e21) {
-        return $String(x);
-    }
-
-    s = '';
-
-    if (x < 0) {
-        s = '-';
-        x = -x;
-    }
-
-    m = '0';
-
-    if (x > 1e-21) {
-        // 1e-21 < x < 1e21
-        // -70 < log2(x) < 70
-        e = toFixedHelpers.log(x * toFixedHelpers.pow(2, 69, 1)) - 69;
-        z = (e < 0 ? x * toFixedHelpers.pow(2, -e, 1) : x / toFixedHelpers.pow(2, e, 1));
-        z *= 0x10000000000000; // Math.pow(2, 52);
-        e = 52 - e;
-
-        // -18 < e < 122
-        // x = z / 2 ^ e
-        if (e > 0) {
-            toFixedHelpers.multiply(0, z);
-            j = f;
-
-            while (j >= 7) {
-                toFixedHelpers.multiply(1e7, 0);
-                j -= 7;
-            }
-
-            toFixedHelpers.multiply(toFixedHelpers.pow(10, j, 1), 0);
-            j = e - 1;
-
-            while (j >= 23) {
-                toFixedHelpers.divide(1 << 23);
-                j -= 23;
-            }
-
-            toFixedHelpers.divide(1 << j);
-            toFixedHelpers.multiply(1, 1);
-            toFixedHelpers.divide(2);
-            m = toFixedHelpers.numToString();
-        } else {
-            toFixedHelpers.multiply(0, z);
-            toFixedHelpers.multiply(1 << (-e), 0);
-            m = toFixedHelpers.numToString() + strSlice('0.00000000000000000000', 2, 2 + f);
-        }
-    }
-
-    if (f > 0) {
-        k = m.length;
-
-        if (k <= f) {
-            m = s + strSlice('0.0000000000000000000', 0, f - k + 2) + m;
-        } else {
-            m = s + strSlice(m, 0, k - f) + '.' + strSlice(m, k - f);
-        }
-    } else {
-        m = s + m;
-    }
-
-    return m;
-};
-defineProperties(NumberPrototype, { toFixed: toFixedShim }, hasToFixedBugs);
-
-var hasToPrecisionUndefinedBug = (function () {
-    try {
-        return 1.0.toPrecision(undefined) === '1';
-    } catch (e) {
-        return true;
-    }
-}());
-var originalToPrecision = NumberPrototype.toPrecision;
-defineProperties(NumberPrototype, {
-    toPrecision: function toPrecision(precision) {
-        return typeof precision === 'undefined' ? originalToPrecision.call(this) : originalToPrecision.call(this, precision);
-    }
-}, hasToPrecisionUndefinedBug);
-
-//
-// String
-// ======
-//
-
-// ES5 15.5.4.14
-// http://es5.github.com/#x15.5.4.14
-
-// [bugfix, IE lt 9, firefox 4, Konqueror, Opera, obscure browsers]
-// Many browsers do not split properly with regular expressions or they
-// do not perform the split correctly under obscure conditions.
-// See http://blog.stevenlevithan.com/archives/cross-browser-split
-// I've tested in many browsers and this seems to cover the deviant ones:
-//    'ab'.split(/(?:ab)*/) should be ["", ""], not [""]
-//    '.'.split(/(.?)(.?)/) should be ["", ".", "", ""], not ["", ""]
-//    'tesst'.split(/(s)*/) should be ["t", undefined, "e", "s", "t"], not
-//       [undefined, "t", undefined, "e", ...]
-//    ''.split(/.?/) should be [], not [""]
-//    '.'.split(/()()/) should be ["."], not ["", "", "."]
-
-if (
-    'ab'.split(/(?:ab)*/).length !== 2 ||
-    '.'.split(/(.?)(.?)/).length !== 4 ||
-    'tesst'.split(/(s)*/)[1] === 't' ||
-    'test'.split(/(?:)/, -1).length !== 4 ||
-    ''.split(/.?/).length ||
-    '.'.split(/()()/).length > 1
-) {
-    (function () {
-        var compliantExecNpcg = typeof (/()??/).exec('')[1] === 'undefined'; // NPCG: nonparticipating capturing group
-        var maxSafe32BitInt = Math.pow(2, 32) - 1;
-
-        StringPrototype.split = function (separator, limit) {
-            var string = String(this);
-            if (typeof separator === 'undefined' && limit === 0) {
-                return [];
-            }
-
-            // If `separator` is not a regex, use native split
-            if (!isRegex(separator)) {
-                return strSplit(this, separator, limit);
-            }
-
-            var output = [];
-            var flags = (separator.ignoreCase ? 'i' : '') +
-                        (separator.multiline ? 'm' : '') +
-                        (separator.unicode ? 'u' : '') + // in ES6
-                        (separator.sticky ? 'y' : ''), // Firefox 3+ and ES6
-                lastLastIndex = 0,
-                // Make `global` and avoid `lastIndex` issues by working with a copy
-                separator2, match, lastIndex, lastLength;
-            var separatorCopy = new RegExp(separator.source, flags + 'g');
-            if (!compliantExecNpcg) {
-                // Doesn't need flags gy, but they don't hurt
-                separator2 = new RegExp('^' + separatorCopy.source + '$(?!\\s)', flags);
-            }
-            /* Values for `limit`, per the spec:
-             * If undefined: 4294967295 // maxSafe32BitInt
-             * If 0, Infinity, or NaN: 0
-             * If positive number: limit = Math.floor(limit); if (limit > 4294967295) limit -= 4294967296;
-             * If negative number: 4294967296 - Math.floor(Math.abs(limit))
-             * If other: Type-convert, then use the above rules
-             */
-            var splitLimit = typeof limit === 'undefined' ? maxSafe32BitInt : ES.ToUint32(limit);
-            match = separatorCopy.exec(string);
-            while (match) {
-                // `separatorCopy.lastIndex` is not reliable cross-browser
-                lastIndex = match.index + match[0].length;
-                if (lastIndex > lastLastIndex) {
-                    pushCall(output, strSlice(string, lastLastIndex, match.index));
-                    // Fix browsers whose `exec` methods don't consistently return `undefined` for
-                    // nonparticipating capturing groups
-                    if (!compliantExecNpcg && match.length > 1) {
-                        /* eslint-disable no-loop-func */
-                        match[0].replace(separator2, function () {
-                            for (var i = 1; i < arguments.length - 2; i++) {
-                                if (typeof arguments[i] === 'undefined') {
-                                    match[i] = void 0;
-                                }
-                            }
-                        });
-                        /* eslint-enable no-loop-func */
-                    }
-                    if (match.length > 1 && match.index < string.length) {
-                        array_push.apply(output, arraySlice(match, 1));
-                    }
-                    lastLength = match[0].length;
-                    lastLastIndex = lastIndex;
-                    if (output.length >= splitLimit) {
-                        break;
-                    }
-                }
-                if (separatorCopy.lastIndex === match.index) {
-                    separatorCopy.lastIndex++; // Avoid an infinite loop
-                }
-                match = separatorCopy.exec(string);
-            }
-            if (lastLastIndex === string.length) {
-                if (lastLength || !separatorCopy.test('')) {
-                    pushCall(output, '');
-                }
-            } else {
-                pushCall(output, strSlice(string, lastLastIndex));
-            }
-            return output.length > splitLimit ? arraySlice(output, 0, splitLimit) : output;
-        };
-    }());
-
-// [bugfix, chrome]
-// If separator is undefined, then the result array contains just one String,
-// which is the this value (converted to a String). If limit is not undefined,
-// then the output array is truncated so that it contains no more than limit
-// elements.
-// "0".split(undefined, 0) -> []
-} else if ('0'.split(void 0, 0).length) {
-    StringPrototype.split = function split(separator, limit) {
-        if (typeof separator === 'undefined' && limit === 0) { return []; }
-        return strSplit(this, separator, limit);
-    };
-}
-
-var str_replace = StringPrototype.replace;
-var replaceReportsGroupsCorrectly = (function () {
-    var groups = [];
-    'x'.replace(/x(.)?/g, function (match, group) {
-        pushCall(groups, group);
-    });
-    return groups.length === 1 && typeof groups[0] === 'undefined';
-}());
-
-if (!replaceReportsGroupsCorrectly) {
-    StringPrototype.replace = function replace(searchValue, replaceValue) {
-        var isFn = isCallable(replaceValue);
-        var hasCapturingGroups = isRegex(searchValue) && (/\)[*?]/).test(searchValue.source);
-        if (!isFn || !hasCapturingGroups) {
-            return str_replace.call(this, searchValue, replaceValue);
-        } else {
-            var wrappedReplaceValue = function (match) {
-                var length = arguments.length;
-                var originalLastIndex = searchValue.lastIndex;
-                searchValue.lastIndex = 0;
-                var args = searchValue.exec(match) || [];
-                searchValue.lastIndex = originalLastIndex;
-                pushCall(args, arguments[length - 2], arguments[length - 1]);
-                return replaceValue.apply(this, args);
-            };
-            return str_replace.call(this, searchValue, wrappedReplaceValue);
-        }
-    };
-}
-
-// ECMA-262, 3rd B.2.3
-// Not an ECMAScript standard, although ECMAScript 3rd Edition has a
-// non-normative section suggesting uniform semantics and it should be
-// normalized across all browsers
-// [bugfix, IE lt 9] IE < 9 substr() with negative value not working in IE
-var string_substr = StringPrototype.substr;
-var hasNegativeSubstrBug = ''.substr && '0b'.substr(-1) !== 'b';
-defineProperties(StringPrototype, {
-    substr: function substr(start, length) {
-        var normalizedStart = start;
-        if (start < 0) {
-            normalizedStart = max(this.length + start, 0);
-        }
-        return string_substr.call(this, normalizedStart, length);
-    }
-}, hasNegativeSubstrBug);
-
-// ES5 15.5.4.20
-// whitespace from: http://es5.github.io/#x15.5.4.20
-var ws = '\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003' +
-    '\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028' +
-    '\u2029\uFEFF';
-var zeroWidth = '\u200b';
-var wsRegexChars = '[' + ws + ']';
-var trimBeginRegexp = new RegExp('^' + wsRegexChars + wsRegexChars + '*');
-var trimEndRegexp = new RegExp(wsRegexChars + wsRegexChars + '*$');
-var hasTrimWhitespaceBug = StringPrototype.trim && (ws.trim() || !zeroWidth.trim());
-defineProperties(StringPrototype, {
-    // http://blog.stevenlevithan.com/archives/faster-trim-javascript
-    // http://perfectionkills.com/whitespace-deviations/
-    trim: function trim() {
-        if (typeof this === 'undefined' || this === null) {
-            throw new TypeError("can't convert " + this + ' to object');
-        }
-        return $String(this).replace(trimBeginRegexp, '').replace(trimEndRegexp, '');
-    }
-}, hasTrimWhitespaceBug);
-var trim = call.bind(String.prototype.trim);
-
-var hasLastIndexBug = StringPrototype.lastIndexOf && 'abcあい'.lastIndexOf('あい', 2) !== -1;
-defineProperties(StringPrototype, {
-    lastIndexOf: function lastIndexOf(searchString) {
-        if (typeof this === 'undefined' || this === null) {
-            throw new TypeError("can't convert " + this + ' to object');
-        }
-        var S = $String(this);
-        var searchStr = $String(searchString);
-        var numPos = arguments.length > 1 ? $Number(arguments[1]) : NaN;
-        var pos = isActualNaN(numPos) ? Infinity : ES.ToInteger(numPos);
-        var start = min(max(pos, 0), S.length);
-        var searchLen = searchStr.length;
-        var k = start + searchLen;
-        while (k > 0) {
-            k = max(0, k - searchLen);
-            var index = strIndexOf(strSlice(S, k, start + searchLen), searchStr);
-            if (index !== -1) {
-                return k + index;
-            }
-        }
-        return -1;
-    }
-}, hasLastIndexBug);
-
-var originalLastIndexOf = StringPrototype.lastIndexOf;
-defineProperties(StringPrototype, {
-    lastIndexOf: function lastIndexOf(searchString) {
-        return originalLastIndexOf.apply(this, arguments);
-    }
-}, StringPrototype.lastIndexOf.length !== 1);
-
-// ES-5 15.1.2.2
-/* eslint-disable radix */
-if (parseInt(ws + '08') !== 8 || parseInt(ws + '0x16') !== 22) {
-/* eslint-enable radix */
-    /* global parseInt: true */
-    parseInt = (function (origParseInt) {
-        var hexRegex = /^[\-+]?0[xX]/;
-        return function parseInt(str, radix) {
-            var string = trim(str);
-            var defaultedRadix = $Number(radix) || (hexRegex.test(string) ? 16 : 10);
-            return origParseInt(string, defaultedRadix);
-        };
-    }(parseInt));
-}
-
-// https://es5.github.io/#x15.1.2.3
-if (1 / parseFloat('-0') !== -Infinity) {
-    /* global parseFloat: true */
-    parseFloat = (function (origParseFloat) {
-        return function parseFloat(string) {
-            var inputString = trim(string);
-            var result = origParseFloat(inputString);
-            return result === 0 && strSlice(inputString, 0, 1) === '-' ? -0 : result;
-        };
-    }(parseFloat));
-}
-
-if (String(new RangeError('test')) !== 'RangeError: test') {
-    var errorToStringShim = function toString() {
-        if (typeof this === 'undefined' || this === null) {
-            throw new TypeError("can't convert " + this + ' to object');
-        }
-        var name = this.name;
-        if (typeof name === 'undefined') {
-            name = 'Error';
-        } else if (typeof name !== 'string') {
-            name = $String(name);
-        }
-        var msg = this.message;
-        if (typeof msg === 'undefined') {
-            msg = '';
-        } else if (typeof msg !== 'string') {
-            msg = $String(msg);
-        }
-        if (!name) {
-            return msg;
-        }
-        if (!msg) {
-            return name;
-        }
-        return name + ': ' + msg;
-    };
-    // can't use defineProperties here because of toString enumeration issue in IE <= 8
-    Error.prototype.toString = errorToStringShim;
-}
-
-if (supportsDescriptors) {
-    var ensureNonEnumerable = function (obj, prop) {
-        if (isEnum(obj, prop)) {
-            var desc = Object.getOwnPropertyDescriptor(obj, prop);
-            if (desc.configurable) {
-              desc.enumerable = false;
-              Object.defineProperty(obj, prop, desc);
-            }
-        }
-    };
-    ensureNonEnumerable(Error.prototype, 'message');
-    if (Error.prototype.message !== '') {
-      Error.prototype.message = '';
-    }
-    ensureNonEnumerable(Error.prototype, 'name');
-}
-
-if (String(/a/mig) !== '/a/gim') {
-    var regexToString = function toString() {
-        var str = '/' + this.source + '/';
-        if (this.global) {
-            str += 'g';
-        }
-        if (this.ignoreCase) {
-            str += 'i';
-        }
-        if (this.multiline) {
-            str += 'm';
-        }
-        return str;
-    };
-    // can't use defineProperties here because of toString enumeration issue in IE <= 8
-    RegExp.prototype.toString = regexToString;
-}
-
-}));
index a84374a..a0e53b3 100644 (file)
@@ -4,14 +4,19 @@
                        "Mogoeilor"
                ]
        },
+       "ooui-outline-control-move-down": "ڤا دڤۈن بوردن آیتم",
+       "ooui-outline-control-move-up": "ڤارو بردن آیتم",
+       "ooui-outline-control-remove": "ڤورداشتن آیتم",
        "ooui-toolbar-more": "بیشتر",
        "ooui-toolgroup-expand": "بیشتر",
        "ooui-toolgroup-collapse": "کمتر",
        "ooui-dialog-message-accept": "خۈڤإ",
        "ooui-dialog-message-reject": "أنجومشيڤ کردن",
+       "ooui-dialog-process-error": "یأ چي ايچو إشتوا إ",
        "ooui-dialog-process-retry": "ز نۉ تلاش کونين",
        "ooui-dialog-process-continue": "ديندا گرهڌن",
        "ooui-selectfile-button-select": "گولإڤورچين کردن جانیا",
+       "ooui-selectfile-not-supported": "گول ڤورچی کردن جانیا کونشتکاری نڤابیڌ",
        "ooui-selectfile-placeholder": "هيژ جانيایي گولإ ڤورچين نڤابيڌإ",
        "ooui-selectfile-dragdrop-placeholder": "جانيانأ ڤأنين ايچو"
 }
index 53ce966..f390b56 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.19.5
+ * OOjs UI v0.20.2
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-03-07T22:57:01Z
+ * Date: 2017-03-30T20:34:37Z
  */
 ( function ( OO ) {
 
index 369cf09..624cc57 100644 (file)
@@ -1,18 +1,19 @@
 /*!
- * OOjs UI v0.19.5
+ * OOjs UI v0.20.2
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-03-07T22:57:06Z
+ * Date: 2017-03-30T20:34:41Z
  */
 .oo-ui-element-hidden {
   display: none !important;
 }
 .oo-ui-buttonElement {
   display: inline-block;
+  line-height: normal;
   vertical-align: middle;
 }
 .oo-ui-buttonElement > .oo-ui-buttonElement-button {
@@ -24,7 +25,6 @@
   vertical-align: middle;
   font-family: inherit;
   font-size: inherit;
-  line-height: normal;
   white-space: nowrap;
   -webkit-touch-callout: none;
   -webkit-user-select: none;
       -ms-user-select: none;
           user-select: none;
 }
+.oo-ui-buttonElement > .oo-ui-buttonElement-button::-moz-focus-inner {
+  border-color: transparent;
+  padding: 0;
+}
 .oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon,
 .oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
   display: none;
 .oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-field {
   width: 1px;
 }
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-header,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-field {
+  display: block;
+}
 .oo-ui-fieldLayout .oo-ui-fieldLayout-help {
   float: right;
 }
@@ -571,7 +579,6 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   opacity: 0.2;
 }
 .oo-ui-radioOptionWidget {
-  cursor: default;
   padding: 0;
   background-color: transparent;
 }
@@ -868,12 +875,16 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   display: block;
 }
 .oo-ui-dropdownInputWidget select {
+  background-position: -9999em 0;
+  background-repeat: no-repeat;
   width: 100%;
-  cursor: pointer;
   -webkit-box-sizing: border-box;
      -moz-box-sizing: border-box;
           box-sizing: border-box;
 }
+.oo-ui-dropdownInputWidget.oo-ui-widget-enabled select {
+  cursor: pointer;
+}
 .oo-ui-dropdownInputWidget select {
   background-color: #fff;
   height: 2.5em;
@@ -1123,9 +1134,6 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 .oo-ui-menuSelectWidget-invisible {
   display: none;
 }
-.oo-ui-menuOptionWidget {
-  position: relative;
-}
 .oo-ui-menuOptionWidget .oo-ui-iconElement-icon {
   display: none;
 }
@@ -1301,7 +1309,6 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   color: #ccc;
 }
 .oo-ui-checkboxMultioptionWidget {
-  cursor: default;
   padding: 0;
 }
 .oo-ui-checkboxMultioptionWidget .oo-ui-checkboxInputWidget,
index b041ef4..bff0f50 100644 (file)
@@ -1,18 +1,19 @@
 /*!
- * OOjs UI v0.19.5
+ * OOjs UI v0.20.2
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-03-07T22:57:06Z
+ * Date: 2017-03-30T20:34:41Z
  */
 .oo-ui-element-hidden {
   display: none !important;
 }
 .oo-ui-buttonElement {
   display: inline-block;
+  line-height: normal;
   vertical-align: middle;
 }
 .oo-ui-buttonElement > .oo-ui-buttonElement-button {
@@ -24,7 +25,6 @@
   vertical-align: middle;
   font-family: inherit;
   font-size: inherit;
-  line-height: normal;
   white-space: nowrap;
   -webkit-touch-callout: none;
   -webkit-user-select: none;
       -ms-user-select: none;
           user-select: none;
 }
+.oo-ui-buttonElement > .oo-ui-buttonElement-button::-moz-focus-inner {
+  border-color: transparent;
+  padding: 0;
+}
 .oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon,
 .oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
   display: none;
@@ -60,9 +64,6 @@
   border-radius: 2px;
   outline: 0;
 }
-.oo-ui-buttonElement > .oo-ui-buttonElement-button:focus::-moz-focus-inner {
-  border-color: transparent;
-}
 .oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
   margin-right: 0.25em;
   margin-left: 0.46875em;
   position: relative;
   min-height: 2.5em;
   border-radius: 2px;
-  padding: 0.546875em 1em;
+  padding: 0.625em 1em 0.546875em;
 }
 .oo-ui-buttonElement-framed.oo-ui-iconElement > .oo-ui-buttonElement-button {
   min-width: 3.125em;
   min-width: 0;
 }
 .oo-ui-buttonElement-framed > input.oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-labelElement > .oo-ui-buttonElement-button {
+  line-height: 1;
+}
 .oo-ui-buttonElement-framed.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-  line-height: 1.25;
+  line-height: 1.172em;
 }
 .oo-ui-buttonElement-framed.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
   display: block;
 .oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-field {
   width: 1px;
 }
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-header,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-field {
+  display: block;
+}
 .oo-ui-fieldLayout .oo-ui-fieldLayout-help {
   float: right;
 }
@@ -663,8 +671,6 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 .oo-ui-optionWidget {
   position: relative;
   display: block;
-  border: 0;
-  padding: 0.25em 0.5em;
 }
 .oo-ui-optionWidget.oo-ui-widget-enabled {
   cursor: pointer;
@@ -716,22 +722,15 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   border-color: #fff;
 }
 .oo-ui-radioOptionWidget {
-  cursor: default;
-  padding: 0.25em 0;
-  background-color: transparent;
+  padding: 0.3125em 0;
 }
 .oo-ui-radioOptionWidget .oo-ui-radioInputWidget,
 .oo-ui-radioOptionWidget.oo-ui-labelElement .oo-ui-labelElement-label {
   display: inline-block;
   vertical-align: middle;
 }
-.oo-ui-radioOptionWidget.oo-ui-optionWidget-selected,
-.oo-ui-radioOptionWidget.oo-ui-optionWidget-pressed,
-.oo-ui-radioOptionWidget.oo-ui-optionWidget-highlighted {
-  background-color: transparent;
-}
 .oo-ui-radioOptionWidget.oo-ui-labelElement .oo-ui-labelElement-label {
-  padding: 0.25em 0.25em 0.25em 0.46875em;
+  padding-left: 0.46875em;
 }
 .oo-ui-radioOptionWidget .oo-ui-radioInputWidget {
   margin-right: 0;
@@ -1107,7 +1106,7 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   margin-top: 0;
 }
 .oo-ui-checkboxMultiselectInputWidget .oo-ui-fieldLayout .oo-ui-fieldLayout-body {
-  padding: 0.25em 0;
+  padding: 0.3125em 0;
 }
 .oo-ui-checkboxMultiselectInputWidget .oo-ui-fieldLayout .oo-ui-fieldLayout-body .oo-ui-labelElement-label {
   line-height: 1.5;
@@ -1126,12 +1125,16 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   display: block;
 }
 .oo-ui-dropdownInputWidget select {
+  background-position: -9999em 0;
+  background-repeat: no-repeat;
   width: 100%;
-  cursor: pointer;
   -webkit-box-sizing: border-box;
      -moz-box-sizing: border-box;
           box-sizing: border-box;
 }
+.oo-ui-dropdownInputWidget.oo-ui-widget-enabled select {
+  cursor: pointer;
+}
 .oo-ui-dropdownInputWidget-php {
   border-right: 1px solid #a2a9b1;
   border-radius: 2px;
@@ -1151,6 +1154,15 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   font-family: inherit;
   vertical-align: middle;
 }
+.oo-ui-dropdownInputWidget select::-ms-expand {
+  display: none;
+}
+.oo-ui-dropdownInputWidget select:not( [no-ie] ) {
+  background-position: right 1.75em center;
+  width: calc( 100% + 1em );
+  height: 2.5em;
+  padding: 0 0 0 1em;
+}
 .oo-ui-dropdownInputWidget option {
   font-size: inherit;
   font-family: inherit;
@@ -1159,8 +1171,6 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 }
 .oo-ui-dropdownInputWidget.oo-ui-widget-enabled select {
   background-color: #f8f9fa;
-  background-position: -9999em 0;
-  background-repeat: no-repeat;
   color: #222;
   -webkit-transition: background-color 100ms, border-color 100ms, box-shadow 100ms;
      -moz-transition: background-color 100ms, border-color 100ms, box-shadow 100ms;
@@ -1180,15 +1190,6 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   outline: 0;
   box-shadow: inset 0 0 0 1px #36c;
 }
-.oo-ui-dropdownInputWidget.oo-ui-widget-enabled select::-ms-expand {
-  display: none;
-}
-.oo-ui-dropdownInputWidget.oo-ui-widget-enabled select:not( [no-ie] ) {
-  background-position: right 1.75em center;
-  width: calc( 100% + 1em );
-  height: 2.5em;
-  padding: 0 0 0 1em;
-}
 .oo-ui-dropdownInputWidget.oo-ui-widget-disabled select {
   background-color: #eaecf0;
   color: #72777d;
@@ -1297,7 +1298,7 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   margin-top: 0;
 }
 .oo-ui-radioSelectInputWidget .oo-ui-fieldLayout .oo-ui-fieldLayout-body {
-  padding: 0.25em 0;
+  padding: 0.3125em 0;
 }
 .oo-ui-radioSelectInputWidget .oo-ui-fieldLayout .oo-ui-fieldLayout-body .oo-ui-labelElement-label {
   line-height: 1.5;
@@ -1497,6 +1498,7 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 .oo-ui-textInputWidget.oo-ui-widget-disabled input,
 .oo-ui-textInputWidget.oo-ui-widget-disabled textarea {
   background-color: #eaecf0;
+  -webkit-text-fill-color: #72777d;
   color: #72777d;
   text-shadow: 0 1px 1px #fff;
   border-color: #c8ccd1;
@@ -1515,7 +1517,7 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 }
 .oo-ui-textInputWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
   left: 0;
-  max-height: 2.375em;
+  max-height: 2.5em;
   margin-left: 0.5em;
   background-position: right center;
 }
@@ -1525,7 +1527,7 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 }
 .oo-ui-textInputWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
   height: 100%;
-  max-height: 2.375em;
+  max-height: 2.5em;
   margin: 0 0.775em;
 }
 .oo-ui-textInputWidget > .oo-ui-labelElement-label {
@@ -1564,7 +1566,6 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   display: none;
 }
 .oo-ui-menuOptionWidget {
-  position: relative;
   padding: 0.5em 1em;
   -webkit-transition: background-color 100ms, color 100ms;
      -moz-transition: background-color 100ms, color 100ms;
@@ -1750,6 +1751,12 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   border-bottom-right-radius: 0;
   border-right-width: 0;
 }
+.oo-ui-comboBoxInputWidget.oo-ui-comboBoxInputWidget-empty input,
+.oo-ui-comboBoxInputWidget-php input {
+  border-top-right-radius: 2px;
+  border-bottom-right-radius: 2px;
+  border-right-width: 1px;
+}
 .oo-ui-comboBoxInputWidget-dropdownButton {
   width: 2.5em;
 }
@@ -1764,9 +1771,6 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   border-top-left-radius: 0;
   border-bottom-left-radius: 0;
 }
-.oo-ui-comboBoxInputWidget.oo-ui-comboBoxInputWidget-empty input {
-  border-right-width: 1px;
-}
 .oo-ui-comboBoxInputWidget.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator {
   opacity: 1;
 }
@@ -1790,8 +1794,7 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   color: #72777d;
 }
 .oo-ui-checkboxMultioptionWidget {
-  cursor: default;
-  padding: 0.25em 0;
+  padding: 0.3125em 0;
 }
 .oo-ui-checkboxMultioptionWidget .oo-ui-checkboxInputWidget,
 .oo-ui-checkboxMultioptionWidget.oo-ui-labelElement .oo-ui-labelElement-label {
@@ -1799,7 +1802,7 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
   vertical-align: middle;
 }
 .oo-ui-checkboxMultioptionWidget.oo-ui-labelElement .oo-ui-labelElement-label {
-  padding: 0.25em 0.25em 0.25em 0.46875em;
+  padding-left: 0.46875em;
 }
 .oo-ui-checkboxMultioptionWidget .oo-ui-checkboxInputWidget {
   margin-right: 0;
index f10bdfa..44b21ab 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.19.5
+ * OOjs UI v0.20.2
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-03-07T22:57:01Z
+ * Date: 2017-03-30T20:34:37Z
  */
 ( function ( OO ) {
 
@@ -90,7 +90,7 @@ OO.ui.isFocusableElement = function ( $element ) {
        // Check if the element is visible
        if ( !(
                // This is quicker than calling $element.is( ':visible' )
-               $.expr.filters.visible( element ) &&
+               $.expr.pseudos.visible( element ) &&
                // Check that all parents are visible
                !$element.parents().addBack().filter( function () {
                        return $.css( this, 'visibility' ) === 'hidden';
@@ -883,7 +883,7 @@ OO.ui.Element.static.getDocument = function ( obj ) {
                // Window
                obj.document ||
                // HTMLDocument
-               ( obj.nodeType === 9 && obj ) ||
+               ( obj.nodeType === Node.DOCUMENT_NODE && obj ) ||
                null;
 };
 
@@ -912,7 +912,7 @@ OO.ui.Element.static.getDir = function ( obj ) {
        if ( obj instanceof jQuery ) {
                obj = obj[ 0 ];
        }
-       isDoc = obj.nodeType === 9;
+       isDoc = obj.nodeType === Node.DOCUMENT_NODE;
        isWin = obj.document !== undefined;
        if ( isDoc || isWin ) {
                if ( isWin ) {
@@ -1140,17 +1140,18 @@ OO.ui.Element.static.getScrollLeft = ( function () {
 }() );
 
 /**
- * Get scrollable object parent
+ * Get the root scrollable element of given element's document.
  *
- * documentElement can't be used to get or set the scrollTop
- * property on Blink. Changing and testing its value lets us
- * use 'body' or 'documentElement' based on what is working.
+ * On Blink-based browsers (Chrome etc.), `document.documentElement` can't be used to get or set
+ * the scrollTop property; instead we have to use `document.body`. Changing and testing the value
+ * lets us use 'body' or 'documentElement' based on what is working.
  *
  * https://code.google.com/p/chromium/issues/detail?id=303131
  *
  * @static
- * @param {HTMLElement} el Element to find scrollable parent for
- * @return {HTMLElement} Scrollable parent
+ * @param {HTMLElement} el Element to find root scrollable parent for
+ * @return {HTMLElement} Scrollable parent, `document.body` or `document.documentElement`
+ *     depending on browser
  */
 OO.ui.Element.static.getRootScrollableElement = function ( el ) {
        var scrollTop, body;
@@ -1174,8 +1175,8 @@ OO.ui.Element.static.getRootScrollableElement = function ( el ) {
 /**
  * Get closest scrollable container.
  *
- * Traverses up until either a scrollable element or the root is reached, in which case the window
- * will be returned.
+ * Traverses up until either a scrollable element or the root is reached, in which case the root
+ * scrollable element will be returned (see #getRootScrollableElement).
  *
  * @static
  * @param {HTMLElement} el Element to find scrollable container for
@@ -1193,6 +1194,12 @@ OO.ui.Element.static.getClosestScrollableContainer = function ( el, dimension )
                props = [ 'overflow-' + dimension ];
        }
 
+       // Special case for the document root (which doesn't really have any scrollable container, since
+       // it is the ultimate scrollable container, but this is probably saner than null or exception)
+       if ( $( el ).is( 'html, body' ) ) {
+               return this.getRootScrollableElement( el );
+       }
+
        while ( $parent.length ) {
                if ( $parent[ 0 ] === this.getRootScrollableElement( el ) ) {
                        return $parent[ 0 ];
@@ -1211,7 +1218,8 @@ OO.ui.Element.static.getClosestScrollableContainer = function ( el, dimension )
                }
                $parent = $parent.parent();
        }
-       return this.getDocument( el ).body;
+       // The element is unattached... return something mostly sane
+       return this.getRootScrollableElement( el );
 };
 
 /**
@@ -1223,22 +1231,16 @@ OO.ui.Element.static.getClosestScrollableContainer = function ( el, dimension )
  * @param {string} [config.duration='fast'] jQuery animation duration value
  * @param {string} [config.direction] Scroll in only one direction, e.g. 'x' or 'y', omit
  *  to scroll in both directions
- * @param {Function} [config.complete] Function to call when scrolling completes.
- *  Deprecated since 0.15.4, use the return promise instead.
  * @return {jQuery.Promise} Promise which resolves when the scroll is complete
  */
 OO.ui.Element.static.scrollIntoView = function ( el, config ) {
-       var position, animations, callback, container, $container, elementDimensions, containerDimensions, $window,
+       var position, animations, container, $container, elementDimensions, containerDimensions, $window,
                deferred = $.Deferred();
 
        // Configuration initialization
        config = config || {};
 
        animations = {};
-       callback = typeof config.complete === 'function' && config.complete;
-       if ( callback ) {
-               OO.ui.warnDeprecation( 'Element#scrollIntoView: The `complete` callback config option is deprecated. Use the return promise instead.' );
-       }
        container = this.getClosestScrollableContainer( el, config.direction );
        $container = $( container );
        elementDimensions = this.getDimensions( el );
@@ -1281,16 +1283,10 @@ OO.ui.Element.static.scrollIntoView = function ( el, config ) {
        if ( !$.isEmptyObject( animations ) ) {
                $container.stop( true ).animate( animations, config.duration === undefined ? 'fast' : config.duration );
                $container.queue( function ( next ) {
-                       if ( callback ) {
-                               callback();
-                       }
                        deferred.resolve();
                        next();
                } );
        } else {
-               if ( callback ) {
-                       callback();
-               }
                deferred.resolve();
        }
        return deferred.promise();
@@ -2193,6 +2189,7 @@ OO.ui.mixin.ButtonElement.prototype.isActive = function () {
  * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Elements/Groups
  *
  * @abstract
+ * @mixins OO.EmitterList
  * @class
  *
  * @constructor
@@ -2204,15 +2201,20 @@ OO.ui.mixin.GroupElement = function OoUiMixinGroupElement( config ) {
        // Configuration initialization
        config = config || {};
 
+       // Mixin constructors
+       OO.EmitterList.call( this, config );
+
        // Properties
        this.$group = null;
-       this.items = [];
-       this.aggregateItemEvents = {};
 
        // Initialization
        this.setGroupElement( config.$group || $( '<div>' ) );
 };
 
+/* Setup */
+
+OO.mixinClass( OO.ui.mixin.GroupElement, OO.EmitterList );
+
 /* Events */
 
 /**
@@ -2241,28 +2243,6 @@ OO.ui.mixin.GroupElement.prototype.setGroupElement = function ( $group ) {
        }
 };
 
-/**
- * Check if a group contains no items.
- *
- * @return {boolean} Group is empty
- */
-OO.ui.mixin.GroupElement.prototype.isEmpty = function () {
-       return !this.items.length;
-};
-
-/**
- * Get all items in the group.
- *
- * The method returns an array of item references (e.g., [button1, button2, button3]) and is useful
- * when synchronizing groups of items, or whenever the references are required (e.g., when removing items
- * from a group).
- *
- * @return {OO.ui.Element[]} An array of items.
- */
-OO.ui.mixin.GroupElement.prototype.getItems = function () {
-       return this.items.slice( 0 );
-};
-
 /**
  * Get an item by its data.
  *
@@ -2309,62 +2289,6 @@ OO.ui.mixin.GroupElement.prototype.getItemsFromData = function ( data ) {
        return items;
 };
 
-/**
- * Aggregate the events emitted by the group.
- *
- * When events are aggregated, the group will listen to all contained items for the event,
- * and then emit the event under a new name. The new event will contain an additional leading
- * parameter containing the item that emitted the original event. Other arguments emitted from
- * the original event are passed through.
- *
- * @param {Object.<string,string|null>} events An object keyed by the name of the event that should be
- *  aggregated  (e.g., ‘click’) and the value of the new name to use (e.g., ‘groupClick’).
- *  A `null` value will remove aggregated events.
-
- * @throws {Error} An error is thrown if aggregation already exists.
- */
-OO.ui.mixin.GroupElement.prototype.aggregate = function ( events ) {
-       var i, len, item, add, remove, itemEvent, groupEvent;
-
-       for ( itemEvent in events ) {
-               groupEvent = events[ itemEvent ];
-
-               // Remove existing aggregated event
-               if ( Object.prototype.hasOwnProperty.call( this.aggregateItemEvents, itemEvent ) ) {
-                       // Don't allow duplicate aggregations
-                       if ( groupEvent ) {
-                               throw new Error( 'Duplicate item event aggregation for ' + itemEvent );
-                       }
-                       // Remove event aggregation from existing items
-                       for ( i = 0, len = this.items.length; i < len; i++ ) {
-                               item = this.items[ i ];
-                               if ( item.connect && item.disconnect ) {
-                                       remove = {};
-                                       remove[ itemEvent ] = [ 'emit', this.aggregateItemEvents[ itemEvent ], item ];
-                                       item.disconnect( this, remove );
-                               }
-                       }
-                       // Prevent future items from aggregating event
-                       delete this.aggregateItemEvents[ itemEvent ];
-               }
-
-               // Add new aggregate event
-               if ( groupEvent ) {
-                       // Make future items aggregate event
-                       this.aggregateItemEvents[ itemEvent ] = groupEvent;
-                       // Add event aggregation to existing items
-                       for ( i = 0, len = this.items.length; i < len; i++ ) {
-                               item = this.items[ i ];
-                               if ( item.connect && item.disconnect ) {
-                                       add = {};
-                                       add[ itemEvent ] = [ 'emit', groupEvent, item ];
-                                       item.connect( this, add );
-                               }
-                       }
-               }
-       }
-};
-
 /**
  * Add items to the group.
  *
@@ -2376,46 +2300,54 @@ OO.ui.mixin.GroupElement.prototype.aggregate = function ( events ) {
  * @chainable
  */
 OO.ui.mixin.GroupElement.prototype.addItems = function ( items, index ) {
-       var i, len, item, itemEvent, events, currentIndex,
-               itemElements = [];
+       // Mixin method
+       OO.EmitterList.prototype.addItems.call( this, items, index );
 
-       for ( i = 0, len = items.length; i < len; i++ ) {
-               item = items[ i ];
+       this.emit( 'change', this.getItems() );
+       return this;
+};
 
-               // Check if item exists then remove it first, effectively "moving" it
-               currentIndex = this.items.indexOf( item );
-               if ( currentIndex >= 0 ) {
-                       this.removeItems( [ item ] );
-                       // Adjust index to compensate for removal
-                       if ( currentIndex < index ) {
-                               index--;
-                       }
-               }
-               // Add the item
-               if ( item.connect && item.disconnect && !$.isEmptyObject( this.aggregateItemEvents ) ) {
-                       events = {};
-                       for ( itemEvent in this.aggregateItemEvents ) {
-                               events[ itemEvent ] = [ 'emit', this.aggregateItemEvents[ itemEvent ], item ];
-                       }
-                       item.connect( this, events );
-               }
-               item.setElementGroup( this );
-               itemElements.push( item.$element.get( 0 ) );
-       }
+/**
+ * @inheritdoc
+ */
+OO.ui.mixin.GroupElement.prototype.moveItem = function ( items, newIndex ) {
+       // insertItemElements expects this.items to not have been modified yet, so call before the mixin
+       this.insertItemElements( items, newIndex );
 
+       // Mixin method
+       newIndex = OO.EmitterList.prototype.moveItem.call( this, items, newIndex );
+
+       return newIndex;
+};
+
+/**
+ * @inheritdoc
+ */
+OO.ui.mixin.GroupElement.prototype.insertItem = function ( item, index ) {
+       item.setElementGroup( this );
+       this.insertItemElements( item, index );
+
+       // Mixin method
+       index = OO.EmitterList.prototype.insertItem.call( this, item, index );
+
+       return index;
+};
+
+/**
+ * Insert elements into the group
+ *
+ * @private
+ * @param {OO.ui.Element} itemWidget Item to insert
+ * @param {number} index Insertion index
+ */
+OO.ui.mixin.GroupElement.prototype.insertItemElements = function ( itemWidget, index ) {
        if ( index === undefined || index < 0 || index >= this.items.length ) {
-               this.$group.append( itemElements );
-               this.items.push.apply( this.items, items );
+               this.$group.append( itemWidget.$element );
        } else if ( index === 0 ) {
-               this.$group.prepend( itemElements );
-               this.items.unshift.apply( this.items, items );
+               this.$group.prepend( itemWidget.$element );
        } else {
-               this.items[ index ].$element.before( itemElements );
-               this.items.splice.apply( this.items, [ index, 0 ].concat( items ) );
+               this.items[ index ].$element.before( itemWidget.$element );
        }
-
-       this.emit( 'change', this.getItems() );
-       return this;
 };
 
 /**
@@ -2428,26 +2360,21 @@ OO.ui.mixin.GroupElement.prototype.addItems = function ( items, index ) {
  * @chainable
  */
 OO.ui.mixin.GroupElement.prototype.removeItems = function ( items ) {
-       var i, len, item, index, events, itemEvent;
+       var i, len, item, index;
 
-       // Remove specific items
+       // Remove specific items elements
        for ( i = 0, len = items.length; i < len; i++ ) {
                item = items[ i ];
                index = this.items.indexOf( item );
                if ( index !== -1 ) {
-                       if ( item.connect && item.disconnect && !$.isEmptyObject( this.aggregateItemEvents ) ) {
-                               events = {};
-                               for ( itemEvent in this.aggregateItemEvents ) {
-                                       events[ itemEvent ] = [ 'emit', this.aggregateItemEvents[ itemEvent ], item ];
-                               }
-                               item.disconnect( this, events );
-                       }
                        item.setElementGroup( null );
-                       this.items.splice( index, 1 );
                        item.$element.detach();
                }
        }
 
+       // Mixin method
+       OO.EmitterList.prototype.removeItems.call( this, items );
+
        this.emit( 'change', this.getItems() );
        return this;
 };
@@ -2461,27 +2388,18 @@ OO.ui.mixin.GroupElement.prototype.removeItems = function ( items ) {
  * @chainable
  */
 OO.ui.mixin.GroupElement.prototype.clearItems = function () {
-       var i, len, item, remove, itemEvent;
+       var i, len;
 
-       // Remove all items
+       // Remove all item elements
        for ( i = 0, len = this.items.length; i < len; i++ ) {
-               item = this.items[ i ];
-               if (
-                       item.connect && item.disconnect &&
-                       !$.isEmptyObject( this.aggregateItemEvents )
-               ) {
-                       remove = {};
-                       if ( Object.prototype.hasOwnProperty.call( this.aggregateItemEvents, itemEvent ) ) {
-                               remove[ itemEvent ] = [ 'emit', this.aggregateItemEvents[ itemEvent ], item ];
-                       }
-                       item.disconnect( this, remove );
-               }
-               item.setElementGroup( null );
-               item.$element.detach();
+               this.items[ i ].setElementGroup( null );
+               this.items[ i ].$element.detach();
        }
 
+       // Mixin method
+       OO.EmitterList.prototype.clearItems.call( this );
+
        this.emit( 'change', this.getItems() );
-       this.items = [];
        return this;
 };
 
@@ -3541,6 +3459,12 @@ OO.mixinClass( OO.ui.ButtonWidget, OO.ui.mixin.AccessKeyedElement );
  */
 OO.ui.ButtonWidget.static.cancelButtonMouseDownEvents = false;
 
+/**
+ * @static
+ * @inheritdoc
+ */
+OO.ui.ButtonWidget.static.tagName = 'span';
+
 /* Methods */
 
 /**
@@ -3718,6 +3642,14 @@ OO.ui.ButtonGroupWidget = function OoUiButtonGroupWidget( config ) {
 OO.inheritClass( OO.ui.ButtonGroupWidget, OO.ui.Widget );
 OO.mixinClass( OO.ui.ButtonGroupWidget, OO.ui.mixin.GroupElement );
 
+/* Static Properties */
+
+/**
+ * @static
+ * @inheritdoc
+ */
+OO.ui.ButtonGroupWidget.static.tagName = 'span';
+
 /**
  * IconWidget is a generic widget for {@link OO.ui.mixin.IconElement icons}. In general, IconWidgets should be used with OO.ui.LabelWidget,
  * which creates a label that identifies the icon’s function. See the [OOjs UI documentation on MediaWiki] [1]
@@ -4301,6 +4233,20 @@ OO.ui.mixin.FloatableElement.prototype.position = function () {
                return this;
        }
 
+       if ( !(
+               // To continue, some things need to be true:
+               // The element must actually be in the DOM
+               this.isElementAttached() && (
+                       // The closest scrollable is the current window
+                       this.$floatableClosestScrollable[ 0 ] === this.getElementWindow() ||
+                       // OR is an element in the element's DOM
+                       $.contains( this.getElementDocument(), this.$floatableClosestScrollable[ 0 ] )
+               )
+       ) ) {
+               // Abort early if important parts of the widget are no longer attached to the DOM
+               return this;
+       }
+
        if ( this.hideWhenOutOfView && !this.isElementInViewport( this.$floatableContainer, this.$floatableClosestScrollable ) ) {
                this.$floatable.addClass( 'oo-ui-element-hidden' );
                return this;
@@ -4881,6 +4827,14 @@ OO.mixinClass( OO.ui.PopupWidget, OO.ui.mixin.LabelElement );
 OO.mixinClass( OO.ui.PopupWidget, OO.ui.mixin.ClippableElement );
 OO.mixinClass( OO.ui.PopupWidget, OO.ui.mixin.FloatableElement );
 
+/* Events */
+
+/**
+ * @event ready
+ *
+ * The popup is ready: it is visible and has been positioned and clipped.
+ */
+
 /* Methods */
 
 /**
@@ -5014,6 +4968,7 @@ OO.ui.PopupWidget.prototype.hasAnchor = function () {
  * Side-effects may include broken interface and exceptions being thrown. This wasn't always
  * strictly enforced, so currently it only generates a warning in the browser console.
  *
+ * @fires ready
  * @inheritdoc
  */
 OO.ui.PopupWidget.prototype.toggle = function ( show ) {
@@ -5044,6 +4999,7 @@ OO.ui.PopupWidget.prototype.toggle = function ( show ) {
                        }
                        this.updateDimensions();
                        this.toggleClipping( true );
+                       this.emit( 'ready' );
                } else {
                        this.toggleClipping( false );
                        if ( this.autoClose ) {
@@ -5247,12 +5203,6 @@ OO.ui.PopupWidget.prototype.computePosition = function () {
  *  `backwards` or `forwards`.
  */
 OO.ui.PopupWidget.prototype.setAlignment = function ( align ) {
-       // Transform values deprecated since v0.11.0
-       if ( align === 'left' || align === 'right' ) {
-               OO.ui.warnDeprecation( 'PopupWidget#setAlignment parameter value `' + align + '` is deprecated. Use `force-right` or `force-left` instead.' );
-               align = { left: 'force-right', right: 'force-left' }[ align ];
-       }
-
        // Validate alignment
        if ( [ 'force-left', 'force-right', 'backwards', 'forwards', 'center' ].indexOf( align ) > -1 ) {
                this.align = align;
@@ -6723,7 +6673,8 @@ OO.ui.MenuSectionOptionWidget = function OoUiMenuSectionOptionWidget( config ) {
        OO.ui.MenuSectionOptionWidget.parent.call( this, config );
 
        // Initialization
-       this.$element.addClass( 'oo-ui-menuSectionOptionWidget' );
+       this.$element.addClass( 'oo-ui-menuSectionOptionWidget' )
+               .attr( 'role', '' );
 };
 
 /* Setup */
@@ -7939,23 +7890,6 @@ OO.ui.FloatingMenuSelectWidget.prototype.toggle = function ( visible ) {
        return this;
 };
 
-/*
- * The old name for the FloatingMenuSelectWidget widget, provided for backwards-compatibility.
- *
- * @class
- * @extends OO.ui.FloatingMenuSelectWidget
- *
- * @constructor
- * @deprecated since v0.12.5.
- */
-OO.ui.TextInputMenuSelectWidget = function OoUiTextInputMenuSelectWidget() {
-       OO.ui.warnDeprecation( 'TextInputMenuSelectWidget is deprecated. Use the FloatingMenuSelectWidget instead.' );
-       // Parent constructor
-       OO.ui.TextInputMenuSelectWidget.parent.apply( this, arguments );
-};
-
-OO.inheritClass( OO.ui.TextInputMenuSelectWidget, OO.ui.FloatingMenuSelectWidget );
-
 /**
  * Progress bars visually display the status of an operation, such as a download,
  * and can be either determinate or indeterminate:
@@ -8429,6 +8363,12 @@ OO.mixinClass( OO.ui.ButtonInputWidget, OO.ui.mixin.TitledElement );
  */
 OO.ui.ButtonInputWidget.static.supportsSimpleLabel = false;
 
+/**
+ * @static
+ * @inheritdoc
+ */
+OO.ui.ButtonInputWidget.static.tagName = 'span';
+
 /* Methods */
 
 /**
@@ -8543,6 +8483,14 @@ OO.ui.CheckboxInputWidget = function OoUiCheckboxInputWidget( config ) {
 
 OO.inheritClass( OO.ui.CheckboxInputWidget, OO.ui.InputWidget );
 
+/* Static Properties */
+
+/**
+ * @static
+ * @inheritdoc
+ */
+OO.ui.CheckboxInputWidget.static.tagName = 'span';
+
 /* Static Methods */
 
 /**
@@ -8740,10 +8688,17 @@ OO.ui.DropdownInputWidget.prototype.setOptions = function ( options ) {
                .clearItems()
                .addItems( options.map( function ( opt ) {
                        var optValue = widget.cleanUpValue( opt.data );
-                       return new OO.ui.MenuOptionWidget( {
-                               data: optValue,
-                               label: opt.label !== undefined ? opt.label : optValue
-                       } );
+
+                       if ( opt.optgroup === undefined ) {
+                               return new OO.ui.MenuOptionWidget( {
+                                       data: optValue,
+                                       label: opt.label !== undefined ? opt.label : optValue
+                               } );
+                       } else {
+                               return new OO.ui.MenuSectionOptionWidget( {
+                                       label: opt.optgroup
+                               } );
+                       }
                } ) );
 
        // Restore the previous value, or reset to something sensible
@@ -8836,6 +8791,14 @@ OO.ui.RadioInputWidget = function OoUiRadioInputWidget( config ) {
 
 OO.inheritClass( OO.ui.RadioInputWidget, OO.ui.InputWidget );
 
+/* Static Properties */
+
+/**
+ * @static
+ * @inheritdoc
+ */
+OO.ui.RadioInputWidget.static.tagName = 'span';
+
 /* Static Methods */
 
 /**
@@ -9266,7 +9229,7 @@ OO.ui.CheckboxMultiselectInputWidget.prototype.setOptions = function ( options )
  * @constructor
  * @param {Object} [config] Configuration options
  * @cfg {string} [type='text'] The value of the HTML `type` attribute: 'text', 'password', 'search',
- *  'email', 'url', 'date', 'month' or 'number'. Ignored if `multiline` is true.
+ *  'email', 'url' or 'number'. Ignored if `multiline` is true.
  *
  *  Some values of `type` result in additional behaviors:
  *
@@ -9793,8 +9756,6 @@ OO.ui.TextInputWidget.prototype.getSaneType = function ( config ) {
                'search',
                'email',
                'url',
-               'date',
-               'month',
                'number'
        ];
        return allowedTypes.indexOf( config.type ) !== -1 ? config.type : 'text';
@@ -10547,9 +10508,9 @@ OO.ui.FieldLayout = function OoUiFieldLayout( fieldWidget, config ) {
        this.fieldWidget = fieldWidget;
        this.errors = [];
        this.notices = [];
-       this.$field = $( '<div>' );
+       this.$field = this.isFieldInline() ? $( '<span>' ) : $( '<div>' );
        this.$messages = $( '<ul>' );
-       this.$header = $( '<div>' );
+       this.$header = $( '<span>' );
        this.$body = $( '<div>' );
        this.align = null;
        if ( config.help ) {
@@ -10629,6 +10590,17 @@ OO.ui.FieldLayout.prototype.getField = function () {
        return this.fieldWidget;
 };
 
+/**
+ * Return `true` if the given field widget can be used with `'inline'` alignment (see
+ * #setAlignment). Return `false` if it can't or if this can't be determined.
+ *
+ * @return {boolean}
+ */
+OO.ui.FieldLayout.prototype.isFieldInline = function () {
+       // This is very simplistic, but should be good enough.
+       return this.getField().$element.prop( 'tagName' ).toLowerCase() === 'span';
+};
+
 /**
  * @protected
  * @param {string} kind 'error' or 'notice'
@@ -10665,6 +10637,10 @@ OO.ui.FieldLayout.prototype.setAlignment = function ( value ) {
                if ( [ 'left', 'right', 'top', 'inline' ].indexOf( value ) === -1 ) {
                        value = 'left';
                }
+               // Validate
+               if ( value === 'inline' && !this.isFieldInline() ) {
+                       value = 'top';
+               }
                // Reorder elements
                if ( value === 'top' ) {
                        this.$header.append( this.$label, this.$help );
@@ -10800,8 +10776,8 @@ OO.ui.ActionFieldLayout = function OoUiActionFieldLayout( fieldWidget, buttonWid
 
        // Properties
        this.buttonWidget = buttonWidget;
-       this.$button = $( '<div>' );
-       this.$input = $( '<div>' );
+       this.$button = $( '<span>' );
+       this.$input = this.isFieldInline() ? $( '<span>' ) : $( '<div>' );
 
        // Initialization
        this.$element
index 7b1c099..8538b6e 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.19.5
+ * OOjs UI v0.20.2
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-03-07T22:57:01Z
+ * Date: 2017-03-30T20:34:37Z
  */
 ( function ( OO ) {
 
index 7604589..983bc69 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.19.5
+ * OOjs UI v0.20.2
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-03-07T22:57:06Z
+ * Date: 2017-03-30T20:34:41Z
  */
 .oo-ui-popupTool .oo-ui-popupWidget-popup,
 .oo-ui-popupTool .oo-ui-popupWidget-anchor {
index ad1746d..502b7b1 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.19.5
+ * OOjs UI v0.20.2
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-03-07T22:57:06Z
+ * Date: 2017-03-30T20:34:41Z
  */
 .oo-ui-tool.oo-ui-widget-enabled {
   -webkit-transition: background-color 100ms;
   height: 2.5em;
 }
 .oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator {
-  width: 0.9375em;
-  height: 1.625em;
-  margin: 0.78125em 0.5em;
   top: 0;
   right: 0;
+  width: 0.9375em;
+  height: 100%;
+  margin: 0 0.5em;
   opacity: 0.3;
 }
 .oo-ui-toolbar-narrow .oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator {
index 1574f6c..4cc0db1 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.19.5
+ * OOjs UI v0.20.2
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-03-07T22:57:01Z
+ * Date: 2017-03-30T20:34:37Z
  */
 ( function ( OO ) {
 
index 4ec3d1c..a9b31da 100644 (file)
@@ -1,22 +1,22 @@
 /*!
- * OOjs UI v0.19.5
+ * OOjs UI v0.20.2
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-03-07T22:57:06Z
+ * Date: 2017-03-30T20:34:41Z
  */
-.oo-ui-draggableElement-handle,
-.oo-ui-draggableElement-handle.oo-ui-widget {
+.oo-ui-draggableElement-handle:not( .oo-ui-draggableElement-undraggable ),
+.oo-ui-draggableElement-handle:not( .oo-ui-draggableElement-undraggable ).oo-ui-widget {
   cursor: move;
   cursor: url(images/grab.cur );
   cursor: -webkit-grab;
   cursor:    -moz-grab;
   cursor:         grab;
 }
-.oo-ui-draggableElement-handle:active {
+.oo-ui-draggableElement-handle:not( .oo-ui-draggableElement-undraggable ):active {
   cursor: url(images/grabbing.cur );
   cursor: -webkit-grabbing;
   cursor:    -moz-grabbing;
 .oo-ui-numberInputWidget-buttoned .oo-ui-buttonWidget,
 .oo-ui-numberInputWidget-buttoned .oo-ui-textInputWidget {
   display: table-cell;
+  height: 100%;
+}
+.oo-ui-numberInputWidget-buttoned .oo-ui-textInputWidget input {
+  height: 100%;
 }
 .oo-ui-numberInputWidget-field {
   display: table;
index f64a619..8438a3d 100644 (file)
@@ -1,22 +1,22 @@
 /*!
- * OOjs UI v0.19.5
+ * OOjs UI v0.20.2
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-03-07T22:57:06Z
+ * Date: 2017-03-30T20:34:41Z
  */
-.oo-ui-draggableElement-handle,
-.oo-ui-draggableElement-handle.oo-ui-widget {
+.oo-ui-draggableElement-handle:not( .oo-ui-draggableElement-undraggable ),
+.oo-ui-draggableElement-handle:not( .oo-ui-draggableElement-undraggable ).oo-ui-widget {
   cursor: move;
   cursor: url(images/grab.cur );
   cursor: -webkit-grab;
   cursor:    -moz-grab;
   cursor:         grab;
 }
-.oo-ui-draggableElement-handle:active {
+.oo-ui-draggableElement-handle:not( .oo-ui-draggableElement-undraggable ):active {
   cursor: url(images/grabbing.cur );
   cursor: -webkit-grabbing;
   cursor:    -moz-grabbing;
 }
 .oo-ui-buttonOptionWidget {
   display: inline-block;
-  padding: 0;
 }
 .oo-ui-buttonOptionWidget.oo-ui-buttonElement-active .oo-ui-buttonElement-button {
   cursor: default;
   display: inline-block;
   vertical-align: middle;
 }
-.oo-ui-buttonOptionWidget.oo-ui-optionWidget-selected,
-.oo-ui-buttonOptionWidget.oo-ui-optionWidget-pressed,
-.oo-ui-buttonOptionWidget.oo-ui-optionWidget-highlighted {
-  background-color: transparent;
-}
 .oo-ui-toggleButtonWidget {
   margin-right: 0.5em;
 }
           box-sizing: border-box;
   display: block;
   right: 2.375em;
-  margin: 0;
-  padding-left: 0.5em;
-  line-height: 2.3;
+  padding-top: 0.625em;
+  padding-left: 0.546875em;
+  padding-bottom: 0.546875em;
+  line-height: 1.172em;
   white-space: nowrap;
 }
 .oo-ui-selectFileWidget-fileName {
   text-overflow: ellipsis;
 }
 .oo-ui-selectFileWidget-clearButton {
-  top: 0;
+  top: -1px;
   right: 0;
   min-width: 24px;
   width: 1.875em;
   margin-right: 0;
 }
 .oo-ui-selectFileWidget-clearButton .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-  height: 2.3em;
+  height: 2.5em;
 }
 .oo-ui-selectFileWidget-empty .oo-ui-selectFileWidget-label {
   color: #72777d;
 }
 .oo-ui-selectFileWidget.oo-ui-widget-disabled .oo-ui-selectFileWidget-info > .oo-ui-iconElement-icon,
 .oo-ui-selectFileWidget-empty.oo-ui-widget-disabled .oo-ui-selectFileWidget-info > .oo-ui-iconElement-icon,
-.oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-info > .oo-ui-iconElement-icon,
+.oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-info > .oo-ui-iconElement-icon {
+  opacity: 0.51;
+}
 .oo-ui-selectFileWidget.oo-ui-widget-disabled .oo-ui-selectFileWidget-info > .oo-ui-indicatorElement-indicator,
 .oo-ui-selectFileWidget-empty.oo-ui-widget-disabled .oo-ui-selectFileWidget-info > .oo-ui-indicatorElement-indicator,
 .oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-info > .oo-ui-indicatorElement-indicator {
-  opacity: 0.51;
+  opacity: 0.15;
 }
 .oo-ui-widget-disabled .oo-ui-selectFileWidget-dropLabel {
   display: none;
 .oo-ui-numberInputWidget-buttoned .oo-ui-buttonWidget,
 .oo-ui-numberInputWidget-buttoned .oo-ui-textInputWidget {
   display: table-cell;
+  height: 100%;
+}
+.oo-ui-numberInputWidget-buttoned .oo-ui-textInputWidget input {
+  height: 100%;
 }
 .oo-ui-numberInputWidget-field {
   display: table;
index d1fbe0d..3482256 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.19.5
+ * OOjs UI v0.20.2
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-03-07T22:57:01Z
+ * Date: 2017-03-30T20:34:37Z
  */
 ( function ( OO ) {
 
@@ -24,6 +24,9 @@
  * @constructor
  * @param {Object} [config] Configuration options
  * @cfg {jQuery} [$handle] The part of the element which can be used for dragging, defaults to the whole element
+ * @cfg {boolean} [draggable] The items are draggable. This can change with #toggleDraggable
+ *  but the draggable state should be called from the DraggableGroupElement, which updates
+ *  the whole group
  */
 OO.ui.mixin.DraggableElement = function OoUiMixinDraggableElement( config ) {
        config = config || {};
@@ -32,6 +35,7 @@ OO.ui.mixin.DraggableElement = function OoUiMixinDraggableElement( config ) {
        this.index = null;
        this.$handle = config.$handle || this.$element;
        this.wasHandleUsed = null;
+       this.draggable = config.draggable === undefined ? true : !!config.draggable;
 
        // Initialize and events
        this.$element.addClass( 'oo-ui-draggableElement' )
@@ -81,6 +85,32 @@ OO.ui.mixin.DraggableElement.static.cancelButtonMouseDownEvents = false;
 
 /* Methods */
 
+/**
+ * Change the draggable state of this widget.
+ * This allows users to temporarily halt the dragging operations.
+ *
+ * @param {boolean} isDraggable Widget supports draggable operations
+ * @fires draggable
+ */
+OO.ui.mixin.DraggableElement.prototype.toggleDraggable = function ( isDraggable ) {
+       isDraggable = isDraggable !== undefined ? !!isDraggable : !this.draggable;
+
+       if ( this.draggable !== isDraggable ) {
+               this.draggable = isDraggable;
+
+               this.$element.toggleClass( 'oo-ui-draggableElement-undraggable', !this.draggable );
+       }
+};
+
+/**
+ * Check the draggable state of this widget
+ *
+ * @return {boolean} Widget supports draggable operations
+ */
+OO.ui.mixin.DraggableElement.prototype.isDraggable = function () {
+       return this.draggable;
+};
+
 /**
  * Respond to mousedown event.
  *
@@ -88,6 +118,10 @@ OO.ui.mixin.DraggableElement.static.cancelButtonMouseDownEvents = false;
  * @param {jQuery.Event} e Drag event
  */
 OO.ui.mixin.DraggableElement.prototype.onDragMouseDown = function ( e ) {
+       if ( !this.isDraggable() ) {
+               return;
+       }
+
        this.wasHandleUsed =
                // Optimization: if the handle is the whole element this is always true
                this.$handle[ 0 ] === this.$element[ 0 ] ||
@@ -107,7 +141,7 @@ OO.ui.mixin.DraggableElement.prototype.onDragStart = function ( e ) {
        var element = this,
                dataTransfer = e.originalEvent.dataTransfer;
 
-       if ( !this.wasHandleUsed ) {
+       if ( !this.wasHandleUsed || !this.isDraggable() ) {
                return false;
        }
 
@@ -208,6 +242,7 @@ OO.ui.mixin.DraggableElement.prototype.getIndex = function () {
  *  should match the layout of the items. Items displayed in a single row
  *  or in several rows should use horizontal orientation. The vertical orientation should only be
  *  used when the items are displayed in a single column. Defaults to 'vertical'
+ * @cfg {boolean} [draggable] The items are draggable. This can change with #toggleDraggable
  */
 OO.ui.mixin.DraggableGroupElement = function OoUiMixinDraggableGroupElement( config ) {
        // Configuration initialization
@@ -222,6 +257,7 @@ OO.ui.mixin.DraggableGroupElement = function OoUiMixinDraggableGroupElement( con
        this.itemKeys = {};
        this.dir = null;
        this.itemsOrder = null;
+       this.draggable = config.draggable === undefined ? true : !!config.draggable;
 
        // Events
        this.aggregate( {
@@ -260,15 +296,54 @@ OO.mixinClass( OO.ui.mixin.DraggableGroupElement, OO.ui.mixin.GroupElement );
  */
 
 /**
- * And item has been dropped at a new position.
+ * An item has been dropped at a new position.
  *
  * @event reorder
  * @param {OO.ui.mixin.DraggableElement} item Reordered item
  * @param {number} [newIndex] New index for the item
  */
 
+/**
+ * Draggable state of this widget has changed.
+ *
+ * @event draggable
+ * @param {boolean} [draggable] Widget is draggable
+ */
+
 /* Methods */
 
+/**
+ * Change the draggable state of this widget.
+ * This allows users to temporarily halt the dragging operations.
+ *
+ * @param {boolean} isDraggable Widget supports draggable operations
+ * @fires draggable
+ */
+OO.ui.mixin.DraggableGroupElement.prototype.toggleDraggable = function ( isDraggable ) {
+       isDraggable = isDraggable !== undefined ? !!isDraggable : !this.draggable;
+
+       if ( this.draggable !== isDraggable ) {
+               this.draggable = isDraggable;
+
+               // Tell the items their draggable state changed
+               this.getItems().forEach( function ( item ) {
+                       item.toggleDraggable( this.draggable );
+               }.bind( this ) );
+
+               // Emit event
+               this.emit( 'draggable', this.draggable );
+       }
+};
+
+/**
+ * Check the draggable state of this widget
+ *
+ * @return {boolean} Widget supports draggable operations
+ */
+OO.ui.mixin.DraggableGroupElement.prototype.isDraggable = function () {
+       return this.draggable;
+};
+
 /**
  * Respond to item drag start event
  *
@@ -276,6 +351,9 @@ OO.mixinClass( OO.ui.mixin.DraggableGroupElement, OO.ui.mixin.GroupElement );
  * @param {OO.ui.mixin.DraggableElement} item Dragged item
  */
 OO.ui.mixin.DraggableGroupElement.prototype.onItemDragStart = function ( item ) {
+       if ( !this.isDraggable() ) {
+               return;
+       }
        // Make a shallow copy of this.items so we can re-order it during previews
        // without affecting the original array.
        this.itemsOrder = this.items.slice();
@@ -2739,6 +2817,14 @@ OO.mixinClass( OO.ui.ToggleButtonWidget, OO.ui.mixin.TitledElement );
 OO.mixinClass( OO.ui.ToggleButtonWidget, OO.ui.mixin.FlaggedElement );
 OO.mixinClass( OO.ui.ToggleButtonWidget, OO.ui.mixin.TabIndexedElement );
 
+/* Static Properties */
+
+/**
+ * @static
+ * @inheritdoc
+ */
+OO.ui.ToggleButtonWidget.static.tagName = 'span';
+
 /* Methods */
 
 /**
@@ -3969,7 +4055,7 @@ OO.ui.CapsuleMultiselectWidget.prototype.addItems = function ( items ) {
        }
        if ( !same ) {
                this.emit( 'change', this.getItemsData() );
-               this.updateIfHeightChanged();
+               this.updateInputSize();
        }
 
        return this;
@@ -4009,7 +4095,7 @@ OO.ui.CapsuleMultiselectWidget.prototype.removeItems = function ( items ) {
        }
        if ( !same ) {
                this.emit( 'change', this.getItemsData() );
-               this.updateIfHeightChanged();
+               this.updateInputSize();
        }
 
        return this;
@@ -4022,7 +4108,7 @@ OO.ui.CapsuleMultiselectWidget.prototype.clearItems = function () {
        if ( this.items.length ) {
                OO.ui.mixin.GroupElement.prototype.clearItems.call( this );
                this.emit( 'change', this.getItemsData() );
-               this.updateIfHeightChanged();
+               this.updateInputSize();
        }
        return this;
 };
@@ -4235,6 +4321,7 @@ OO.ui.CapsuleMultiselectWidget.prototype.updateInputSize = function () {
                currentWidth = this.$input.width();
 
                if ( contentWidth < currentWidth ) {
+                       this.updateIfHeightChanged();
                        // All is fine, don't perform expensive calculations
                        return;
                }
@@ -4256,6 +4343,8 @@ OO.ui.CapsuleMultiselectWidget.prototype.updateInputSize = function () {
                }
                this.$input.width( Math.floor( bestWidth ) );
                this.updateIfHeightChanged();
+       } else {
+               this.updateIfHeightChanged();
        }
 };
 
@@ -4376,23 +4465,6 @@ OO.ui.CapsuleMultiselectWidget.prototype.focus = function () {
        return this;
 };
 
-/**
- * The old name for the CapsuleMultiselectWidget widget, provided for backwards-compatibility.
- *
- * @class
- * @extends OO.ui.CapsuleMultiselectWidget
- *
- * @constructor
- * @deprecated since 0.17.3; use OO.ui.CapsuleMultiselectWidget instead
- */
-OO.ui.CapsuleMultiSelectWidget = function OoUiCapsuleMultiSelectWidget() {
-       OO.ui.warnDeprecation( 'CapsuleMultiSelectWidget is deprecated. Use the CapsuleMultiselectWidget instead.' );
-       // Parent constructor
-       OO.ui.CapsuleMultiSelectWidget.parent.apply( this, arguments );
-};
-
-OO.inheritClass( OO.ui.CapsuleMultiSelectWidget, OO.ui.CapsuleMultiselectWidget );
-
 /**
  * SelectFileWidgets allow for selecting files, using the HTML5 File API. These
  * widgets can be configured with {@link OO.ui.mixin.IconElement icons} and {@link
index 4353b43..4842a46 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.19.5
+ * OOjs UI v0.20.2
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-03-07T22:57:06Z
+ * Date: 2017-03-30T20:34:41Z
  */
 .oo-ui-actionWidget.oo-ui-pendingElement-pending {
   background-image: /* @embed */ url(themes/apex/images/textures/pending.gif);
   color: #000;
 }
 .oo-ui-messageDialog-message {
-  font-size: 0.9em;
-  line-height: 1.25em;
-  color: #666;
-}
-.oo-ui-messageDialog-message-verbose {
   font-size: 1.1em;
   line-height: 1.5em;
+  color: #666;
   text-align: left;
 }
 .oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget {
index 823b1a1..beca510 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.19.5
+ * OOjs UI v0.20.2
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-03-07T22:57:06Z
+ * Date: 2017-03-30T20:34:41Z
  */
 .oo-ui-window {
   background: transparent;
   color: #000;
 }
 .oo-ui-messageDialog-message {
-  font-size: 0.9em;
-  line-height: 1.25;
-  color: #222;
-}
-.oo-ui-messageDialog-message-verbose {
   font-size: 1.1em;
   line-height: 1.4;
+  color: #222;
   text-align: left;
 }
 .oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget {
   border-bottom-width: 0;
 }
 .oo-ui-messageDialog-actions .oo-ui-actionWidget {
-  min-height: 3.4em;
+  min-height: 3.4375em;
   margin-right: 0;
 }
 .oo-ui-messageDialog-actions .oo-ui-actionWidget:last-child {
   border-radius: 0;
 }
 .oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-labelElement .oo-ui-labelElement-label {
-  line-height: 3.4;
+  line-height: 3.4375em;
   text-align: center;
 }
 .oo-ui-messageDialog-actions .oo-ui-actionWidget:hover {
   overflow-y: auto;
 }
 .oo-ui-processDialog-content .oo-ui-window-head {
-  height: 3.4em;
+  height: 3.4375em;
 }
 .oo-ui-processDialog-content .oo-ui-window-body {
-  top: 3.4em;
-  outline: 1px solid rgba(0, 0, 0, 0.2);
+  top: 3.4375em;
+  outline: 1px solid #c8ccd1;
 }
 .oo-ui-processDialog-navigation {
   position: relative;
-  height: 3.4em;
-  padding: 0 1em;
+  height: 3.4375em;
 }
 .oo-ui-processDialog-location {
-  padding: 0.75em 0;
-  height: 1.875em;
+  height: 3.4375em;
   cursor: default;
   text-align: center;
 }
 .oo-ui-processDialog-title {
   font-weight: bold;
-  line-height: 1.875em;
+  line-height: 3.4375em;
 }
 .oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-framed,
 .oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-framed,
 .oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-buttonElement-framed {
-  margin: 0.5em;
-}
-.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless,
-.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless,
-.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-buttonElement-frameless {
-  margin: 0;
+  margin: 0.46875em;
 }
 .oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless .oo-ui-buttonElement-button,
 .oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-frameless .oo-ui-buttonElement-button,
   top: 1em;
   bottom: 1em;
   max-height: 100%;
-  max-height: calc(100% - 2em);
+  max-height: calc( 100% - 2em );
   border: 1px solid #a2a9b1;
   border-radius: 2px;
   box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.25);
index 586efb0..1cbec34 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.19.5
+ * OOjs UI v0.20.2
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2017 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2017-03-07T22:57:01Z
+ * Date: 2017-03-30T20:34:37Z
  */
 ( function ( OO ) {
 
@@ -118,7 +118,10 @@ OO.ui.ActionWidget.prototype.propagateResize = function () {
                if ( width !== this.width || height !== this.height ) {
                        this.width = width;
                        this.height = height;
-                       this.emit( 'resize' );
+                       this.emit( 'resizePrivate' );
+                       if ( this.emit( 'resize' ) ) {
+                               OO.ui.warnDeprecation( 'ActionWidget: resize event is deprecated. See T129162.' );
+                       }
                }
        }
 
@@ -561,9 +564,13 @@ OO.ui.ActionSet.prototype.add = function ( actions ) {
                action = actions[ i ];
                action.connect( this, {
                        click: [ 'emit', 'click', action ],
-                       resize: [ 'emit', 'resize', action ],
                        toggle: [ 'onActionChange' ]
                } );
+               action.on( 'resizePrivate', function ( action ) {
+                       if ( this.emit( 'resize', action ) ) {
+                               OO.ui.warnDeprecation( 'ActionSet: resize event is deprecated. See T129162.' );
+                       }
+               }, [ action ], this );
                this.list.push( action );
        }
        this.organized = false;
@@ -1326,7 +1333,7 @@ OO.ui.WindowManager.prototype.openWindow = function ( win, data ) {
                                manager.toggleGlobalEvents( true );
                                manager.toggleAriaIsolation( true );
                        }
-                       manager.$returnFocusTo = data.$returnFocusTo || $( document.activeElement );
+                       manager.$returnFocusTo = data.$returnFocusTo !== undefined ? data.$returnFocusTo : $( document.activeElement );
                        manager.currentWindow = win;
                        manager.opening = opening;
                        manager.preparingToOpen = null;
@@ -2733,12 +2740,6 @@ OO.ui.MessageDialog.static.name = 'message';
  */
 OO.ui.MessageDialog.static.size = 'small';
 
-/**
- * @static
- * @deprecated since v0.18.4 as default; TODO: Remove
- */
-OO.ui.MessageDialog.static.verbose = true;
-
 /**
  * Dialog title.
  *
@@ -2856,11 +2857,6 @@ OO.ui.MessageDialog.prototype.getSetupProcess = function ( data ) {
                        this.message.setLabel(
                                data.message !== undefined ? data.message : this.constructor.static.message
                        );
-                       // @deprecated since v0.18.4 as default; TODO: Remove and make default instead.
-                       this.message.$element.toggleClass(
-                               'oo-ui-messageDialog-message-verbose',
-                               data.verbose !== undefined ? data.verbose : this.constructor.static.verbose
-                       );
                }, this );
 };
 
index 892b8db..c3977eb 100644 (file)
@@ -2,17 +2,20 @@
        "prefix": "oo-ui-icon",
        "intro": "@import '../../../../src/styles/common';",
        "images": {
+               "alert": { "file": "images/icons/alert.svg" },
                "bell": { "file": "images/icons/bell.svg" },
                "bellOn": { "file": {
                        "ltr": "images/icons/bellOn-ltr.svg",
                        "rtl": "images/icons/bellOn-rtl.svg"
                } },
+               "comment": { "file": "images/icons/comment.svg" },
                "eye": { "file": "images/icons/eye.svg" },
                "eyeClosed": { "file": "images/icons/eyeClosed.svg" },
                "message": { "file": {
                        "ltr": "images/icons/message-ltr.svg",
                        "rtl": "images/icons/message-rtl.svg"
                } },
+               "notice": { "file": "images/icons/notice.svg" },
                "signature": { "file": {
                        "ltr": "images/icons/signature-ltr.svg",
                        "rtl": "images/icons/signature-rtl.svg"
index 0cd901f..a9db33f 100644 (file)
                        "ltr": "images/icons/articleRedirect-ltr.svg",
                        "rtl": "images/icons/articleRedirect-rtl.svg"
                } },
+               "history": { "file": "images/icons/history.svg" },
+               "info": { "file": "images/icons/info.svg" },
                "journal": { "file": {
                        "ltr": "images/icons/journal-ltr.svg",
                        "rtl": "images/icons/journal-rtl.svg"
                } },
+               "tag": { "file": "images/icons/tag.svg" },
                "upload": { "file": {
                        "ltr": "images/icons/upload-ltr.svg",
                        "rtl": "images/icons/upload-rtl.svg"
-               } }
+               } },
+               "window": { "file": "images/icons/window.svg" }
        }
 }
index ec18f29..64651fc 100644 (file)
@@ -1,16 +1,9 @@
 {
        "prefix": "oo-ui-icon",
        "intro": "@import '../../../../src/styles/common';",
-       "variants": {
-               "invert": {
-                       "color": "#FFFFFF",
-                       "global": true
-               }
-       },
        "images": {
                "add": { "file": "images/icons/add.svg" },
-               "beta": { "file": "images/icons/beta.svg", "deprecated": "Deprecated since v0.18.3, don't use." },
-               "betaLaunch": { "file": "images/icons/logo-wikimediaDiscovery.svg", "deprecated": "Moved since v0.18.3, use 'logoWikimediaDiscovery' from the 'Wikimedia' pack instead." },
+               "advanced": { "file": "images/icons/advanced.svg" },
                "bookmark": { "file": {
                        "ltr": "images/icons/bookmark-ltr.svg",
                        "rtl": "images/icons/bookmark-rtl.svg"
                        "ltr": "images/icons/browser-ltr.svg",
                        "rtl": "images/icons/browser-rtl.svg"
                } },
+               "cancel": { "file": "images/icons/cancel.svg" },
+               "check": { "file": "images/icons/check.svg" },
                "clear": { "file": "images/icons/clear.svg" },
                "clock": { "file": "images/icons/clock.svg" },
+               "close": { "file": "images/icons/close.svg" },
+               "ellipsis": { "file": "images/icons/ellipsis.svg" },
                "feedback": { "file": {
                        "ltr": "images/icons/feedback-ltr.svg",
                        "rtl": "images/icons/feedback-rtl.svg"
                        "rtl": "images/icons/funnel-rtl.svg"
                } },
                "heart": { "file": "images/icons/heart.svg" },
+               "help": { "file": {
+                       "ltr": "images/icons/help-ltr.svg",
+                       "rtl": "images/icons/help-rtl.svg",
+                       "lang": {
+                               "he,yi": "images/icons/help-ltr.svg"
+                       }
+               } },
                "key": { "file": {
                        "ltr": "images/icons/key-ltr.svg",
                        "rtl": "images/icons/key-rtl.svg"
                        "ltr": "images/icons/printer-ltr.svg",
                        "rtl": "images/icons/printer-rtl.svg"
                } },
-               "ribbonPrize": { "file": "images/icons/ribbonPrize.svg", "deprecated": "Deprecated since v0.18.3, don't use." },
+               "search": { "file": {
+                       "ltr": "images/icons/search-ltr.svg",
+                       "rtl": "images/icons/search-rtl.svg"
+                       }
+               },
+               "settings": { "file": "images/icons/settings.svg" },
                "subtract": { "file": "images/icons/subtract.svg" },
                "sun": { "file": {
                        "ltr": "images/icons/sun-ltr.svg",
diff --git a/resources/lib/oojs-ui/themes/apex/icons-layout.json b/resources/lib/oojs-ui/themes/apex/icons-layout.json
new file mode 100644 (file)
index 0000000..173b284
--- /dev/null
@@ -0,0 +1,25 @@
+{
+       "prefix": "oo-ui-icon",
+       "intro": "@import '../../../../src/styles/common';",
+       "images": {
+               "menu": { "file": "images/icons/menu.svg" },
+               "stripeFlow": { "file": {
+                       "ltr": "images/icons/stripeFlow-ltr.svg",
+                       "rtl": "images/icons/stripeFlow-rtl.svg"
+               } },
+               "stripeSideMenu": { "file": "images/icons/stripeSideMenu.svg" },
+               "stripeSummary": { "file": {
+                       "ltr": "images/icons/stripeSummary-ltr.svg",
+                       "rtl": "images/icons/stripeSummary-rtl.svg"
+               } },
+               "stripeToC": { "file": {
+                       "ltr": "images/icons/stripeToC-ltr.svg",
+                       "rtl": "images/icons/stripeToC-rtl.svg"
+               } },
+               "viewCompact": { "file": "images/icons/viewCompact.svg" },
+               "viewDetails": { "file": {
+                       "ltr": "images/icons/viewDetails-ltr.svg",
+                       "rtl": "images/icons/viewDetails-rtl.svg"
+               } }
+       }
+}
index c8385e4..b32ffbb 100644 (file)
@@ -3,10 +3,6 @@
        "intro": "@import '../../../../src/styles/common';",
        "images": {
                "block": { "file": "images/icons/block.svg" },
-               "blockUndo": { "file": {
-                       "ltr": "images/icons/unBlock-ltr.svg",
-                       "rtl": "images/icons/unBlock-rtl.svg"
-               }, "deprecated": "Renamed since v0.18.3, use 'unBlock' instead." },
                "unBlock": { "file": {
                        "ltr": "images/icons/unBlock-ltr.svg",
                        "rtl": "images/icons/unBlock-rtl.svg"
                        "ltr": "images/icons/flag-ltr.svg",
                        "rtl": "images/icons/flag-rtl.svg"
                } },
-               "flagUndo": { "file": {
-                       "ltr": "images/icons/unFlag-ltr.svg",
-                       "rtl": "images/icons/unFlag-rtl.svg"
-               }, "deprecated": "Renamed since v0.18.3, use 'unFlag' instead." },
                "unFlag": { "file": {
                        "ltr": "images/icons/unFlag-ltr.svg",
                        "rtl": "images/icons/unFlag-rtl.svg"
                        "ltr": "images/icons/unTrash-ltr.svg",
                        "rtl": "images/icons/unTrash-rtl.svg"
                } },
-               "trashUndo": { "file": {
-                       "ltr": "images/icons/unTrash-ltr.svg",
-                       "rtl": "images/icons/unTrash-rtl.svg"
-               }, "deprecated": "Renamed since v0.18.3, use 'unTrash' instead." },
                "ongoingConversation": {
                        "file": {
                                "ltr": "images/icons/ongoingConversation-ltr.svg",
index 9aa1b80..7ab6eaa 100644 (file)
                } },
                "caretDown": { "file": "images/icons/caretDown.svg" },
                "caretUp": { "file": "images/icons/caretUp.svg" },
+               "collapse": { "file": "images/icons/collapse.svg" },
                "downTriangle": { "file": "images/icons/downTriangle.svg" },
+               "expand": { "file": "images/icons/expand.svg" },
                "move": { "file": "images/icons/move.svg" },
+               "next": { "file": {
+                       "ltr": "images/icons/move-ltr.svg",
+                       "rtl": "images/icons/move-rtl.svg"
+                       }
+               },
+               "previous": { "file": {
+                       "ltr": "images/icons/move-rtl.svg",
+                       "rtl": "images/icons/move-ltr.svg"
+                       }
+               },
                "upTriangle": { "file": "images/icons/upTriangle.svg" }
        }
 }
index f4a2dc9..c0ccb36 100644 (file)
@@ -2,49 +2,63 @@
        "prefix": "oo-ui-icon",
        "intro": "@import '../../../../src/styles/common';",
        "images": {
-               "add": { "file": "images/icons/add.svg", "deprecated": "Moved since v0.19.5, use from the 'interactive' pack instead." },
-               "advanced": { "file": "images/icons/advanced.svg" },
-               "alert": { "file": "images/icons/alert.svg" },
-               "cancel": { "file": "images/icons/cancel.svg" },
-               "check": { "file": "images/icons/check.svg" },
-               "circle": { "file": "images/icons/circle.svg" },
-               "close": { "file": "images/icons/close.svg" },
-               "code": { "file": "images/icons/code.svg" },
-               "collapse": { "file": "images/icons/collapse.svg" },
-               "comment": { "file": "images/icons/comment.svg" },
-               "ellipsis": { "file": "images/icons/ellipsis.svg" },
-               "expand": { "file": "images/icons/expand.svg" },
+               "add": { "file": "images/icons/add.svg", "deprecated": "Moved since v0.19.5, use from the 'interactions' pack instead." },
+               "advanced": { "file": "images/icons/advanced.svg", "deprecated": "Moved since v0.20.1, use from the 'interactions' pack instead." },
+               "alert": { "file": "images/icons/alert.svg", "deprecated": "Moved since v0.20.1, use from the 'alerts' pack instead." },
+               "cancel": { "file": "images/icons/cancel.svg", "deprecated": "Moved since v0.20.1, use from the 'interactions' pack instead." },
+               "check": { "file": "images/icons/check.svg", "deprecated": "Moved since v0.20.1, use from the 'interactions' pack instead." },
+               "circle": { "file": "images/icons/circle.svg", "deprecated": "Deprecated since v0.20.1, do not use." },
+               "close": { "file": "images/icons/close.svg", "deprecated": "Moved since v0.20.1, use from the 'interactions' pack instead." },
+               "code": { "file": "images/icons/code.svg", "deprecated": "Moved since v0.16.2, use from the 'editing-advanced' pack instead." },
+               "collapse": { "file": "images/icons/collapse.svg", "deprecated": "Moved since v0.20.1, use from the 'movement' pack instead." },
+               "comment": { "file": "images/icons/comment.svg", "deprecated": "Moved since v0.20.1, use from the 'alerts' pack instead." },
+               "ellipsis": { "file": "images/icons/ellipsis.svg", "deprecated": "Moved since v0.20.1, use from the 'interactions' pack instead." },
+               "expand": { "file": "images/icons/expand.svg", "deprecated": "Moved since v0.20.1, use from the 'movement' pack instead." },
                "help": { "file": {
                        "ltr": "images/icons/help-ltr.svg",
                        "rtl": "images/icons/help-rtl.svg",
                        "lang": {
                                "he,yi": "images/icons/help-ltr.svg"
-                       }
+                       },
+                       "deprecated": "Moved since v0.20.1, use from the 'interactions' pack instead."
                } },
-               "history": { "file": "images/icons/history.svg" },
-               "info": { "file": "images/icons/info.svg" },
-               "menu": { "file": "images/icons/menu.svg" },
+               "history": { "file": "images/icons/history.svg", "deprecated": "Moved since v0.20.1, use from the 'content' pack instead." },
+               "info": { "file": "images/icons/info.svg", "deprecated": "Moved since v0.20.1, use from the 'content' pack instead." },
+               "menu": { "file": "images/icons/menu.svg", "deprecated": "Moved since v0.20.1, use from the 'layout' pack instead." },
                "next": { "file": {
                        "ltr": "images/icons/move-ltr.svg",
                        "rtl": "images/icons/move-rtl.svg"
-               } },
-               "notice": { "file": "images/icons/notice.svg" },
+                       },
+                       "deprecated": "Moved since v0.20.1, use from the 'movement' pack instead."
+               },
+               "notice": { "file": "images/icons/notice.svg", "deprecated": "Moved since v0.20.1, use from the 'alerts' pack instead." },
                "previous": { "file": {
                        "ltr": "images/icons/move-rtl.svg",
                        "rtl": "images/icons/move-ltr.svg"
-               } },
+                       },
+                       "deprecated": "Moved since v0.20.1, use from the 'movement' pack instead."
+               },
                "redo": { "file": {
                        "ltr": "images/icons/arched-arrow-ltr.svg",
                        "rtl": "images/icons/arched-arrow-rtl.svg"
-               } },
-               "remove": { "file": "images/icons/trash.svg" },
-               "search": { "file": "images/icons/search.svg" },
-               "settings": { "file": "images/icons/settings.svg" },
-               "tag": { "file": "images/icons/tag.svg" },
+                       },
+                       "deprecated": "Moved since v0.16.2, use from the 'editing-core' pack instead."
+               },
+               "remove": { "file": "images/icons/trash.svg", "deprecated": "Replaced since v0.14.0, use 'trash' from the 'moderation' pack instead." },
+               "search": { "file": {
+                       "ltr": "images/icons/search-ltr.svg",
+                       "rtl": "images/icons/search-rtl.svg"
+                       },
+                       "deprecated": "Moved since v0.20.1, use from the 'interactions' pack instead."
+               },
+               "settings": { "file": "images/icons/settings.svg", "deprecated": "Moved since v0.20.1, use from the 'interactions' pack instead." },
+               "tag": { "file": "images/icons/tag.svg", "deprecated": "Moved since v0.20.1, use from the 'content' pack instead." },
                "undo": { "file": {
                        "ltr": "images/icons/arched-arrow-rtl.svg",
                        "rtl": "images/icons/arched-arrow-ltr.svg"
-               } },
-               "window": { "file": "images/icons/window.svg" }
+                       },
+                       "deprecated": "Moved since v0.16.2, use from the 'editing-core' pack instead."
+               },
+               "window": { "file": "images/icons/window.svg", "deprecated": "Moved since v0.20.1, use from the 'content' pack instead." }
        }
 }
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/add-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/add-invert.png
deleted file mode 100644 (file)
index 8deeddf..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/add-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/add-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/add-invert.svg
deleted file mode 100644 (file)
index a2d49a1..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#FFFFFF">
-    <g id="add">
-        <path id="plus" d="M13 6h-2v5H6v2h5v5h2v-5h5v-2h-5z"/>
-    </g>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/beta-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/beta-invert.png
deleted file mode 100644 (file)
index c3b26b8..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/beta-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/beta-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/beta-invert.svg
deleted file mode 100644 (file)
index a140a5a..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#FFFFFF">
-    <path d="M12 4c-4.4 0-8 3.6-8 8s3.6 8 8 8 8-3.6 8-8-3.6-8-8-8zm4 12l-3-2-1 4-1-4-3 2 2-3-4-1 4-1-2-3 3 2 1-4 1 4 3-2-2 3 4 1-4 1 2 3z"/>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/beta.png b/resources/lib/oojs-ui/themes/apex/images/icons/beta.png
deleted file mode 100644 (file)
index 7b31e1e..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/beta.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/beta.svg b/resources/lib/oojs-ui/themes/apex/images/icons/beta.svg
deleted file mode 100644 (file)
index 51a5c78..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <path d="M12 4c-4.4 0-8 3.6-8 8s3.6 8 8 8 8-3.6 8-8-3.6-8-8-8zm4 12l-3-2-1 4-1-4-3 2 2-3-4-1 4-1-2-3 3 2 1-4 1 4 3-2-2 3 4 1-4 1 2 3z"/>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/bookmark-ltr-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/bookmark-ltr-invert.png
deleted file mode 100644 (file)
index 084cbc7..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/bookmark-ltr-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/bookmark-ltr-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/bookmark-ltr-invert.svg
deleted file mode 100644 (file)
index 8098166..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#FFFFFF">
-    <path d="M15 5H8c-1.1 0-2 .9-2 2v3h3v11l4-3 4 3V7c0-1.1-.9-2-2-2zM9 9H7V7c0-.6.4-1 1-1h1v3z"/>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/bookmark-rtl-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/bookmark-rtl-invert.png
deleted file mode 100644 (file)
index 125fb74..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/bookmark-rtl-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/bookmark-rtl-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/bookmark-rtl-invert.svg
deleted file mode 100644 (file)
index bc3ef4e..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#FFFFFF">
-    <path d="M8 5h7c1.1 0 2 .9 2 2v3h-3v11l-4-3-4 3V7c0-1.1.9-2 2-2zm6 4h2V7c0-.6-.4-1-1-1h-1v3z"/>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/browser-ltr-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/browser-ltr-invert.png
deleted file mode 100644 (file)
index 027df2d..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/browser-ltr-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/browser-ltr-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/browser-ltr-invert.svg
deleted file mode 100644 (file)
index 792b4aa..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#FFFFFF">
-    <path d="M3 6v11c0 1.7 1.3 3 3 3h15V6H3zm2.5 1C6.3 7 7 7.7 7 8.5S6.3 10 5.5 10 4 9.3 4 8.5 4.7 7 5.5 7zM20 19H6c-1.1 0-2-.9-2-2v-6h16v8z"/>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/browser-rtl-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/browser-rtl-invert.png
deleted file mode 100644 (file)
index 51937b7..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/browser-rtl-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/browser-rtl-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/browser-rtl-invert.svg
deleted file mode 100644 (file)
index 079a62c..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#FFFFFF">
-    <path d="M21 6v11c0 1.7-1.3 3-3 3H3V6h18zm-2.5 1c-.8 0-1.5.7-1.5 1.5s.7 1.5 1.5 1.5S20 9.3 20 8.5 19.3 7 18.5 7zM4 19h14c1.1 0 2-.9 2-2v-6H4v8z"/>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/clear-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/clear-invert.png
deleted file mode 100644 (file)
index ec90ed9..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/clear-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/clear-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/clear-invert.svg
deleted file mode 100644 (file)
index 09df1d3..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#FFFFFF">
-    <g id="clear">
-        <path id="circle-with-cross" d="M12 5c-4.4 0-8 3.6-8 8s3.6 8 8 8 8-3.6 8-8-3.6-8-8-8zm4 11l-1 1-3-3-3 3-1-1 3-3-3-3 1-1 3 3 3-3 1 1-3 3 3 3z"/>
-    </g>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/clock-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/clock-invert.png
deleted file mode 100644 (file)
index fdd3e51..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/clock-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/clock-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/clock-invert.svg
deleted file mode 100644 (file)
index c11e11e..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#FFFFFF">
-    <g id="clock">
-        <path id="circle" d="M12 5a7 7 0 1 0 0 14 7 7 0 0 0 0-14zm0 1.25a5.75 5.75 0 0 1 0 11.5 5.75 5.75 0 0 1 0-11.5z"/>
-        <path id="hands" d="M15.605 14.08s-1.674-1.36-2.81-2.15c.504-1.683 1.194-4.605 1.194-4.605s-3.057 3.765-3.427 4.703c-.325.82 1.024 1.55 1.647 1.178 1.335.387 3.394.873 3.394.873z"/>
-    </g>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/feedback-ltr-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/feedback-ltr-invert.png
deleted file mode 100644 (file)
index f49ebeb..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/feedback-ltr-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/feedback-ltr-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/feedback-ltr-invert.svg
deleted file mode 100644 (file)
index d32e478..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#FFFFFF">
-    <path d="M8.202 15.834l.568 2.101c.198.765 1.06 1.22 1.8 1.016.698-.193 1.125-.983.926-1.747l-.38-1.37H20L17.229 5 4.155 12.652c-.427.762.088 2.748.823 3.182h3.224z"/>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/feedback-rtl-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/feedback-rtl-invert.png
deleted file mode 100644 (file)
index efba220..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/feedback-rtl-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/feedback-rtl-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/feedback-rtl-invert.svg
deleted file mode 100644 (file)
index 14be7ff..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#FFFFFF">
-    <path d="M15.798 15.834l-.568 2.101c-.198.765-1.06 1.22-1.8 1.016-.698-.193-1.125-.983-.926-1.747l.38-1.37H4L6.771 5l13.074 7.652c.427.762-.088 2.748-.823 3.182h-3.224z"/>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/funnel-ltr-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/funnel-ltr-invert.png
deleted file mode 100644 (file)
index 2949648..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/funnel-ltr-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/funnel-ltr-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/funnel-ltr-invert.svg
deleted file mode 100644 (file)
index d533779..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#FFFFFF">
-    <path d="M11 13L5 6h15l-6 7v7c-1.7 0-3-1.3-3-3v-4z"/>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/funnel-rtl-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/funnel-rtl-invert.png
deleted file mode 100644 (file)
index c0f155a..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/funnel-rtl-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/funnel-rtl-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/funnel-rtl-invert.svg
deleted file mode 100644 (file)
index f99e338..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#FFFFFF">
-    <path d="M14 13l6-7H5l6 7v7c1.7 0 3-1.3 3-3v-4z"/>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/heart-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/heart-invert.png
deleted file mode 100644 (file)
index 2070997..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/heart-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/heart-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/heart-invert.svg
deleted file mode 100644 (file)
index ab9e536..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#FFFFFF">
-    <path d="M15 7c-2 0-3 2-3 2s-1-2-3-2c-2.5 0-4 2-4 4 0 4 5 5 7 8 2-3 7-4 7-8 0-2-1.5-4-4-4z"/>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/key-ltr-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/key-ltr-invert.png
deleted file mode 100644 (file)
index 265da14..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/key-ltr-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/key-ltr-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/key-ltr-invert.svg
deleted file mode 100644 (file)
index 454f6a9..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#FFFFFF">
-    <path d="M14.5 4C11.5 4 9 6.5 9 9.5c0 1 .3 1.9.7 2.8L4 18v2h4v-2h2v-2h2l1.2-1.2c.4.1.9.2 1.3.2 3 0 5.5-2.5 5.5-5.5S17.5 4 14.5 4zM16 9c-.8 0-1.5-.7-1.5-1.5S15.2 6 16 6s1.5.7 1.5 1.5S16.8 9 16 9z"/>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/key-rtl-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/key-rtl-invert.png
deleted file mode 100644 (file)
index a5f2904..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/key-rtl-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/key-rtl-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/key-rtl-invert.svg
deleted file mode 100644 (file)
index 6b7fd63..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#FFFFFF">
-    <path d="M9.5 4c3 0 5.5 2.5 5.5 5.5 0 1-.3 1.9-.7 2.8L20 18v2h-4v-2h-2v-2h-2l-1.2-1.2c-.4.1-.9.2-1.3.2-3 0-5.5-2.5-5.5-5.5S6.5 4 9.5 4zM8 9c.8 0 1.5-.7 1.5-1.5S8.8 6 8 6s-1.5.7-1.5 1.5S7.2 9 8 9z"/>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/keyboard-ltr-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/keyboard-ltr-invert.png
deleted file mode 100644 (file)
index d7d1a0b..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/keyboard-ltr-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/keyboard-ltr-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/keyboard-ltr-invert.svg
deleted file mode 100644 (file)
index d137db6..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#FFFFFF">
-    <path d="M3 7v9c0 1.7 1.3 3 3 3h15V7H3zm8 2h2v2h-2V9zm0 3h2v2h-2v-2zM8 9h2v2H8V9zm0 3h2v2H8v-2zm-1 5H6c-.6 0-1-.4-1-1v-1h2v2zm0-3H5v-2h2v2zm0-3H5V9h2v2zm9 6H8v-2h8v2zm0-3h-2v-2h2v2zm0-3h-2V9h2v2zm3 6h-2v-2h2v2zm0-3h-2v-2h2v2zm0-3h-2V9h2v2z"/>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/keyboard-rtl-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/keyboard-rtl-invert.png
deleted file mode 100644 (file)
index 1b0275e..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/keyboard-rtl-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/keyboard-rtl-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/keyboard-rtl-invert.svg
deleted file mode 100644 (file)
index 792025b..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#FFFFFF">
-    <path d="M21 7v9c0 1.7-1.3 3-3 3H3V7h18zm-8 2h-2v2h2V9zm0 3h-2v2h2v-2zm3-3h-2v2h2V9zm0 3h-2v2h2v-2zm1 5h1c.6 0 1-.4 1-1v-1h-2v2zm0-3h2v-2h-2v2zm0-3h2V9h-2v2zm-9 6h8v-2H8v2zm0-3h2v-2H8v2zm0-3h2V9H8v2zm-3 6h2v-2H5v2zm0-3h2v-2H5v2zm0-3h2V9H5v2z"/>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/logOut-ltr-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/logOut-ltr-invert.png
deleted file mode 100644 (file)
index fb1bb0c..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/logOut-ltr-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/logOut-ltr-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/logOut-ltr-invert.svg
deleted file mode 100644 (file)
index 14f148a..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#FFFFFF">
-    <path d="M15 14v3l5-4.5L15 8v3H8c0 1.7 1.3 3 3 3h4zm-1-9H4v15h10v-2H6V7h8V5z"/>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/logOut-rtl-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/logOut-rtl-invert.png
deleted file mode 100644 (file)
index dcd2f15..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/logOut-rtl-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/logOut-rtl-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/logOut-rtl-invert.svg
deleted file mode 100644 (file)
index e3ce38b..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#FFFFFF">
-    <path d="M9 14v3l-5-4.5L9 8v3h7c0 1.7-1.3 3-3 3H9zm1-9h10v15H10v-2h8V7h-8V5z"/>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/logo-wikimediaDiscovery-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/logo-wikimediaDiscovery-invert.png
deleted file mode 100644 (file)
index 0963538..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/logo-wikimediaDiscovery-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/logo-wikimediaDiscovery-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/logo-wikimediaDiscovery-invert.svg
deleted file mode 100644 (file)
index 971ac48..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#FFFFFF">
-    <path d="M15.3 14.7C16.1 10.9 14.7 4 12 4c-2.7 0-4.2 6.7-3.4 10.5L7 18h2.7l.3 1h4c.2-.3.1-.5.3-1H17l-1.7-3.3zM12 10c-.8 0-1.5-.7-1.5-1.5S11.2 7 12 7s1.5.7 1.5 1.5S12.8 10 12 10zm2 10c0 1.1-2 2-2 2s-2-.9-2-2"/>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/logo-wikimediaDiscovery.png b/resources/lib/oojs-ui/themes/apex/images/icons/logo-wikimediaDiscovery.png
deleted file mode 100644 (file)
index 6d3c067..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/logo-wikimediaDiscovery.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/logo-wikimediaDiscovery.svg b/resources/lib/oojs-ui/themes/apex/images/icons/logo-wikimediaDiscovery.svg
deleted file mode 100644 (file)
index c3f99d6..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <path d="M15.3 14.7C16.1 10.9 14.7 4 12 4c-2.7 0-4.2 6.7-3.4 10.5L7 18h2.7l.3 1h4c.2-.3.1-.5.3-1H17l-1.7-3.3zM12 10c-.8 0-1.5-.7-1.5-1.5S11.2 7 12 7s1.5.7 1.5 1.5S12.8 10 12 10zm2 10c0 1.1-2 2-2 2s-2-.9-2-2"/>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/newWindow-ltr-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/newWindow-ltr-invert.png
deleted file mode 100644 (file)
index 5e432b0..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/newWindow-ltr-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/newWindow-ltr-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/newWindow-ltr-invert.svg
deleted file mode 100644 (file)
index f7a92e0..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#FFFFFF">
-    <path d="M12 5l2.5 2.5L11 11c-1.2 1.2-1.2 2.8 0 4l5.5-5.5L19 12V5h-7zm5 12H8c-.6 0-1-.4-1-1V7h3L8 5H5v11c0 1.7 1.3 3 3 3h11v-3l-2-2v3z"/>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/newWindow-rtl-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/newWindow-rtl-invert.png
deleted file mode 100644 (file)
index f9a742e..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/newWindow-rtl-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/newWindow-rtl-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/newWindow-rtl-invert.svg
deleted file mode 100644 (file)
index ef51a66..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#FFFFFF">
-    <path d="M12 5L9.5 7.5 13 11c1.2 1.2 1.2 2.8 0 4L7.5 9.5 5 12V5h7zM7 17h9c.6 0 1-.4 1-1V7h-3l2-2h3v11c0 1.7-1.3 3-3 3H5v-3l2-2v3z"/>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/printer-ltr-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/printer-ltr-invert.png
deleted file mode 100644 (file)
index ca07bcc..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/printer-ltr-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/printer-ltr-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/printer-ltr-invert.svg
deleted file mode 100644 (file)
index 1442004..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#FFFFFF">
-    <path d="M18 8h-1V4H7v4H3v6c0 1.7 1.3 3 3 3h1v3h10v-3h4v-6c0-1.7-1.3-3-3-3zM8 5h8v3H8V5zm8 14H8v-6h8v6z"/>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/printer-rtl-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/printer-rtl-invert.png
deleted file mode 100644 (file)
index 95ef54a..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/printer-rtl-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/printer-rtl-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/printer-rtl-invert.svg
deleted file mode 100644 (file)
index 0d1cd83..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#FFFFFF">
-    <path d="M6 8h1V4h10v4h4v6c0 1.7-1.3 3-3 3h-1v3H7v-3H3v-6c0-1.7 1.3-3 3-3zm10-3H8v3h8V5zM8 19h8v-6H8v6z"/>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/ribbonPrize-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/ribbonPrize-invert.png
deleted file mode 100644 (file)
index 46a180d..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/ribbonPrize-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/ribbonPrize-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/ribbonPrize-invert.svg
deleted file mode 100644 (file)
index 578f12b..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#FFFFFF">
-    <circle cx="11.5" cy="8.5" r="2.5"/>
-    <path d="M16.3 8.7L17 8l-.8-.8.4-.8-1.1-.5.1-.9-1.2-.2-.1-.9-1.2.2-.4-.8-1.1.5L11 3l-.8.8-.9-.4-.5 1.1-.9-.2-.2 1.2-.9.2.2 1.2-.9.4.5 1.1L6 9l.8.8-.4.8 1.1.5-.1.9 1.2.2.1.9 1.2-.2.4.8 1.1-.5.6.8.8-.8.8.4.5-1.1.9.1.2-1.2.9-.1-.2-1.2.8-.4-.4-1zM11.5 12C9.6 12 8 10.4 8 8.5S9.6 5 11.5 5 15 6.6 15 8.5 13.4 12 11.5 12zm.5 3l-.7-.7-1.1.6-.4-.7-.8.3V23l2.5-3 2.5 3v-8.5l-1-.5z"/>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/ribbonPrize.png b/resources/lib/oojs-ui/themes/apex/images/icons/ribbonPrize.png
deleted file mode 100644 (file)
index 1010574..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/ribbonPrize.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/ribbonPrize.svg b/resources/lib/oojs-ui/themes/apex/images/icons/ribbonPrize.svg
deleted file mode 100644 (file)
index 45df8b7..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <circle cx="11.5" cy="8.5" r="2.5"/>
-    <path d="M16.3 8.7L17 8l-.8-.8.4-.8-1.1-.5.1-.9-1.2-.2-.1-.9-1.2.2-.4-.8-1.1.5L11 3l-.8.8-.9-.4-.5 1.1-.9-.2-.2 1.2-.9.2.2 1.2-.9.4.5 1.1L6 9l.8.8-.4.8 1.1.5-.1.9 1.2.2.1.9 1.2-.2.4.8 1.1-.5.6.8.8-.8.8.4.5-1.1.9.1.2-1.2.9-.1-.2-1.2.8-.4-.4-1zM11.5 12C9.6 12 8 10.4 8 8.5S9.6 5 11.5 5 15 6.6 15 8.5 13.4 12 11.5 12zm.5 3l-.7-.7-1.1.6-.4-.7-.8.3V23l2.5-3 2.5 3v-8.5l-1-.5z"/>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/search-ltr.png b/resources/lib/oojs-ui/themes/apex/images/icons/search-ltr.png
new file mode 100644 (file)
index 0000000..e8e99f8
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/search-ltr.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/search-ltr.svg b/resources/lib/oojs-ui/themes/apex/images/icons/search-ltr.svg
new file mode 100644 (file)
index 0000000..ebc654a
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="search">
+        <path id="magnifying-glass" d="M10.5 4a6.5 6.5 0 1 0 2.844 12.344L16 19c1.4 1.4 2.5 1.5 4 0l-4.438-4.438A6.426 6.426 0 0 0 17 10.5 6.5 6.5 0 0 0 10.5 4zm0 2a4.5 4.5 0 1 1 0 9 4.5 4.5 0 0 1 0-9z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/search-rtl.png b/resources/lib/oojs-ui/themes/apex/images/icons/search-rtl.png
new file mode 100644 (file)
index 0000000..3ab96be
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/search-rtl.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/search-rtl.svg b/resources/lib/oojs-ui/themes/apex/images/icons/search-rtl.svg
new file mode 100644 (file)
index 0000000..c51d4cb
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="search">
+        <path id="magnifying-glass" d="M13.5 4a6.5 6.5 0 1 1-2.844 12.344L8 19c-1.4 1.4-2.5 1.5-4 0l4.438-4.438A6.426 6.426 0 0 1 7 10.5 6.5 6.5 0 0 1 13.5 4zm0 2a4.5 4.5 0 1 0 0 9 4.5 4.5 0 0 0 0-9z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/search.png b/resources/lib/oojs-ui/themes/apex/images/icons/search.png
deleted file mode 100644 (file)
index 7b47539..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/search.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/search.svg b/resources/lib/oojs-ui/themes/apex/images/icons/search.svg
deleted file mode 100644 (file)
index 823ebf2..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="search">
-        <path id="magnifying-glass" d="M18.87 18.375l-3.987-3.99-.286-.17a5.774 5.774 0 0 0 1.082-3.372C15.67 7.616 13.06 5 9.84 5A5.843 5.843 0 0 0 4 10.844a5.84 5.84 0 0 0 5.842 5.842c1.26 0 2.423-.403 3.377-1.08l.16.286 3.99 3.987c.32.31.91.24 1.33-.18.41-.42.49-1.01.17-1.33zM9.837 14.56a3.72 3.72 0 0 1-3.718-3.717c0-2.05 1.67-3.72 3.72-3.72s3.72 1.668 3.72 3.72a3.722 3.722 0 0 1-3.72 3.718z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/stripeFlow-ltr.png b/resources/lib/oojs-ui/themes/apex/images/icons/stripeFlow-ltr.png
new file mode 100644 (file)
index 0000000..5423b36
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/stripeFlow-ltr.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/stripeFlow-ltr.svg b/resources/lib/oojs-ui/themes/apex/images/icons/stripeFlow-ltr.svg
new file mode 100644 (file)
index 0000000..2112bb2
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <path d="M4 9h12v2H4V9zm0 3h8v2H4v-2zm0-7h16v3H4V5zm16 14H4v-3h16v3z"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/stripeFlow-rtl.png b/resources/lib/oojs-ui/themes/apex/images/icons/stripeFlow-rtl.png
new file mode 100644 (file)
index 0000000..0ff3d7c
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/stripeFlow-rtl.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/stripeFlow-rtl.svg b/resources/lib/oojs-ui/themes/apex/images/icons/stripeFlow-rtl.svg
new file mode 100644 (file)
index 0000000..39790a9
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <path d="M20 9H8v2h12V9zm0 3h-8v2h8v-2zm0-7H4v3h16V5zM4 19h16v-3H4v3z"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/stripeSideMenu.png b/resources/lib/oojs-ui/themes/apex/images/icons/stripeSideMenu.png
new file mode 100644 (file)
index 0000000..e031527
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/stripeSideMenu.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/stripeSideMenu.svg b/resources/lib/oojs-ui/themes/apex/images/icons/stripeSideMenu.svg
new file mode 100644 (file)
index 0000000..e63a7d5
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <path d="M20 19H4v-2h16v2zM20 15H4v-2h16v2zM20 11H4V9h16v2z"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/stripeSummary-ltr.png b/resources/lib/oojs-ui/themes/apex/images/icons/stripeSummary-ltr.png
new file mode 100644 (file)
index 0000000..ce15bd8
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/stripeSummary-ltr.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/stripeSummary-ltr.svg b/resources/lib/oojs-ui/themes/apex/images/icons/stripeSummary-ltr.svg
new file mode 100644 (file)
index 0000000..767d6cd
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <path d="M20 11H4V9h16v2zM4 12h8v2H4v-2z"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/stripeSummary-rtl.png b/resources/lib/oojs-ui/themes/apex/images/icons/stripeSummary-rtl.png
new file mode 100644 (file)
index 0000000..82ca2bf
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/stripeSummary-rtl.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/stripeSummary-rtl.svg b/resources/lib/oojs-ui/themes/apex/images/icons/stripeSummary-rtl.svg
new file mode 100644 (file)
index 0000000..4d16337
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <path d="M4 11h16V9H4v2zm16 1h-8v2h8v-2z"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/stripeToC-ltr.png b/resources/lib/oojs-ui/themes/apex/images/icons/stripeToC-ltr.png
new file mode 100644 (file)
index 0000000..b482d3e
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/stripeToC-ltr.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/stripeToC-ltr.svg b/resources/lib/oojs-ui/themes/apex/images/icons/stripeToC-ltr.svg
new file mode 100644 (file)
index 0000000..d7c202e
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <path d="M17 13H4v-3h13v3zm-5 6H4v-3h8v3zM4 7V4h16v3H4z"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/stripeToC-rtl.png b/resources/lib/oojs-ui/themes/apex/images/icons/stripeToC-rtl.png
new file mode 100644 (file)
index 0000000..516bc2c
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/stripeToC-rtl.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/stripeToC-rtl.svg b/resources/lib/oojs-ui/themes/apex/images/icons/stripeToC-rtl.svg
new file mode 100644 (file)
index 0000000..0859be6
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <path d="M7 13h13v-3H7v3zm5 6h8v-3h-8v3zm8-12V4H4v3h16z"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/subtract-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/subtract-invert.png
deleted file mode 100644 (file)
index 4e58b70..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/subtract-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/subtract-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/subtract-invert.svg
deleted file mode 100644 (file)
index 9595ac6..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#FFFFFF">
-       <path d="M18 13H6v-2h12"/>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/sun-ltr-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/sun-ltr-invert.png
deleted file mode 100644 (file)
index 2bc944a..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/sun-ltr-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/sun-ltr-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/sun-ltr-invert.svg
deleted file mode 100644 (file)
index f533999..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#FFFFFF">
-    <path d="M18.1 5.1c0 .3-.1.6-.3.9l-1.4 1.4-.9-.8 2.2-2.2c.3.1.4.4.4.7zm-.5 5.3h3.2c0 .3-.1.6-.4.9s-.5.4-.8.4h-2v-1.3zm-6.2-5V2.2c.3 0 .6.1.9.4s.4.5.4.8v2h-1.3zm6.4 11.7c-.3 0-.6-.1-.8-.3l-1.4-1.4.8-.8 2.2 2.2c-.2.2-.5.3-.8.3zM6.2 4.9c.3 0 .6.1.8.3l1.4 1.4-.8.9-2.2-2.3c.2-.2.5-.3.8-.3zm5.2 11.7h1.2v3.2c-.3 0-.6-.1-.9-.4s-.4-.5-.4-.8l.1-2zm-7-6.2h2v1.2H3.2c0-.3.1-.6.4-.9s.5-.3.8-.3zM6.2 16l1.4-1.4.8.8-2.2 2.2c-.2-.2-.3-.5-.3-.8s.1-.6.3-.8z"/>
-    <circle cx="12" cy="11" r="4"/>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/sun-rtl-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/sun-rtl-invert.png
deleted file mode 100644 (file)
index 7ac54ff..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/sun-rtl-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/sun-rtl-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/sun-rtl-invert.svg
deleted file mode 100644 (file)
index 0e19566..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#FFFFFF">
-    <path d="M5.9 5.1c0 .3.1.6.3.9l1.4 1.4.9-.8-2.2-2.2c-.3.1-.4.4-.4.7zm.5 5.3H3.2c0 .3.1.6.4.9.3.3.5.4.8.4h2v-1.3zm6.2-5V2.2c-.3 0-.6.1-.9.4-.3.3-.4.5-.4.8v2h1.3zM6.2 17.1c.3 0 .6-.1.8-.3l1.4-1.4-.8-.8-2.2 2.2c.2.2.5.3.8.3zM17.8 4.9c-.3 0-.6.1-.8.3l-1.4 1.4.8.9 2.2-2.3c-.2-.2-.5-.3-.8-.3zm-5.2 11.7h-1.2v3.2c.3 0 .6-.1.9-.4.3-.3.4-.5.4-.8l-.1-2zm7-6.2h-2v1.2h3.2c0-.3-.1-.6-.4-.9-.3-.3-.5-.3-.8-.3zM17.8 16l-1.4-1.4-.8.8 2.2 2.2c.2-.2.3-.5.3-.8 0-.3-.1-.6-.3-.8z"/>
-    <circle cx="12" cy="11" r="4" transform="matrix(-1 0 0 1 24 0)"/>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/viewCompact.png b/resources/lib/oojs-ui/themes/apex/images/icons/viewCompact.png
new file mode 100644 (file)
index 0000000..13fe420
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/viewCompact.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/viewCompact.svg b/resources/lib/oojs-ui/themes/apex/images/icons/viewCompact.svg
new file mode 100644 (file)
index 0000000..d96a2e3
--- /dev/null
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="viewCompact">
+        <circle cx="6" cy="6" r="2"/>
+        <circle cx="12" cy="6" r="2"/>
+        <circle cx="18" cy="6" r="2"/>
+        <circle cx="6" cy="12" r="2"/>
+        <circle cx="12" cy="12" r="2"/>
+        <circle cx="18" cy="12" r="2"/>
+        <circle cx="6" cy="18" r="2"/>
+        <circle cx="12" cy="18" r="2"/>
+        <circle cx="18" cy="18" r="2"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/viewDetails-ltr.png b/resources/lib/oojs-ui/themes/apex/images/icons/viewDetails-ltr.png
new file mode 100644 (file)
index 0000000..4341f0e
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/viewDetails-ltr.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/viewDetails-ltr.svg b/resources/lib/oojs-ui/themes/apex/images/icons/viewDetails-ltr.svg
new file mode 100644 (file)
index 0000000..1a5092a
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="viewDetails">
+        <circle cx="5.5" cy="8.5" r="2.5"/>
+        <path d="M10 6h12v1H10zm0 2h9v1h-9zm0 2h4v1h-4z"/>
+        <circle cx="5.5" cy="16.5" r="2.5"/>
+        <path d="M10 14h12v1H10zm0 2h9v1h-9zm0 2h4v1h-4z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/viewDetails-rtl.png b/resources/lib/oojs-ui/themes/apex/images/icons/viewDetails-rtl.png
new file mode 100644 (file)
index 0000000..338294c
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/viewDetails-rtl.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/viewDetails-rtl.svg b/resources/lib/oojs-ui/themes/apex/images/icons/viewDetails-rtl.svg
new file mode 100644 (file)
index 0000000..f43b05f
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="viewDetails">
+        <circle cx="18.5" cy="8.5" r="2.5"/>
+        <path d="M14 6H2v1h12zm0 2H5v1h9zm0 2h-4v1h4z"/>
+        <circle cx="18.5" cy="16.5" r="2.5"/>
+        <path d="M14 14H2v1h12zm0 2H5v1h9zm0 2h-4v1h4z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/watchlist-ltr-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/watchlist-ltr-invert.png
deleted file mode 100644 (file)
index 7018968..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/watchlist-ltr-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/watchlist-ltr-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/watchlist-ltr-invert.svg
deleted file mode 100644 (file)
index a6d466a..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#FFFFFF">
-    <path d="M13 14h5v1h-5v-1zm0 3h5v-1h-5v1zm0 1h5v1h-5v-1zm-1-5v3l-5 3 1-6-4-3 6-1 2-5s1.9 5 2 5l6 1-4 3h-4z"/>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/watchlist-rtl-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/watchlist-rtl-invert.png
deleted file mode 100644 (file)
index 28008b5..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/watchlist-rtl-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/watchlist-rtl-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/watchlist-rtl-invert.svg
deleted file mode 100644 (file)
index 61a2866..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#FFFFFF">
-    <path d="M11 14H6v1h5v-1zm0 3H6v-1h5v1zm0 1H6v1h5v-1zm1-5v3l5 3-1-6 4-3-6-1-2-5s-1.9 5-2 5l-6 1 4 3h4z"/>
-</g></svg>
index e6fa863..c169b56 100644 (file)
                }
        },
        "images": {
+               "alert": { "file": "images/icons/alert.svg", "variants": [ "warning" ] },
                "bell": { "file": "images/icons/bell.svg" },
                "bellOn": { "file": {
                        "ltr": "images/icons/bellOn-ltr.svg",
                        "rtl": "images/icons/bellOn-rtl.svg"
                } },
+               "comment": { "file": "images/icons/comment.svg" },
                "eye": { "file": "images/icons/eye.svg" },
                "eyeClosed": { "file": "images/icons/eyeClosed.svg" },
                "message": { "file": {
                        "ltr": "images/icons/message-ltr.svg",
                        "rtl": "images/icons/message-rtl.svg"
                } },
+               "notice": { "file": "images/icons/notice.svg" },
                "signature": { "file": {
                        "ltr": "images/icons/signature-ltr.svg",
                        "rtl": "images/icons/signature-rtl.svg"
index 80bbcaf..e952108 100644 (file)
@@ -62,6 +62,8 @@
                        "ltr": "images/icons/folderPlaceholder-ltr.svg",
                        "rtl": "images/icons/folderPlaceholder-rtl.svg"
                } },
+               "history": { "file": "images/icons/history.svg" },
+               "info": { "file": "images/icons/info.svg" },
                "journal": { "file": {
                        "ltr": "images/icons/journal-ltr.svg",
                        "rtl": "images/icons/journal-rtl.svg"
                        "ltr": "images/icons/newspaper-ltr.svg",
                        "rtl": "images/icons/newspaper-rtl.svg"
                } },
+               "tag": { "file": "images/icons/tag.svg", "variants": [ "destructive", "warning", "constructive" ] },
                "upload": { "file": {
                        "ltr": "images/icons/upload-ltr.svg",
                        "rtl": "images/icons/upload-rtl.svg"
-               } }
+               } },
+               "window": { "file": "images/icons/window.svg" }
        }
 }
index 827a72e..668173f 100644 (file)
@@ -23,8 +23,7 @@
        },
        "images": {
                "add": { "file": "images/icons/add.svg", "variants": [ "constructive", "progressive" ] },
-               "beta": { "file": "images/icons/beta.svg", "deprecated": "Deprecated since v0.18.3, don't use." },
-               "betaLaunch": { "file": "images/icons/logo-wikimediaDiscovery.svg", "deprecated": "Moved since v0.18.3, use 'logoWikimediaDiscovery' from the 'Wikimedia' pack instead." },
+               "advanced": { "file": "images/icons/advanced.svg" },
                "bookmark": { "file": {
                        "ltr": "images/icons/bookmark-ltr.svg",
                        "rtl": "images/icons/bookmark-rtl.svg"
                        "ltr": "images/icons/browser-ltr.svg",
                        "rtl": "images/icons/browser-rtl.svg"
                } },
+               "cancel": { "file": "images/icons/cancel.svg", "variants": [ "destructive" ] },
+               "check": { "file": "images/icons/check.svg", "variants": [ "constructive", "progressive", "destructive" ] },
                "clear": { "file": "images/icons/clear.svg" },
                "clock": { "file": "images/icons/clock.svg" },
+               "close": { "file": "images/icons/close.svg" },
+               "ellipsis": { "file": "images/icons/ellipsis.svg" },
                "feedback": {
                        "file": {
                                "ltr": "images/icons/feedback-ltr.svg",
                        "rtl": "images/icons/funnel-rtl.svg"
                } },
                "heart": { "file": "images/icons/heart.svg" },
+               "help": { "file": {
+                       "ltr": "images/icons/help-ltr.svg",
+                       "rtl": "images/icons/help-rtl.svg",
+                       "lang": {
+                               "he,yi": "images/icons/help-ltr.svg"
+                       }
+               } },
                "key": { "file": {
                        "ltr": "images/icons/key-ltr.svg",
                        "rtl": "images/icons/key-rtl.svg"
                        "ltr": "images/icons/printer-ltr.svg",
                        "rtl": "images/icons/printer-rtl.svg"
                } },
-               "ribbonPrize": { "file": "images/icons/ribbonPrize.svg", "deprecated": "Deprecated since v0.18.3, don't use." },
+               "search": { "file": {
+                       "ltr": "images/icons/search-ltr.svg",
+                       "rtl": "images/icons/search-rtl.svg"
+                       }
+               },
+               "settings": { "file": "images/icons/settings.svg" },
                "subtract": { "file": "images/icons/subtract.svg" },
                "sun": { "file": {
                        "ltr": "images/icons/sun-ltr.svg",
index 6ff4a0e..f720a25 100644 (file)
@@ -22,6 +22,7 @@
                }
        },
        "images": {
+               "menu": { "file": "images/icons/menu.svg" },
                "stripeFlow": { "file": {
                        "ltr": "images/icons/stripeFlow-ltr.svg",
                        "rtl": "images/icons/stripeFlow-rtl.svg"
index 7098f23..58feb23 100644 (file)
                        "ltr": "images/icons/mapPinAdd-ltr.svg",
                        "rtl": "images/icons/mapPinAdd-rtl.svg"
                } },
+               "mapTrail": { "file": {
+                       "ltr": "images/icons/mapTrail-ltr.svg",
+                       "rtl": "images/icons/mapTrail-rtl.svg"
+               } },
                "wikitrail": { "file": {
-                       "ltr": "images/icons/wikitrail-ltr.svg",
-                       "rtl": "images/icons/wikitrail-rtl.svg"
-               } }
+                       "ltr": "images/icons/mapTrail-ltr.svg",
+                       "rtl": "images/icons/mapTrail-rtl.svg"
+               }, "deprecated": "Renamed to 'mapTrail' since v0.20.1."
+               }
        }
 }
index b4acff1..0a1ccd7 100644 (file)
        },
        "images": {
                "block": { "file": "images/icons/block.svg", "variants": [ "destructive" ] },
-               "blockUndo": { "file": {
-                       "ltr": "images/icons/unBlock-ltr.svg",
-                       "rtl": "images/icons/unBlock-rtl.svg"
-               }, "deprecated": "Renamed since v0.18.3, use 'unBlock' instead." },
                "unBlock": { "file": {
                        "ltr": "images/icons/unBlock-ltr.svg",
                        "rtl": "images/icons/unBlock-rtl.svg"
                        "ltr": "images/icons/unFlag-ltr.svg",
                        "rtl": "images/icons/unFlag-rtl.svg"
                } },
-               "flagUndo": { "file": {
-                       "ltr": "images/icons/unFlag-ltr.svg",
-                       "rtl": "images/icons/unFlag-rtl.svg"
-               }, "deprecated": "Renamed since v0.18.3, use 'unFlag' instead." },
                "lock": { "file": {
                        "ltr": "images/icons/lock-ltr.svg",
                        "rtl": "images/icons/lock-rtl.svg"
                        "ltr": "images/icons/unTrash-ltr.svg",
                        "rtl": "images/icons/unTrash-rtl.svg"
                } },
-               "trashUndo": { "file": {
-                       "ltr": "images/icons/unTrash-ltr.svg",
-                       "rtl": "images/icons/unTrash-rtl.svg"
-               }, "deprecated": "Renamed since v0.18.3, use 'unTrash' instead." },
                "ongoingConversation": {
                        "file": {
                                "ltr": "images/icons/ongoingConversation-ltr.svg",
index 059073f..0dc88e3 100644 (file)
                } },
                "caretDown": { "file": "images/icons/caretDown.svg" },
                "caretUp": { "file": "images/icons/caretUp.svg" },
+               "collapse": { "file": "images/icons/collapse.svg" },
                "downTriangle": { "file": "images/icons/downTriangle.svg" },
+               "expand": { "file": "images/icons/expand.svg" },
                "move": { "file": "images/icons/move.svg" },
+               "next": { "file": {
+                       "ltr": "images/icons/move-ltr.svg",
+                       "rtl": "images/icons/move-rtl.svg"
+                       }
+               },
+               "previous": { "file": {
+                       "ltr": "images/icons/move-rtl.svg",
+                       "rtl": "images/icons/move-ltr.svg"
+                       }
+               },
                "upTriangle": { "file": "images/icons/upTriangle.svg" }
        }
 }
index 14f6b18..3bdecff 100644 (file)
                "progressive": {
                        "color": "#36c",
                        "global": true
-               },
-               "constructive": {
-                       "color": "#36c"
-               },
-               "destructive": {
-                       "color": "#d33"
-               },
-               "warning": {
-                       "color": "#ff5d00"
                }
        },
        "images": {
index 60c05f3..958e7e3 100644 (file)
                }
        },
        "images": {
-               "add": { "file": "images/icons/add.svg", "variants": [ "constructive", "progressive" ], "deprecated": "Moved since v0.19.5, use from the 'interactive' pack instead." },
-               "advanced": { "file": "images/icons/advanced.svg" },
-               "alert": { "file": "images/icons/alert.svg", "variants": [ "warning" ] },
-               "cancel": { "file": "images/icons/cancel.svg", "variants": [ "destructive" ] },
-               "check": { "file": "images/icons/check.svg", "variants": [ "constructive", "progressive", "destructive" ] },
-               "circle": { "file": "images/icons/circle.svg", "variants": [ "constructive", "progressive" ] },
-               "close": { "file": "images/icons/close.svg" },
-               "code": { "file": "images/icons/code.svg" },
-               "collapse": { "file": "images/icons/collapse.svg" },
-               "comment": { "file": "images/icons/comment.svg" },
-               "ellipsis": { "file": "images/icons/ellipsis.svg" },
-               "expand": { "file": "images/icons/expand.svg" },
+               "add": { "file": "images/icons/add.svg", "variants": [ "constructive", "progressive" ], "deprecated": "Moved since v0.19.5, use from the 'interactions' pack instead." },
+               "advanced": { "file": "images/icons/advanced.svg", "deprecated": "Moved since v0.20.1, use from the 'interactions' pack instead." },
+               "alert": { "file": "images/icons/alert.svg", "variants": [ "warning" ], "deprecated": "Moved since v0.20.1, use from the 'alerts' pack instead." },
+               "cancel": { "file": "images/icons/cancel.svg", "variants": [ "destructive" ], "deprecated": "Moved since v0.20.1, use from the 'interactions' pack instead." },
+               "check": { "file": "images/icons/check.svg", "variants": [ "constructive", "progressive", "destructive" ], "deprecated": "Moved since v0.20.1, use from the 'interactions' pack instead." },
+       "circle": { "file": "images/icons/circle.svg", "variants": [ "constructive", "progressive" ], "deprecated": "Deprecated since v0.20.1, do not use." },
+               "close": { "file": "images/icons/close.svg", "deprecated": "Moved since v0.20.1, use from the 'interactions' pack instead." },
+               "code": { "file": "images/icons/code.svg", "deprecated": "Moved since v0.16.2, use from the 'editing-advanced' pack instead." },
+               "collapse": { "file": "images/icons/collapse.svg", "deprecated": "Moved since v0.20.1, use from the 'movement' pack instead." },
+               "comment": { "file": "images/icons/comment.svg", "deprecated": "Moved since v0.20.1, use from the 'alerts' pack instead." },
+               "ellipsis": { "file": "images/icons/ellipsis.svg", "deprecated": "Moved since v0.20.1, use from the 'interactions' pack instead." },
+               "expand": { "file": "images/icons/expand.svg", "deprecated": "Moved since v0.20.1, use from the 'movement' pack instead." },
                "help": { "file": {
                        "ltr": "images/icons/help-ltr.svg",
                        "rtl": "images/icons/help-rtl.svg",
                        "lang": {
                                "he,yi": "images/icons/help-ltr.svg"
-                       }
+                       },
+                       "deprecated": "Moved since v0.20.1, use from the 'interactions' pack instead."
                } },
-               "history": { "file": "images/icons/history.svg" },
-               "info": { "file": "images/icons/info.svg" },
-               "menu": { "file": "images/icons/menu.svg" },
+               "history": { "file": "images/icons/history.svg", "deprecated": "Moved since v0.20.1, use from the 'content' pack instead." },
+               "info": { "file": "images/icons/info.svg", "deprecated": "Moved since v0.20.1, use from the 'content' pack instead." },
+               "menu": { "file": "images/icons/menu.svg", "deprecated": "Moved since v0.20.1, use from the 'layout' pack instead." },
                "next": { "file": {
                        "ltr": "images/icons/move-ltr.svg",
                        "rtl": "images/icons/move-rtl.svg"
-               } },
-               "notice": { "file": "images/icons/notice.svg" },
+                       },
+                       "deprecated": "Moved since v0.20.1, use from the 'movement' pack instead."
+               },
+               "notice": { "file": "images/icons/notice.svg", "deprecated": "Moved since v0.20.1, use from the 'alerts' pack instead." },
                "previous": { "file": {
                        "ltr": "images/icons/move-rtl.svg",
                        "rtl": "images/icons/move-ltr.svg"
-               } },
+                       },
+                       "deprecated": "Moved since v0.20.1, use from the 'movement' pack instead."
+               },
                "redo": { "file": {
                        "ltr": "images/icons/arched-arrow-ltr.svg",
                        "rtl": "images/icons/arched-arrow-rtl.svg"
-               } },
-               "remove": { "file": "images/icons/trash.svg", "variants": [ "destructive" ] },
+                       },
+                       "deprecated": "Moved since v0.16.2, use from the 'editing-core' pack instead."
+               },
+               "remove": { "file": "images/icons/trash.svg", "variants": [ "destructive" ], "deprecated": "Replaced since v0.14.0, use 'trash' from the 'moderation' pack instead." },
                "search": { "file": {
                        "ltr": "images/icons/search-ltr.svg",
                        "rtl": "images/icons/search-rtl.svg"
-               } },
-               "settings": { "file": "images/icons/settings.svg" },
-               "tag": { "file": "images/icons/tag.svg", "variants": [ "destructive", "warning", "constructive" ] },
+                       },
+                       "deprecated": "Moved since v0.20.1, use from the 'interactions' pack instead."
+               },
+               "settings": { "file": "images/icons/settings.svg", "deprecated": "Moved since v0.20.1, use from the 'interactions' pack instead." },
+               "tag": { "file": "images/icons/tag.svg", "variants": [ "destructive", "warning", "constructive" ], "deprecated": "Moved since v0.20.1, use from the 'content' pack instead." },
                "undo": { "file": {
                        "ltr": "images/icons/arched-arrow-rtl.svg",
                        "rtl": "images/icons/arched-arrow-ltr.svg"
-               } },
-               "window": { "file": "images/icons/window.svg" }
+                       },
+                       "deprecated": "Moved since v0.16.2, use from the 'editing-core' pack instead."
+               },
+               "window": { "file": "images/icons/window.svg", "deprecated": "Moved since v0.20.1, use from the 'content' pack instead." }
        }
 }
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/beta-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/beta-invert.png
deleted file mode 100644 (file)
index c3b26b8..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/beta-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/beta-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/beta-invert.svg
deleted file mode 100644 (file)
index eca628f..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
-    <path d="M12 4c-4.4 0-8 3.6-8 8s3.6 8 8 8 8-3.6 8-8-3.6-8-8-8zm4 12l-3-2-1 4-1-4-3 2 2-3-4-1 4-1-2-3 3 2 1-4 1 4 3-2-2 3 4 1-4 1 2 3z"/>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/beta-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/beta-progressive.png
deleted file mode 100644 (file)
index 4c67bac..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/beta-progressive.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/beta-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/beta-progressive.svg
deleted file mode 100644 (file)
index ba896ef..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
-    <path d="M12 4c-4.4 0-8 3.6-8 8s3.6 8 8 8 8-3.6 8-8-3.6-8-8-8zm4 12l-3-2-1 4-1-4-3 2 2-3-4-1 4-1-2-3 3 2 1-4 1 4 3-2-2 3 4 1-4 1 2 3z"/>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/beta.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/beta.png
deleted file mode 100644 (file)
index 7b31e1e..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/beta.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/beta.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/beta.svg
deleted file mode 100644 (file)
index 51a5c78..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <path d="M12 4c-4.4 0-8 3.6-8 8s3.6 8 8 8 8-3.6 8-8-3.6-8-8-8zm4 12l-3-2-1 4-1-4-3 2 2-3-4-1 4-1-2-3 3 2 1-4 1 4 3-2-2 3 4 1-4 1 2 3z"/>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapTrail-ltr-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapTrail-ltr-invert.png
new file mode 100644 (file)
index 0000000..075f84e
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapTrail-ltr-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapTrail-ltr-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapTrail-ltr-invert.svg
new file mode 100644 (file)
index 0000000..17d3645
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
+    <path d="M15 9l.7-1.8c.9.4 1.8.7 2.4.9l-.6 1.7v.2L15 9zm-4.3-1.9l.8-1.8c1.2.5 2.6 1.1 3 1.4l-.8 1.8-3-1.4zm-5.9-1c-.8 0-1.4.2-2 .6L1.7 5c.9-.6 1.9-.9 3.1-.9v2zm-4.3.7l1.8.8c-.3.7-.3 1.3-.1 1.8l-1.9.7C0 8.9 0 7.8.5 6.8zm4.2 5.4l-1.3 1.5c-1-1-1.7-1.6-2-2l1.5-1.3c.7.8 1.3 1.4 1.8 1.8zm7.3 4.3c0 1.9-1.6 3.5-3.5 3.5S5 18.4 5 16.5 6.6 13 8.5 13s3.5 1.6 3.5 3.5zM24 8l-1-1-1.5 1.5L20 7l-1 1 1.5 1.5L19 11l1 1 1.5-1.5L23 12l1-1-1.5-1.5z"/>
+    <circle cx="8" cy="5" r="2"/>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapTrail-ltr-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapTrail-ltr-progressive.png
new file mode 100644 (file)
index 0000000..2b26e15
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapTrail-ltr-progressive.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapTrail-ltr-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapTrail-ltr-progressive.svg
new file mode 100644 (file)
index 0000000..2b49b99
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
+    <path d="M15 9l.7-1.8c.9.4 1.8.7 2.4.9l-.6 1.7v.2L15 9zm-4.3-1.9l.8-1.8c1.2.5 2.6 1.1 3 1.4l-.8 1.8-3-1.4zm-5.9-1c-.8 0-1.4.2-2 .6L1.7 5c.9-.6 1.9-.9 3.1-.9v2zm-4.3.7l1.8.8c-.3.7-.3 1.3-.1 1.8l-1.9.7C0 8.9 0 7.8.5 6.8zm4.2 5.4l-1.3 1.5c-1-1-1.7-1.6-2-2l1.5-1.3c.7.8 1.3 1.4 1.8 1.8zm7.3 4.3c0 1.9-1.6 3.5-3.5 3.5S5 18.4 5 16.5 6.6 13 8.5 13s3.5 1.6 3.5 3.5zM24 8l-1-1-1.5 1.5L20 7l-1 1 1.5 1.5L19 11l1 1 1.5-1.5L23 12l1-1-1.5-1.5z"/>
+    <circle cx="8" cy="5" r="2"/>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapTrail-ltr.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapTrail-ltr.png
new file mode 100644 (file)
index 0000000..331fd59
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapTrail-ltr.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapTrail-ltr.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapTrail-ltr.svg
new file mode 100644 (file)
index 0000000..cb073b9
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <path d="M15 9l.7-1.8c.9.4 1.8.7 2.4.9l-.6 1.7v.2L15 9zm-4.3-1.9l.8-1.8c1.2.5 2.6 1.1 3 1.4l-.8 1.8-3-1.4zm-5.9-1c-.8 0-1.4.2-2 .6L1.7 5c.9-.6 1.9-.9 3.1-.9v2zm-4.3.7l1.8.8c-.3.7-.3 1.3-.1 1.8l-1.9.7C0 8.9 0 7.8.5 6.8zm4.2 5.4l-1.3 1.5c-1-1-1.7-1.6-2-2l1.5-1.3c.7.8 1.3 1.4 1.8 1.8zm7.3 4.3c0 1.9-1.6 3.5-3.5 3.5S5 18.4 5 16.5 6.6 13 8.5 13s3.5 1.6 3.5 3.5zM24 8l-1-1-1.5 1.5L20 7l-1 1 1.5 1.5L19 11l1 1 1.5-1.5L23 12l1-1-1.5-1.5z"/>
+    <circle cx="8" cy="5" r="2"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapTrail-rtl-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapTrail-rtl-invert.png
new file mode 100644 (file)
index 0000000..75c8dcf
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapTrail-rtl-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapTrail-rtl-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapTrail-rtl-invert.svg
new file mode 100644 (file)
index 0000000..fbb9cab
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
+    <path d="M9.095 9l-.7-1.8c-.9.4-1.8.7-2.4.9l.6 1.7v.2l2.5-1zm4.3-1.9l-.8-1.8c-1.2.5-2.6 1.1-3 1.4l.8 1.8 3-1.4zm5.9-1c.8 0 1.4.2 2 .6l1.1-1.7c-.9-.6-1.9-.9-3.1-.9v2zm4.3.7l-1.8.8c.3.7.3 1.3.1 1.8l1.9.7c.3-1.2.3-2.3-.2-3.3zm-4.2 5.4l1.3 1.5c1-1 1.7-1.6 2-2l-1.5-1.3c-.7.8-1.3 1.4-1.8 1.8zm-7.3 4.3c0 1.9 1.6 3.5 3.5 3.5s3.5-1.6 3.5-3.5-1.6-3.5-3.5-3.5-3.5 1.6-3.5 3.5zM.095 8l1-1 1.5 1.5 1.5-1.5 1 1-1.5 1.5 1.5 1.5-1 1-1.5-1.5-1.5 1.5-1-1 1.5-1.5z"/>
+    <circle cx="8" cy="5" r="2" transform="matrix(-1 0 0 1 24.095 0)"/>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapTrail-rtl-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapTrail-rtl-progressive.png
new file mode 100644 (file)
index 0000000..fc0b2d9
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapTrail-rtl-progressive.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapTrail-rtl-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapTrail-rtl-progressive.svg
new file mode 100644 (file)
index 0000000..a2f62ff
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
+    <path d="M9.095 9l-.7-1.8c-.9.4-1.8.7-2.4.9l.6 1.7v.2l2.5-1zm4.3-1.9l-.8-1.8c-1.2.5-2.6 1.1-3 1.4l.8 1.8 3-1.4zm5.9-1c.8 0 1.4.2 2 .6l1.1-1.7c-.9-.6-1.9-.9-3.1-.9v2zm4.3.7l-1.8.8c.3.7.3 1.3.1 1.8l1.9.7c.3-1.2.3-2.3-.2-3.3zm-4.2 5.4l1.3 1.5c1-1 1.7-1.6 2-2l-1.5-1.3c-.7.8-1.3 1.4-1.8 1.8zm-7.3 4.3c0 1.9 1.6 3.5 3.5 3.5s3.5-1.6 3.5-3.5-1.6-3.5-3.5-3.5-3.5 1.6-3.5 3.5zM.095 8l1-1 1.5 1.5 1.5-1.5 1 1-1.5 1.5 1.5 1.5-1 1-1.5-1.5-1.5 1.5-1-1 1.5-1.5z"/>
+    <circle cx="8" cy="5" r="2" transform="matrix(-1 0 0 1 24.095 0)"/>
+</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapTrail-rtl.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapTrail-rtl.png
new file mode 100644 (file)
index 0000000..62f1fe9
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapTrail-rtl.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapTrail-rtl.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/mapTrail-rtl.svg
new file mode 100644 (file)
index 0000000..e8b1a08
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <path d="M9.095 9l-.7-1.8c-.9.4-1.8.7-2.4.9l.6 1.7v.2l2.5-1zm4.3-1.9l-.8-1.8c-1.2.5-2.6 1.1-3 1.4l.8 1.8 3-1.4zm5.9-1c.8 0 1.4.2 2 .6l1.1-1.7c-.9-.6-1.9-.9-3.1-.9v2zm4.3.7l-1.8.8c.3.7.3 1.3.1 1.8l1.9.7c.3-1.2.3-2.3-.2-3.3zm-4.2 5.4l1.3 1.5c1-1 1.7-1.6 2-2l-1.5-1.3c-.7.8-1.3 1.4-1.8 1.8zm-7.3 4.3c0 1.9 1.6 3.5 3.5 3.5s3.5-1.6 3.5-3.5-1.6-3.5-3.5-3.5-3.5 1.6-3.5 3.5zM.095 8l1-1 1.5 1.5 1.5-1.5 1 1-1.5 1.5 1.5 1.5-1 1-1.5-1.5-1.5 1.5-1-1 1.5-1.5z"/>
+    <circle cx="8" cy="5" r="2" transform="matrix(-1 0 0 1 24.095 0)"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/ribbonPrize-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/ribbonPrize-invert.png
deleted file mode 100644 (file)
index 46a180d..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/ribbonPrize-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/ribbonPrize-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/ribbonPrize-invert.svg
deleted file mode 100644 (file)
index 640d263..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
-    <circle cx="11.5" cy="8.5" r="2.5"/>
-    <path d="M16.3 8.7L17 8l-.8-.8.4-.8-1.1-.5.1-.9-1.2-.2-.1-.9-1.2.2-.4-.8-1.1.5L11 3l-.8.8-.9-.4-.5 1.1-.9-.2-.2 1.2-.9.2.2 1.2-.9.4.5 1.1L6 9l.8.8-.4.8 1.1.5-.1.9 1.2.2.1.9 1.2-.2.4.8 1.1-.5.6.8.8-.8.8.4.5-1.1.9.1.2-1.2.9-.1-.2-1.2.8-.4-.4-1zM11.5 12C9.6 12 8 10.4 8 8.5S9.6 5 11.5 5 15 6.6 15 8.5 13.4 12 11.5 12zm.5 3l-.7-.7-1.1.6-.4-.7-.8.3V23l2.5-3 2.5 3v-8.5l-1-.5z"/>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/ribbonPrize-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/ribbonPrize-progressive.png
deleted file mode 100644 (file)
index 79effe1..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/ribbonPrize-progressive.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/ribbonPrize-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/ribbonPrize-progressive.svg
deleted file mode 100644 (file)
index c0aa287..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
-    <circle cx="11.5" cy="8.5" r="2.5"/>
-    <path d="M16.3 8.7L17 8l-.8-.8.4-.8-1.1-.5.1-.9-1.2-.2-.1-.9-1.2.2-.4-.8-1.1.5L11 3l-.8.8-.9-.4-.5 1.1-.9-.2-.2 1.2-.9.2.2 1.2-.9.4.5 1.1L6 9l.8.8-.4.8 1.1.5-.1.9 1.2.2.1.9 1.2-.2.4.8 1.1-.5.6.8.8-.8.8.4.5-1.1.9.1.2-1.2.9-.1-.2-1.2.8-.4-.4-1zM11.5 12C9.6 12 8 10.4 8 8.5S9.6 5 11.5 5 15 6.6 15 8.5 13.4 12 11.5 12zm.5 3l-.7-.7-1.1.6-.4-.7-.8.3V23l2.5-3 2.5 3v-8.5l-1-.5z"/>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/ribbonPrize.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/ribbonPrize.png
deleted file mode 100644 (file)
index 1010574..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/ribbonPrize.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/ribbonPrize.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/ribbonPrize.svg
deleted file mode 100644 (file)
index 45df8b7..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <circle cx="11.5" cy="8.5" r="2.5"/>
-    <path d="M16.3 8.7L17 8l-.8-.8.4-.8-1.1-.5.1-.9-1.2-.2-.1-.9-1.2.2-.4-.8-1.1.5L11 3l-.8.8-.9-.4-.5 1.1-.9-.2-.2 1.2-.9.2.2 1.2-.9.4.5 1.1L6 9l.8.8-.4.8 1.1.5-.1.9 1.2.2.1.9 1.2-.2.4.8 1.1-.5.6.8.8-.8.8.4.5-1.1.9.1.2-1.2.9-.1-.2-1.2.8-.4-.4-1zM11.5 12C9.6 12 8 10.4 8 8.5S9.6 5 11.5 5 15 6.6 15 8.5 13.4 12 11.5 12zm.5 3l-.7-.7-1.1.6-.4-.7-.8.3V23l2.5-3 2.5 3v-8.5l-1-.5z"/>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-ltr-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-ltr-invert.png
deleted file mode 100644 (file)
index 075f84e..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-ltr-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-ltr-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-ltr-invert.svg
deleted file mode 100644 (file)
index 17d3645..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
-    <path d="M15 9l.7-1.8c.9.4 1.8.7 2.4.9l-.6 1.7v.2L15 9zm-4.3-1.9l.8-1.8c1.2.5 2.6 1.1 3 1.4l-.8 1.8-3-1.4zm-5.9-1c-.8 0-1.4.2-2 .6L1.7 5c.9-.6 1.9-.9 3.1-.9v2zm-4.3.7l1.8.8c-.3.7-.3 1.3-.1 1.8l-1.9.7C0 8.9 0 7.8.5 6.8zm4.2 5.4l-1.3 1.5c-1-1-1.7-1.6-2-2l1.5-1.3c.7.8 1.3 1.4 1.8 1.8zm7.3 4.3c0 1.9-1.6 3.5-3.5 3.5S5 18.4 5 16.5 6.6 13 8.5 13s3.5 1.6 3.5 3.5zM24 8l-1-1-1.5 1.5L20 7l-1 1 1.5 1.5L19 11l1 1 1.5-1.5L23 12l1-1-1.5-1.5z"/>
-    <circle cx="8" cy="5" r="2"/>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-ltr-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-ltr-progressive.png
deleted file mode 100644 (file)
index 2b26e15..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-ltr-progressive.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-ltr-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-ltr-progressive.svg
deleted file mode 100644 (file)
index 2b49b99..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
-    <path d="M15 9l.7-1.8c.9.4 1.8.7 2.4.9l-.6 1.7v.2L15 9zm-4.3-1.9l.8-1.8c1.2.5 2.6 1.1 3 1.4l-.8 1.8-3-1.4zm-5.9-1c-.8 0-1.4.2-2 .6L1.7 5c.9-.6 1.9-.9 3.1-.9v2zm-4.3.7l1.8.8c-.3.7-.3 1.3-.1 1.8l-1.9.7C0 8.9 0 7.8.5 6.8zm4.2 5.4l-1.3 1.5c-1-1-1.7-1.6-2-2l1.5-1.3c.7.8 1.3 1.4 1.8 1.8zm7.3 4.3c0 1.9-1.6 3.5-3.5 3.5S5 18.4 5 16.5 6.6 13 8.5 13s3.5 1.6 3.5 3.5zM24 8l-1-1-1.5 1.5L20 7l-1 1 1.5 1.5L19 11l1 1 1.5-1.5L23 12l1-1-1.5-1.5z"/>
-    <circle cx="8" cy="5" r="2"/>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-ltr.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-ltr.png
deleted file mode 100644 (file)
index 331fd59..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-ltr.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-ltr.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-ltr.svg
deleted file mode 100644 (file)
index cb073b9..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <path d="M15 9l.7-1.8c.9.4 1.8.7 2.4.9l-.6 1.7v.2L15 9zm-4.3-1.9l.8-1.8c1.2.5 2.6 1.1 3 1.4l-.8 1.8-3-1.4zm-5.9-1c-.8 0-1.4.2-2 .6L1.7 5c.9-.6 1.9-.9 3.1-.9v2zm-4.3.7l1.8.8c-.3.7-.3 1.3-.1 1.8l-1.9.7C0 8.9 0 7.8.5 6.8zm4.2 5.4l-1.3 1.5c-1-1-1.7-1.6-2-2l1.5-1.3c.7.8 1.3 1.4 1.8 1.8zm7.3 4.3c0 1.9-1.6 3.5-3.5 3.5S5 18.4 5 16.5 6.6 13 8.5 13s3.5 1.6 3.5 3.5zM24 8l-1-1-1.5 1.5L20 7l-1 1 1.5 1.5L19 11l1 1 1.5-1.5L23 12l1-1-1.5-1.5z"/>
-    <circle cx="8" cy="5" r="2"/>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-rtl-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-rtl-invert.png
deleted file mode 100644 (file)
index 75c8dcf..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-rtl-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-rtl-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-rtl-invert.svg
deleted file mode 100644 (file)
index fbb9cab..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#fff">
-    <path d="M9.095 9l-.7-1.8c-.9.4-1.8.7-2.4.9l.6 1.7v.2l2.5-1zm4.3-1.9l-.8-1.8c-1.2.5-2.6 1.1-3 1.4l.8 1.8 3-1.4zm5.9-1c.8 0 1.4.2 2 .6l1.1-1.7c-.9-.6-1.9-.9-3.1-.9v2zm4.3.7l-1.8.8c.3.7.3 1.3.1 1.8l1.9.7c.3-1.2.3-2.3-.2-3.3zm-4.2 5.4l1.3 1.5c1-1 1.7-1.6 2-2l-1.5-1.3c-.7.8-1.3 1.4-1.8 1.8zm-7.3 4.3c0 1.9 1.6 3.5 3.5 3.5s3.5-1.6 3.5-3.5-1.6-3.5-3.5-3.5-3.5 1.6-3.5 3.5zM.095 8l1-1 1.5 1.5 1.5-1.5 1 1-1.5 1.5 1.5 1.5-1 1-1.5-1.5-1.5 1.5-1-1 1.5-1.5z"/>
-    <circle cx="8" cy="5" r="2" transform="matrix(-1 0 0 1 24.095 0)"/>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-rtl-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-rtl-progressive.png
deleted file mode 100644 (file)
index fc0b2d9..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-rtl-progressive.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-rtl-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-rtl-progressive.svg
deleted file mode 100644 (file)
index a2f62ff..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="#36c">
-    <path d="M9.095 9l-.7-1.8c-.9.4-1.8.7-2.4.9l.6 1.7v.2l2.5-1zm4.3-1.9l-.8-1.8c-1.2.5-2.6 1.1-3 1.4l.8 1.8 3-1.4zm5.9-1c.8 0 1.4.2 2 .6l1.1-1.7c-.9-.6-1.9-.9-3.1-.9v2zm4.3.7l-1.8.8c.3.7.3 1.3.1 1.8l1.9.7c.3-1.2.3-2.3-.2-3.3zm-4.2 5.4l1.3 1.5c1-1 1.7-1.6 2-2l-1.5-1.3c-.7.8-1.3 1.4-1.8 1.8zm-7.3 4.3c0 1.9 1.6 3.5 3.5 3.5s3.5-1.6 3.5-3.5-1.6-3.5-3.5-3.5-3.5 1.6-3.5 3.5zM.095 8l1-1 1.5 1.5 1.5-1.5 1 1-1.5 1.5 1.5 1.5-1 1-1.5-1.5-1.5 1.5-1-1 1.5-1.5z"/>
-    <circle cx="8" cy="5" r="2" transform="matrix(-1 0 0 1 24.095 0)"/>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-rtl.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-rtl.png
deleted file mode 100644 (file)
index 62f1fe9..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-rtl.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-rtl.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/wikitrail-rtl.svg
deleted file mode 100644 (file)
index e8b1a08..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <path d="M9.095 9l-.7-1.8c-.9.4-1.8.7-2.4.9l.6 1.7v.2l2.5-1zm4.3-1.9l-.8-1.8c-1.2.5-2.6 1.1-3 1.4l.8 1.8 3-1.4zm5.9-1c.8 0 1.4.2 2 .6l1.1-1.7c-.9-.6-1.9-.9-3.1-.9v2zm4.3.7l-1.8.8c.3.7.3 1.3.1 1.8l1.9.7c.3-1.2.3-2.3-.2-3.3zm-4.2 5.4l1.3 1.5c1-1 1.7-1.6 2-2l-1.5-1.3c-.7.8-1.3 1.4-1.8 1.8zm-7.3 4.3c0 1.9 1.6 3.5 3.5 3.5s3.5-1.6 3.5-3.5-1.6-3.5-3.5-3.5-3.5 1.6-3.5 3.5zM.095 8l1-1 1.5 1.5 1.5-1.5 1 1-1.5 1.5 1.5 1.5-1 1-1.5-1.5-1.5 1.5-1-1 1.5-1.5z"/>
-    <circle cx="8" cy="5" r="2" transform="matrix(-1 0 0 1 24.095 0)"/>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/alert-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/alert-progressive.png
deleted file mode 100644 (file)
index fa85ac3..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/alert-progressive.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/alert-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/alert-progressive.svg
deleted file mode 100644 (file)
index 900e477..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><g fill="#36c">
-    <path d="M6 12A6 6 0 1 1 6 0a6 6 0 0 1 0 12zM5 7h2V2H5zm0 3h2V8H5z" id="alert"/>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-down-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-down-progressive.png
deleted file mode 100644 (file)
index 3539c88..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-down-progressive.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-down-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-down-progressive.svg
deleted file mode 100644 (file)
index 511359a..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><g fill="#36c">
-    <g id="down">
-        <path id="arrow" d="M1 4h10L6 9 1 4"/>
-    </g>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-ltr-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-ltr-progressive.png
deleted file mode 100644 (file)
index 7d50f19..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-ltr-progressive.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-ltr-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-ltr-progressive.svg
deleted file mode 100644 (file)
index fc6cb9a..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><g fill="#36c">
-    <g id="ltr">
-        <path id="arrow" d="M4 1v10l5-5-5-5"/>
-    </g>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-rtl-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-rtl-progressive.png
deleted file mode 100644 (file)
index 27bfa29..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-rtl-progressive.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-rtl-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-rtl-progressive.svg
deleted file mode 100644 (file)
index 8f1a254..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><g fill="#36c">
-    <g id="rtl">
-        <path id="arrow" d="M8 11V1L3 6l5 5"/>
-    </g>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-up-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-up-progressive.png
deleted file mode 100644 (file)
index 521e438..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-up-progressive.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-up-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-up-progressive.svg
deleted file mode 100644 (file)
index 4e9221a..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><g fill="#36c">
-    <g id="up">
-        <path id="arrow" d="M1 8h10L6 3 1 8"/>
-    </g>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/clear-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/clear-progressive.png
deleted file mode 100644 (file)
index 325dbeb..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/clear-progressive.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/clear-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/clear-progressive.svg
deleted file mode 100644 (file)
index 4ea1013..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><g fill="#36c">
-    <g id="clear">
-        <path id="circle-with-cross" d="M6 0C2.7 0 0 2.7 0 6s2.7 6 6 6 6-2.7 6-6-2.7-6-6-6zM3.5 2.5L6 5l2.5-2.5 1 1L7 6l2.5 2.5-1 1L6 7 3.5 9.5l-1-1L5 6 2.5 3.5z"/>
-    </g>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/required-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/required-progressive.png
deleted file mode 100644 (file)
index 01e84e6..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/required-progressive.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/required-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/required-progressive.svg
deleted file mode 100644 (file)
index ab95a3d..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><g fill="#36c">
-    <path d="M5 1h2v10H5zm4.83 1.634l1 1.732-8.66 5-1-1.732zM1.17 4.366l1-1.732 8.66 5-1 1.732z" id="required"/>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/search-ltr-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/search-ltr-progressive.png
deleted file mode 100644 (file)
index 84c7dbc..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/search-ltr-progressive.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/search-ltr-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/search-ltr-progressive.svg
deleted file mode 100644 (file)
index 5e8e395..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><g fill="#36c">
-    <g id="search">
-        <path id="magnifying-glass" d="M10.37 9.474L7.994 7.1l-.17-.1a3.45 3.45 0 0 0 .644-2.01A3.478 3.478 0 1 0 4.99 8.47c.75 0 1.442-.24 2.01-.648l.098.17 2.375 2.373c.19.188.543.142.79-.105s.293-.6.104-.79zm-5.38-2.27a2.21 2.21 0 1 1 2.21-2.21A2.21 2.21 0 0 1 4.99 7.21z"/>
-    </g>
-</g></svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/search-rtl-progressive.png b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/search-rtl-progressive.png
deleted file mode 100644 (file)
index 0207a8b..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/search-rtl-progressive.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/search-rtl-progressive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/search-rtl-progressive.svg
deleted file mode 100644 (file)
index 015d02e..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><g fill="#36c">
-    <g id="search">
-        <path id="magnifying-glass" d="M1.63 9.474L4.006 7.1l.17-.1a3.45 3.45 0 0 1-.644-2.01A3.478 3.478 0 1 1 7.01 8.47 3.43 3.43 0 0 1 5 7.822l-.098.17-2.375 2.373c-.19.188-.543.142-.79-.105s-.293-.6-.104-.79zm5.378-2.27A2.21 2.21 0 1 0 4.8 4.994 2.21 2.21 0 0 0 7.01 7.21z"/>
-    </g>
-</g></svg>
index 91d0358..df32417 100644 (file)
@@ -8,8 +8,7 @@
                        "global": true
                },
                "progressive": {
-                       "color": "#36c",
-                       "global": true
+                       "color": "#36c"
                },
                "constructive": {
                        "color": "#36c"
index 3857f99..f93051c 100644 (file)
@@ -1,18 +1,18 @@
 /*!
- * OOjs v1.1.10 optimised for jQuery
+ * OOjs v2.0.0 optimised for jQuery
  * https://www.mediawiki.org/wiki/OOjs
  *
- * Copyright 2011-2015 OOjs Team and other contributors.
+ * Copyright 2011-2017 OOjs Team and other contributors.
  * Released under the MIT license
- * http://oojs.mit-license.org
+ * https://oojs.mit-license.org
  *
- * Date: 2015-11-11T16:49:11Z
+ * Date: 2017-04-05T02:18:04Z
  */
 ( function ( global ) {
 
 'use strict';
 
-/*exported toString */
+/* exported toString */
 var
        /**
         * Namespace for all classes, static methods and static properties.
@@ -22,21 +22,7 @@ var
        oo = {},
        // Optimisation: Local reference to Object.prototype.hasOwnProperty
        hasOwn = oo.hasOwnProperty,
-       toString = oo.toString,
-       // Object.create() is impossible to fully polyfill, so don't require it
-       createObject = Object.create || ( function () {
-               // Reusable constructor function
-               function Empty() {}
-               return function ( prototype, properties ) {
-                       var obj;
-                       Empty.prototype = prototype;
-                       obj = new Empty();
-                       if ( properties && hasOwn.call( properties, 'constructor' ) ) {
-                               obj.constructor = properties.constructor.value;
-                       }
-                       return obj;
-               };
-       } )();
+       toString = oo.toString;
 
 /* Class Methods */
 
@@ -92,8 +78,11 @@ oo.initClass = function ( fn ) {
 oo.inheritClass = function ( targetFn, originFn ) {
        var targetConstructor;
 
+       if ( !originFn ) {
+               throw new Error( 'inheritClass: Origin is not a function (actually ' + originFn + ')' );
+       }
        if ( targetFn.prototype instanceof originFn ) {
-               throw new Error( 'Target already inherits from origin' );
+               throw new Error( 'inheritClass: Target already inherits from origin' );
        }
 
        targetConstructor = targetFn.prototype.constructor;
@@ -102,9 +91,10 @@ oo.inheritClass = function ( targetFn, originFn ) {
        // by IE 8 and below (bug 63303).
        // Provide .parent as alias for code supporting older browsers which
        // allows people to comply with their style guide.
+       // eslint-disable-next-line dot-notation
        targetFn[ 'super' ] = targetFn.parent = originFn;
 
-       targetFn.prototype = createObject( originFn.prototype, {
+       targetFn.prototype = Object.create( originFn.prototype, {
                // Restore constructor property of targetFn
                constructor: {
                        value: targetConstructor,
@@ -116,7 +106,7 @@ oo.inheritClass = function ( targetFn, originFn ) {
 
        // Extend static properties - always initialize both sides
        oo.initClass( originFn );
-       targetFn.static = createObject( originFn.static );
+       targetFn.static = Object.create( originFn.static );
 };
 
 /**
@@ -153,6 +143,10 @@ oo.inheritClass = function ( targetFn, originFn ) {
 oo.mixinClass = function ( targetFn, originFn ) {
        var key;
 
+       if ( !originFn ) {
+               throw new Error( 'mixinClass: Origin is not a function (actually ' + originFn + ')' );
+       }
+
        // Copy prototype properties
        for ( key in originFn.prototype ) {
                if ( key !== 'constructor' && hasOwn.call( originFn.prototype, key ) ) {
@@ -173,13 +167,26 @@ oo.mixinClass = function ( targetFn, originFn ) {
        }
 };
 
+/**
+ * Test whether one class is a subclass of another, without instantiating it.
+ *
+ * Every class is considered a subclass of Object and of itself.
+ *
+ * @param {Function} testFn The class to be tested
+ * @param {Function} baseFn The base class
+ * @return {boolean} Whether testFn is a subclass of baseFn (or equal to it)
+ */
+oo.isSubclass = function ( testFn, baseFn ) {
+       return testFn === baseFn || testFn.prototype instanceof baseFn;
+};
+
 /* Object Methods */
 
 /**
  * Get a deeply nested property of an object using variadic arguments, protecting against
  * undefined property errors.
  *
- * `quux = oo.getProp( obj, 'foo', 'bar', 'baz' );` is equivalent to `quux = obj.foo.bar.baz;`
+ * `quux = OO.getProp( obj, 'foo', 'bar', 'baz' );` is equivalent to `quux = obj.foo.bar.baz;`
  * except that the former protects against JS errors if one of the intermediate properties
  * is undefined. Instead of throwing an error, this function will return undefined in
  * that case.
@@ -218,7 +225,7 @@ oo.getProp = function ( obj ) {
 oo.setProp = function ( obj ) {
        var i,
                prop = obj;
-       if ( Object( obj ) !== obj ) {
+       if ( Object( obj ) !== obj || arguments.length < 2 ) {
                return;
        }
        for ( i = 1; i < arguments.length - 2; i++ ) {
@@ -233,6 +240,34 @@ oo.setProp = function ( obj ) {
        prop[ arguments[ arguments.length - 2 ] ] = arguments[ arguments.length - 1 ];
 };
 
+/**
+ * Delete a deeply nested property of an object using variadic arguments, protecting against
+ * undefined property errors, and deleting resulting empty objects.
+ *
+ * @param {Object} obj
+ * @param {...Mixed} [keys]
+ */
+oo.deleteProp = function ( obj ) {
+       var i,
+               prop = obj,
+               props = [ prop ];
+       if ( Object( obj ) !== obj || arguments.length < 2 ) {
+               return;
+       }
+       for ( i = 1; i < arguments.length - 1; i++ ) {
+               if ( prop[ arguments[ i ] ] === undefined || Object( prop[ arguments[ i ] ] ) !== prop[ arguments[ i ] ] ) {
+                       return;
+               }
+               prop = prop[ arguments[ i ] ];
+               props.push( prop );
+       }
+       delete prop[ arguments[ i ] ];
+       // Walk back through props removing any plain empty objects
+       while ( ( prop = props.pop() ) && oo.isPlainObject( prop ) && !Object.keys( prop ).length ) {
+               delete props[ props.length - 1 ][ arguments[ props.length ] ];
+       }
+};
+
 /**
  * Create a new object that is an instance of the same
  * constructor as the input, inherits from the same object
@@ -258,7 +293,7 @@ oo.setProp = function ( obj ) {
 oo.cloneObject = function ( origin ) {
        var key, r;
 
-       r = createObject( origin.constructor.prototype );
+       r = Object.create( origin.constructor.prototype );
 
        for ( key in origin ) {
                if ( hasOwn.call( origin, key ) ) {
@@ -314,7 +349,7 @@ oo.binarySearch = function ( arr, searchFunc, forInsertion ) {
                right = arr.length;
        while ( left < right ) {
                // Equivalent to Math.floor( ( left + right ) / 2 ) but much faster
-               /*jshint bitwise:false */
+               // eslint-disable-next-line no-bitwise
                mid = ( left + right ) >> 1;
                cmpResult = searchFunc( arr[ mid ] );
                if ( cmpResult < 0 ) {
@@ -479,10 +514,9 @@ oo.getHash.keySortReplacer = function ( key, val ) {
                        normalized[ keys[ i ] ] = val[ keys[ i ] ];
                }
                return normalized;
-
-       // Primitive values and arrays get stable hashes
-       // by default. Lets those be stringified as-is.
        } else {
+               // Primitive values and arrays get stable hashes
+               // by default. Lets those be stringified as-is.
                return val;
        }
 };
@@ -592,11 +626,11 @@ oo.simpleArrayDifference = function ( a, b ) {
        return simpleArrayCombine( a, b, false );
 };
 
-/*global $ */
+/* global $ */
 
 oo.isPlainObject = $.isPlainObject;
 
-/*global hasOwn */
+/* global hasOwn */
 
 ( function () {
 
@@ -1091,7 +1125,18 @@ oo.isPlainObject = $.isPlainObject;
         * Don't call this directly unless you know what you're doing.
         * Use #addItems instead.
         *
-        * @private
+        * This method can be extended in child classes to produce
+        * different behavior when an item is inserted. For example,
+        * inserted items may also be attached to the DOM or may
+        * interact with some other nodes in certain ways. Extending
+        * this method is allowed, but if overriden, the aggregation
+        * of events must be preserved, or behavior of emitted events
+        * will be broken.
+        *
+        * If you are extending this method, please make sure the
+        * parent method is called.
+        *
+        * @protected
         * @param {OO.EventEmitter} item Items to add
         * @param {number} index Index to add items at
         * @return {number} The index the item was added at
@@ -1297,7 +1342,7 @@ oo.SortedEmitterList.prototype.addItems = function ( items ) {
 
                // Insert item at the insertion index
                index = this.insertItem( items[ i ], insertionIndex );
-               this.emit( 'add', items[ i ], insertionIndex );
+               this.emit( 'add', items[ i ], index );
        }
 
        return this;
@@ -1325,7 +1370,7 @@ oo.SortedEmitterList.prototype.findInsertionIndex = function ( item ) {
 
 };
 
-/*global hasOwn */
+/* global hasOwn */
 
 /**
  * @class OO.Registry
@@ -1421,8 +1466,6 @@ oo.Registry.prototype.lookup = function ( name ) {
        }
 };
 
-/*global createObject */
-
 /**
  * @class OO.Factory
  * @extends OO.Registry
@@ -1431,7 +1474,7 @@ oo.Registry.prototype.lookup = function ( name ) {
  */
 oo.Factory = function OoFactory() {
        // Parent constructor
-       oo.Factory.parent.call( this );
+       oo.Factory.super.call( this );
 };
 
 /* Inheritance */
@@ -1468,7 +1511,7 @@ oo.Factory.prototype.register = function ( constructor ) {
        }
 
        // Parent method
-       oo.Factory.parent.prototype.register.call( this, name, constructor );
+       oo.Factory.super.prototype.register.call( this, name, constructor );
 };
 
 /**
@@ -1490,7 +1533,7 @@ oo.Factory.prototype.unregister = function ( constructor ) {
        }
 
        // Parent method
-       oo.Factory.parent.prototype.unregister.call( this, name );
+       oo.Factory.super.prototype.unregister.call( this, name );
 };
 
 /**
@@ -1523,12 +1566,12 @@ oo.Factory.prototype.create = function ( name ) {
        // the constructor's prototype (which also makes it an "instanceof" the constructor),
        // then invoke the constructor with the object as context, and return it (ignoring
        // the constructor's return value).
-       obj = createObject( constructor.prototype );
+       obj = Object.create( constructor.prototype );
        constructor.apply( obj, args );
        return obj;
 };
 
-/*jshint node:true */
+/* eslint-env node */
 if ( typeof module !== 'undefined' && module.exports ) {
        module.exports = oo;
 } else {
diff --git a/resources/src/es5-skip.js b/resources/src/es5-skip.js
deleted file mode 100644 (file)
index a4039d8..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-/*!
- * Skip function for es5-shim module.
- *
- * Test for strict mode as a proxy for full ES5 function support (but not syntax)
- * Per http://kangax.github.io/compat-table/es5/ this is a reasonable shortcut
- * that still allows this to be as short as possible (there are no browsers we
- * support that have strict mode, but lack other features).
- *
- * Do explicitly test for Function#bind because of PhantomJS (which implements
- * strict mode, but lacks Function#bind).
- *
- * IE9 supports all features except strict mode, so loading es5-shim should be close to
- * a no-op but does increase page payload).
- */
-return ( function () {
-       'use strict';
-       return !this && !!Function.prototype.bind;
-}() );
diff --git a/resources/src/jquery/images/jquery.arrowSteps.divider-ltr.png b/resources/src/jquery/images/jquery.arrowSteps.divider-ltr.png
deleted file mode 100644 (file)
index 84ed2a2..0000000
Binary files a/resources/src/jquery/images/jquery.arrowSteps.divider-ltr.png and /dev/null differ
diff --git a/resources/src/jquery/images/jquery.arrowSteps.divider-rtl.png b/resources/src/jquery/images/jquery.arrowSteps.divider-rtl.png
deleted file mode 100644 (file)
index c212aeb..0000000
Binary files a/resources/src/jquery/images/jquery.arrowSteps.divider-rtl.png and /dev/null differ
diff --git a/resources/src/jquery/images/jquery.arrowSteps.head-ltr.png b/resources/src/jquery/images/jquery.arrowSteps.head-ltr.png
deleted file mode 100644 (file)
index e6546bf..0000000
Binary files a/resources/src/jquery/images/jquery.arrowSteps.head-ltr.png and /dev/null differ
diff --git a/resources/src/jquery/images/jquery.arrowSteps.head-rtl.png b/resources/src/jquery/images/jquery.arrowSteps.head-rtl.png
deleted file mode 100644 (file)
index 2af30b9..0000000
Binary files a/resources/src/jquery/images/jquery.arrowSteps.head-rtl.png and /dev/null differ
diff --git a/resources/src/jquery/images/jquery.arrowSteps.tail-ltr.png b/resources/src/jquery/images/jquery.arrowSteps.tail-ltr.png
deleted file mode 100644 (file)
index 3ad990b..0000000
Binary files a/resources/src/jquery/images/jquery.arrowSteps.tail-ltr.png and /dev/null differ
diff --git a/resources/src/jquery/images/jquery.arrowSteps.tail-rtl.png b/resources/src/jquery/images/jquery.arrowSteps.tail-rtl.png
deleted file mode 100644 (file)
index 1d3048e..0000000
Binary files a/resources/src/jquery/images/jquery.arrowSteps.tail-rtl.png and /dev/null differ
diff --git a/resources/src/jquery/jquery.arrowSteps.css b/resources/src/jquery/jquery.arrowSteps.css
deleted file mode 100644 (file)
index 92c6c43..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-.arrowSteps {
-       list-style-type: none;
-       list-style-image: none;
-       border: 1px solid #666;
-       position: relative;
-}
-
-.arrowSteps li {
-       float: left;
-       padding: 0;
-       margin: 0;
-       border: 0;
-}
-
-.arrowSteps li div {
-       padding: 0.5em;
-       text-align: center;
-       white-space: nowrap;
-       overflow: hidden;
-}
-
-.arrowSteps li.arrow div {
-       /* @embed */
-       background: url( images/jquery.arrowSteps.divider-ltr.png ) no-repeat right center;
-}
-
-/* applied to the element preceding the highlighted step */
-.arrowSteps li.arrow.tail div {
-       /* @embed */
-       background: url( images/jquery.arrowSteps.tail-ltr.png ) no-repeat right center;
-}
-
-/* this applies to all highlighted, including the last */
-.arrowSteps li.head div {
-       /* @embed */
-       background: url( images/jquery.arrowSteps.head-ltr.png ) no-repeat left center;
-       font-weight: bold;
-}
-
-/* this applies to all highlighted arrows except the last */
-.arrowSteps li.arrow.head div {
-       /* TODO: eliminate duplication of jquery.arrowSteps.head.png embedding */
-       /* @embed */
-       background: url( images/jquery.arrowSteps.head-ltr.png ) no-repeat right center;
-}
diff --git a/resources/src/jquery/jquery.arrowSteps.js b/resources/src/jquery/jquery.arrowSteps.js
deleted file mode 100644 (file)
index b0c36c6..0000000
+++ /dev/null
@@ -1,98 +0,0 @@
-/*!
- * jQuery arrowSteps plugin
- * Copyright Neil Kandalgaonkar, 2010
- *
- * This work is licensed under the terms of the GNU General Public License,
- * version 2 or later.
- * (see http://www.fsf.org/licensing/licenses/gpl.html).
- * Derivative works and later versions of the code must be free software
- * licensed under the same or a compatible license.
- */
-
-/**
- * @class jQuery.plugin.arrowSteps
- */
-( function ( $ ) {
-       /**
-        * Show users their progress through a series of steps, via a row of items that fit
-        * together like arrows. One item can be highlighted at a time.
-        *
-        *     <ul id="robin-hood-daffy">
-        *       <li id="guard"><div>Guard!</div></li>
-        *       <li id="turn"><div>Turn!</div></li>
-        *       <li id="parry"><div>Parry!</div></li>
-        *       <li id="dodge"><div>Dodge!</div></li>
-        *       <li id="spin"><div>Spin!</div></li>
-        *       <li id="ha"><div>Ha!</div></li>
-        *       <li id="thrust"><div>Thrust!</div></li>
-        *     </ul>
-        *
-        *     <script>
-        *       $( '#robin-hood-daffy' ).arrowSteps();
-        *     </script>
-        *
-        * @return {jQuery}
-        * @chainable
-        */
-       $.fn.arrowSteps = function () {
-               var $steps, width, arrowWidth, $stepDiv,
-                       $el = this,
-                       paddingSide = $( 'body' ).hasClass( 'rtl' ) ? 'padding-left' : 'padding-right';
-
-               $el.addClass( 'arrowSteps' );
-               $steps = $el.find( 'li' );
-
-               width = parseInt( 100 / $steps.length, 10 );
-               $steps.css( 'width', width + '%' );
-
-               // Every step except the last one has an arrow pointing forward:
-               // at the right hand side in LTR languages, and at the left hand side in RTL.
-               // Also add in the padding for the calculated arrow width.
-               $stepDiv = $steps.filter( ':not(:last-child)' ).addClass( 'arrow' ).find( 'div' );
-
-               // Execute when complete page is fully loaded, including all frames, objects and images
-               $( window ).on( 'load', function () {
-                       arrowWidth = parseInt( $el.outerHeight(), 10 );
-                       $stepDiv.css( paddingSide, arrowWidth.toString() + 'px' );
-               } );
-
-               $el.data( 'arrowSteps', $steps );
-
-               return this;
-       };
-
-       /**
-        * Highlights the element selected by the selector.
-        *
-        *       $( '#robin-hood-daffy' ).arrowStepsHighlight( '#guard' );
-        *       // 'Guard!' is highlighted.
-        *
-        *       // ... user completes the 'guard' step ...
-        *
-        *       $( '#robin-hood-daffy' ).arrowStepsHighlight( '#turn' );
-        *       // 'Turn!' is highlighted.
-        *
-        * @param {string} selector
-        */
-       $.fn.arrowStepsHighlight = function ( selector ) {
-               var $previous,
-                       $steps = this.data( 'arrowSteps' );
-               $.each( $steps, function ( i, step ) {
-                       var $step = $( step );
-                       if ( $step.is( selector ) ) {
-                               if ( $previous ) {
-                                       $previous.addClass( 'tail' );
-                               }
-                               $step.addClass( 'head' );
-                       } else {
-                               $step.removeClass( 'head tail lasthead' );
-                       }
-                       $previous = $step;
-               } );
-       };
-
-       /**
-        * @class jQuery
-        * @mixins jQuery.plugin.arrowSteps
-        */
-}( jQuery ) );
index 70dc105..847afd4 100644 (file)
@@ -16,7 +16,7 @@
                        color = $.css( elem, attr );
 
                        // Keep going until we find an element that has color, or we hit the body
-                       if ( color !== '' && color !== 'transparent' || $.nodeName( elem, 'body' ) ) {
+                       if ( color !== '' && color !== 'transparent' || elem.nodeName.toLowerCase() === 'body' ) {
                                break;
                        }
 
index c53ec3b..2be1dba 100644 (file)
@@ -26,7 +26,7 @@
                        var result;
 
                        // Check if we're already dealing with an array of colors
-                       if ( color && $.isArray( color ) && color.length === 3 ) {
+                       if ( color && Array.isArray( color ) && color.length === 3 ) {
                                return color;
                        }
 
index eef3846..7296811 100644 (file)
                        if (
                                e.type === 'click' &&
                                options.linksPassthru &&
-                               $.nodeName( e.target, 'a' ) &&
+                               e.target.nodeName.toLowerCase() === 'a' &&
                                $( e.target ).attr( 'href' ) &&
                                $( e.target ).attr( 'href' ) !== '#'
                        ) {
index f9675fa..6d478bd 100644 (file)
@@ -45,7 +45,7 @@
                                return false;
                        }
                        for ( i = 0; i < arrThis.length; i++ ) {
-                               if ( $.isArray( arrThis[ i ] ) ) {
+                               if ( Array.isArray( arrThis[ i ] ) ) {
                                        if ( !$.compareArray( arrThis[ i ], arrAgainst[ i ] ) ) {
                                                return false;
                                        }
index 12b0404..afb8837 100644 (file)
 /*!
- * HTML5 placeholder emulation for jQuery plugin
- *
- * This will automatically use the HTML5 placeholder attribute if supported, or emulate this behavior if not.
- *
- * This is a fork from Mathias Bynens' jquery.placeholder as of this commit
- * https://github.com/mathiasbynens/jquery-placeholder/blob/47f05d400e2dd16b59d144141a2cf54a9a77c502/jquery.placeholder.js
- *
- * @author Mathias Bynens <http://mathiasbynens.be/>
- * @author Trevor Parscal <tparscal@wikimedia.org>, 2012
- * @author Krinkle <krinklemail@gmail.com>, 2012
- * @author Alex Ivanov <alexivanov97@gmail.com>, 2013
- * @version 2.1.0
- * @license MIT
+ * No-op for compatibility with code from before we used
+ * native placeholder in all supported browsers.
  */
 
 ( function ( $ ) {
+       var placeholder;
 
-       var isInputSupported = 'placeholder' in document.createElement( 'input' ),
-               isTextareaSupported = 'placeholder' in document.createElement( 'textarea' ),
-               prototype = $.fn,
-               valHooks = $.valHooks,
-               propHooks = $.propHooks,
-               hooks,
-               placeholder;
-
-       function safeActiveElement() {
-               // Avoid IE9 `document.activeElement` of death
-               // https://github.com/mathiasbynens/jquery-placeholder/pull/99
-               try {
-                       return document.activeElement;
-               } catch ( err ) {}
-       }
-
-       function args( elem ) {
-               // Return an object of element attributes
-               var newAttrs = {},
-                       rinlinejQuery = /^jQuery\d+$/;
-               $.each( elem.attributes, function ( i, attr ) {
-                       if ( attr.specified && !rinlinejQuery.test( attr.name ) ) {
-                               newAttrs[ attr.name ] = attr.value;
-                       }
-               } );
-               return newAttrs;
-       }
-
-       function clearPlaceholder( event, value ) {
-               var input = this,
-                       $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' ) );
-                               // If `clearPlaceholder` was called from `$.valHooks.input.set`
-                               if ( event === true ) {
-                                       $input[ 0 ].value = value;
-                                       return value;
-                               }
-                               $input.focus();
-                       } else {
-                               input.value = '';
-                               $input.removeClass( 'placeholder' );
-                               if ( input === safeActiveElement() ) {
-                                       input.select();
-                               }
-                       }
-               }
-       }
-
-       function setPlaceholder() {
-               var $replacement,
-                       input = this,
-                       $input = $( input ),
-                       id = this.id;
-               if ( !input.value ) {
-                       if ( input.type === 'password' ) {
-                               if ( !$input.data( 'placeholder-textinput' ) ) {
-                                       try {
-                                               $replacement = $input.clone().attr( { type: 'text' } );
-                                       } catch ( e ) {
-                                               $replacement = $( '<input>' ).attr( $.extend( args( this ), { type: 'text' } ) );
-                                       }
-                                       $replacement
-                                                       .removeAttr( 'name' )
-                                                       .data( {
-                                                               'placeholder-password': $input,
-                                                               'placeholder-id': id
-                                                       } )
-                                                       .on( 'focus.placeholder drop.placeholder', clearPlaceholder );
-                                       $input
-                                                       .data( {
-                                                               'placeholder-textinput': $replacement,
-                                                               'placeholder-id': id
-                                                       } )
-                                                       .before( $replacement );
-                               }
-                               $input = $input.removeAttr( 'id' ).hide().prev().attr( 'id', id ).show();
-                               // Note: `$input[0] != input` now!
-                       }
-                       $input.addClass( 'placeholder' );
-                       $input[ 0 ].value = $input.attr( 'placeholder' );
-               } else {
-                       $input.removeClass( 'placeholder' );
-               }
-       }
-
-       function changePlaceholder( text ) {
-               var hasArgs = arguments.length,
-                       $input = this;
-               if ( hasArgs ) {
-                       if ( $input.attr( 'placeholder' ) !== text ) {
-                               $input.prop( 'placeholder', text );
-                               if ( $input.hasClass( 'placeholder' ) ) {
-                                       $input[ 0 ].value = text;
-                               }
-                       }
-               }
-       }
-
-       if ( isInputSupported && isTextareaSupported ) {
-
-               placeholder = prototype.placeholder = function ( text ) {
-                       var hasArgs = arguments.length;
-
-                       if ( hasArgs ) {
-                               changePlaceholder.call( this, text );
-                       }
-
-                       return this;
-               };
-
-               placeholder.input = placeholder.textarea = true;
-
-       } else {
-
-               placeholder = prototype.placeholder = function ( text ) {
-                       var $this = this,
-                               hasArgs = arguments.length;
-
-                       if ( hasArgs ) {
-                               changePlaceholder.call( this, text );
-                       }
-
-                       $this
-                               .filter( ( isInputSupported ? 'textarea' : ':input' ) + '[placeholder]' )
-                               .filter( function () {
-                                       return !$( this ).data( 'placeholder-enabled' );
-                               } )
-                               .on( {
-                                       'focus.placeholder drop.placeholder': clearPlaceholder,
-                                       'blur.placeholder': setPlaceholder
-                               } )
-                               .data( 'placeholder-enabled', true )
-                               .trigger( 'blur.placeholder' );
-                       return $this;
-               };
-
-               placeholder.input = isInputSupported;
-               placeholder.textarea = isTextareaSupported;
-
-               hooks = {
-                       get: function ( element ) {
-                               var $element = $( element ),
-                                       $passwordInput = $element.data( 'placeholder-password' );
-                               if ( $passwordInput ) {
-                                       return $passwordInput[ 0 ].value;
-                               }
-
-                               return $element.data( 'placeholder-enabled' ) && $element.hasClass( 'placeholder' ) ? '' : element.value;
-                       },
-                       set: function ( element, value ) {
-                               var $element = $( element ),
-                                       $passwordInput = $element.data( 'placeholder-password' );
-                               if ( $passwordInput ) {
-                                       $passwordInput[ 0 ].value = value;
-                                       return value;
-                               }
-
-                               if ( !$element.data( 'placeholder-enabled' ) ) {
-                                       element.value = value;
-                                       return value;
-                               }
-                               if ( !value ) {
-                                       element.value = value;
-                                       // Issue #56: Setting the placeholder causes problems if the element continues to have focus.
-                                       if ( element !== safeActiveElement() ) {
-                                               // We can't use `triggerHandler` here because of dummy text/password inputs :(
-                                               setPlaceholder.call( element );
-                                       }
-                               } else if ( $element.hasClass( 'placeholder' ) ) {
-                                       if ( !clearPlaceholder.call( element, true, value ) ) {
-                                               element.value = value;
-                                       }
-                               } else {
-                                       element.value = value;
-                               }
-                               // `set` can not return `undefined`; see http://jsapi.info/jquery/1.7.1/val#L2363
-                               return $element;
-                       }
-               };
-
-               if ( !isInputSupported ) {
-                       valHooks.input = hooks;
-                       propHooks.value = hooks;
-               }
-               if ( !isTextareaSupported ) {
-                       valHooks.textarea = hooks;
-                       propHooks.value = hooks;
+       placeholder = $.fn.placeholder = function ( text ) {
+               if ( arguments.length ) {
+                       this.prop( 'placeholder', text );
                }
+               return this;
+       };
 
-               $( function () {
-                       // Look for forms
-                       $( document ).delegate( 'form', 'submit.placeholder', function () {
-                               // Clear the placeholder values so they don't get submitted
-                               var $inputs = $( '.placeholder', this ).each( clearPlaceholder );
-                               setTimeout( function () {
-                                       $inputs.each( setPlaceholder );
-                               }, 10 );
-                       } );
-               } );
-
-               // Clear placeholder values upon page reload
-               $( window ).on( 'beforeunload.placeholder', function () {
-                       $( '.placeholder' ).each( function () {
-                               this.value = '';
-                       } );
-               } );
+       placeholder.input = placeholder.textarea = true;
 
-       }
 }( jQuery ) );
diff --git a/resources/src/jquery/jquery.qunit.completenessTest.js b/resources/src/jquery/jquery.qunit.completenessTest.js
deleted file mode 100644 (file)
index 0aaa4ff..0000000
+++ /dev/null
@@ -1,306 +0,0 @@
-/**
- * jQuery QUnit CompletenessTest 0.4
- *
- * Tests the completeness of test suites for object oriented javascript
- * libraries. Written to be used in environments with jQuery and QUnit.
- * Requires jQuery 1.7.2 or higher.
- *
- * Built for and tested with:
- * - Chrome 19
- * - Firefox 4
- * - Safari 5
- *
- * @author Timo Tijhof, 2011-2012
- */
-/* eslint-env qunit */
-( function ( mw, $ ) {
-       'use strict';
-
-       var util,
-               hasOwn = Object.prototype.hasOwnProperty,
-               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
-       // on jQuery itself as well.
-       util = {
-               keys: Object.keys || function ( object ) {
-                       var key, keys = [];
-                       for ( key in object ) {
-                               if ( hasOwn.call( object, key ) ) {
-                                       keys.push( key );
-                               }
-                       }
-                       return keys;
-               },
-               each: function ( object, callback ) {
-                       var name;
-                       for ( name in object ) {
-                               if ( callback.call( object[ name ], name, object[ name ] ) === false ) {
-                                       break;
-                               }
-                       }
-               },
-               // $.type and $.isEmptyObject are safe as is, they don't call
-               // other $.* methods. Still need to be derefenced into `util`
-               // since the CompletenessTest will overload them with spies.
-               type: $.type,
-               isEmptyObject: $.isEmptyObject
-       };
-
-       /**
-        * CompletenessTest
-        *
-        * @constructor
-        * @example
-        *  var myTester = new CompletenessTest( myLib );
-        * @param {Object} masterVariable The root variable that contains all object
-        *  members. CompletenessTest will recursively traverse objects and keep track
-        *  of all methods.
-        * @param {Function} [ignoreFn] Optionally pass a function to filter out certain
-        *  methods. Example: You may want to filter out instances of jQuery or some
-        *  other constructor. Otherwise "missingTests" will include all methods that
-        *  were not called from that instance.
-        */
-       function CompletenessTest( masterVariable, ignoreFn ) {
-               var warn,
-                       that = this;
-
-               // Keep track in these objects. Keyed by strings with the
-               // method names (ie. 'my.foo', 'my.bar', etc.) values are boolean true.
-               this.injectionTracker = {};
-               this.methodCallTracker = {};
-               this.missingTests = {};
-
-               this.ignoreFn = ignoreFn === undefined ? function () { return false; } : ignoreFn;
-
-               // Lazy limit in case something weird happends (like recurse (part of) ourself).
-               this.lazyLimit = 2000;
-               this.lazyCounter = 0;
-
-               // Bind begin and end to QUnit.
-               QUnit.begin( function () {
-                       // Suppress warnings (e.g. deprecation notices for accessing the properties)
-                       warn = mw.log.warn;
-                       mw.log.warn = $.noop;
-
-                       that.walkTheObject( masterVariable, null, masterVariable, [] );
-                       log( 'CompletenessTest/walkTheObject', that );
-
-                       // Restore warnings
-                       mw.log.warn = warn;
-                       warn = undefined;
-               } );
-
-               QUnit.done( function () {
-                       var toolbar, testResults, cntTotal, cntCalled, cntMissing;
-
-                       that.populateMissingTests();
-                       log( 'CompletenessTest/populateMissingTests', that );
-
-                       cntTotal = util.keys( that.injectionTracker ).length;
-                       cntCalled = util.keys( that.methodCallTracker ).length;
-                       cntMissing = util.keys( that.missingTests ).length;
-
-                       function makeTestResults( blob, title, style ) {
-                               var elOutputWrapper, elTitle, elContainer, elList, elFoot;
-
-                               elTitle = document.createElement( 'strong' );
-                               elTitle.textContent = title || 'Values';
-
-                               elList = document.createElement( 'ul' );
-                               util.each( blob, function ( key ) {
-                                       var elItem = document.createElement( 'li' );
-                                       elItem.textContent = key;
-                                       elList.appendChild( elItem );
-                               } );
-
-                               elFoot = document.createElement( 'p' );
-                               elFoot.innerHTML = '<em>&mdash; CompletenessTest</em>';
-
-                               elContainer = document.createElement( 'div' );
-                               elContainer.appendChild( elTitle );
-                               elContainer.appendChild( elList );
-                               elContainer.appendChild( elFoot );
-
-                               elOutputWrapper = document.getElementById( 'qunit-completenesstest' );
-                               if ( !elOutputWrapper ) {
-                                       elOutputWrapper = document.createElement( 'div' );
-                                       elOutputWrapper.id = 'qunit-completenesstest';
-                               }
-                               elOutputWrapper.appendChild( elContainer );
-
-                               util.each( style, function ( key, value ) {
-                                       elOutputWrapper.style[ key ] = value;
-                               } );
-                               return elOutputWrapper;
-                       }
-
-                       if ( cntMissing === 0 ) {
-                               // Good
-                               testResults = makeTestResults(
-                                       {},
-                                       'Detected calls to ' + cntCalled + '/' + cntTotal + ' methods. No missing tests!',
-                                       {
-                                               backgroundColor: '#D2E0E6',
-                                               color: '#366097',
-                                               paddingTop: '1em',
-                                               paddingRight: '1em',
-                                               paddingBottom: '1em',
-                                               paddingLeft: '1em'
-                                       }
-                               );
-                       } else {
-                               // Bad
-                               testResults = makeTestResults(
-                                       that.missingTests,
-                                       'Detected calls to ' + cntCalled + '/' + cntTotal + ' methods. ' + cntMissing + ' methods not covered:',
-                                       {
-                                               backgroundColor: '#EE5757',
-                                               color: 'black',
-                                               paddingTop: '1em',
-                                               paddingRight: '1em',
-                                               paddingBottom: '1em',
-                                               paddingLeft: '1em'
-                                       }
-                               );
-                       }
-
-                       toolbar = document.getElementById( 'qunit-testrunner-toolbar' );
-                       if ( toolbar ) {
-                               toolbar.insertBefore( testResults, toolbar.firstChild );
-                       }
-               } );
-
-               return this;
-       }
-
-       /* Public methods */
-       CompletenessTest.fn = CompletenessTest.prototype = {
-
-               /**
-                * CompletenessTest.fn.walkTheObject
-                *
-                * This function recursively walks through the given object, calling itself as it goes.
-                * Depending on the action it either injects our listener into the methods, or
-                * reads from our tracker and records which methods have not been called by the test suite.
-                *
-                * @param {Mixed} currObj The variable to check (initially an object,
-                *  further down it could be anything).
-                * @param {string|null} currName Name of the given object member (Initially this is null).
-                * @param {Object} masterVariable Throughout our interation, always keep track of the master/root.
-                *  Initially this is the same as currVar.
-                * @param {Array} parentPathArray Array of names that indicate our breadcrumb path starting at
-                *  masterVariable. Not including currName.
-                */
-               walkTheObject: function ( currObj, currName, masterVariable, parentPathArray ) {
-                       var key, currVal, type,
-                               ct = this,
-                               currPathArray = parentPathArray;
-
-                       if ( currName ) {
-                               currPathArray.push( currName );
-                               currVal = currObj[ currName ];
-                       } else {
-                               currName = '(root)';
-                               currVal = currObj;
-                       }
-
-                       type = util.type( currVal );
-
-                       // Hard ignores
-                       if ( this.ignoreFn( currVal, this, currPathArray ) ) {
-                               return;
-                       }
-
-                       // Handle the lazy limit
-                       this.lazyCounter++;
-                       if ( this.lazyCounter > this.lazyLimit ) {
-                               log( 'CompletenessTest.fn.walkTheObject> Limit reached: ' + this.lazyCounter, currPathArray );
-                               return;
-                       }
-
-                       // Functions
-                       if ( type === 'function' ) {
-                               // Don't put a spy in constructor functions as it messes with
-                               // instanceof etc.
-                               if ( !currVal.prototype || util.isEmptyObject( currVal.prototype ) ) {
-                                       this.injectionTracker[ currPathArray.join( '.' ) ] = true;
-                                       this.injectCheck( currObj, currName, function () {
-                                               ct.methodCallTracker[ currPathArray.join( '.' ) ] = true;
-                                       } );
-                               }
-                       }
-
-                       // Recursively. After all, this is the *completeness* test
-                       // This also traverses static properties and the prototype of a constructor
-                       if ( type === 'object' || type === 'function' ) {
-                               for ( key in currVal ) {
-                                       if ( hasOwn.call( currVal, key ) ) {
-                                               this.walkTheObject( currVal, key, masterVariable, currPathArray.slice() );
-                                       }
-                               }
-                       }
-               },
-
-               populateMissingTests: function () {
-                       var ct = this;
-                       util.each( ct.injectionTracker, function ( key ) {
-                               ct.hasTest( key );
-                       } );
-               },
-
-               /**
-                * CompletenessTest.fn.hasTest
-                *
-                * Checks if the given method name (ie. 'my.foo.bar')
-                * was called during the test suite (as far as the tracker knows).
-                * If not it adds it to missingTests.
-                *
-                * @param {string} fnName
-                * @return {boolean}
-                */
-               hasTest: function ( fnName ) {
-                       if ( !( fnName in this.methodCallTracker ) ) {
-                               this.missingTests[ fnName ] = true;
-                               return false;
-                       }
-                       return true;
-               },
-
-               /**
-                * CompletenessTest.fn.injectCheck
-                *
-                * Injects a function (such as a spy that updates methodCallTracker when
-                * it's called) inside another function.
-                *
-                * @param {Object} obj The object into which `injectFn` will be inserted
-                * @param {Array} key The key by which `injectFn` will be known in `obj`; if this already
-                *   exists, a wrapper will first call `injectFn` and then the original `obj[key]` function.
-                * @param {Function} injectFn The function to insert
-                */
-               injectCheck: function ( obj, key, injectFn ) {
-                       var spy,
-                               val = obj[ key ];
-
-                       spy = function () {
-                               injectFn();
-                               return val.apply( this, arguments );
-                       };
-
-                       // 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).
-                       spy.__proto__ = val;
-
-                       // Objects are by reference, members (unless objects) are not.
-                       obj[ key ] = spy;
-               }
-       };
-
-       /* Expose */
-       window.CompletenessTest = CompletenessTest;
-
-}( mediaWiki, jQuery ) );
index fdc8a26..75f1ba6 100644 (file)
@@ -96,7 +96,7 @@
  */
  // jscs:enable checkParamNames
 
-( function ( $ ) {
+( function ( $, mw ) {
 
        var hasOwn = Object.hasOwnProperty;
 
                                        context.data.prevText = val;
                                        // Try cache first
                                        if ( context.config.cache && hasOwn.call( cache, val ) ) {
-                                               if ( +new Date() - cache[ val ].timestamp < context.config.cacheMaxAge ) {
+                                               if ( mw.now() - cache[ val ].timestamp < context.config.cacheMaxAge ) {
                                                        context.data.$textbox.suggestions( 'suggestions', cache[ val ].suggestions );
                                                        if ( typeof context.config.update.after === 'function' ) {
                                                                context.config.update.after.call( context.data.$textbox, cache[ val ].metadata );
                                                                        cache[ val ] = {
                                                                                suggestions: suggestions,
                                                                                metadata: metadata,
-                                                                               timestamp: +new Date()
+                                                                               timestamp: mw.now()
                                                                        };
                                                                }
                                                        },
         * @mixins jQuery.plugin.suggestions
         */
 
-}( jQuery ) );
+}( jQuery, mediaWiki ) );
index 0dffd7d..2933827 100644 (file)
        ],
        "khmer": [
                "ក", "ខ", "គ", "ឃ", "ង", "ច", "ឆ", "ជ", "ឈ", "ញ", "ដ", "ឋ", "ឌ", "ឍ", "ណ", "ត", "ថ", "ទ", "ធ", "ន", "ប", "ផ", "ព", "ភ", "ម", "យ", "រ", "ល", "វ", "ស", "ហ", "ឡ", "អ", "ឣ", "ឤ", "ឥ", "ឦ", "ឧ", "ឨ", "ឩ", "ឪ", "ឫ", "ឬ", "ឭ", "ឮ", "ឯ", "ឰ", "ឱ", "ឲ", "ឳ", "្", "឴", "឵", "ា", "ិ", "ី", "ឹ", "ឺ", "ុ", "ូ", "ួ", "ើ", "ឿ", "ៀ", "េ", "ែ", "ៃ", "ោ", "ៅ", "ំ", "ះ", "ៈ", "៉", "៊", "់", "៌", "៍", "៎", "៏", "័", "៑", "៓", "៝", "ៜ", "០", "១", "២", "៣", "៤", "៥", "៦", "៧", "៨", "៩", "៛", "។", "៕", "៖", "ៗ", "៘", "៙", "៚", "៰", "៱", "៲", "៳", "៴", "៵", "៶", "៷", "៸", "៹", "᧠", "᧡", "᧢", "᧣", "᧤", "᧥", "᧦", "᧧", "᧨", "᧩", "᧪", "᧫", "᧬", "᧭", "᧮", "᧯", "᧰", "᧱", "᧲", "᧳", "᧴", "᧵", "᧶", "᧷", "᧸", "᧹", "᧺", "᧻", "᧼", "᧽", "᧾", "᧿"
+       ],
+       "canadianaboriginal": [
+               "ᐁ", "ᐂ", "ᐃ", "ᐄ", "ᐅ", "ᐆ", "ᐇ", "ᐈ", "ᐉ", "ᐊ", "ᐋ", "ᐌ", "ᐍ", "ᐎ", "ᐏ", "ᐐ",
+               "ᐑ", "ᐒ", "ᐓ", "ᐔ", "ᐕ", "ᐖ", "ᐗ", "ᐘ", "ᐙ", "ᐚ", "ᐛ", "ᐜ", "ᐝ", "ᐞ", "ᐟ", "ᐠ",
+               "ᐡ", "ᐢ", "ᐣ", "ᐤ", "ᐥ", "ᐦ", "ᐧ", "ᐨ", "ᐩ", "ᐪ", "ᐫ", "ᐬ", "ᐭ", "ᐮ", "ᐯ", "ᐰ",
+               "ᐱ", "ᐲ", "ᐳ", "ᐴ", "ᐵ", "ᐶ", "ᐷ", "ᐸ", "ᐹ", "ᐺ", "ᐻ", "ᐼ", "ᐽ", "ᐾ", "ᐿ", "ᑀ",
+               "ᑁ", "ᑂ", "ᑃ", "ᑄ", "ᑅ", "ᑆ", "ᑇ", "ᑈ", "ᑉ", "ᑊ", "ᑋ", "ᑌ", "ᑍ", "ᑎ", "ᑏ", "ᑐ",
+               "ᑑ", "ᑒ", "ᑓ", "ᑔ", "ᑕ", "ᑖ", "ᑗ", "ᑘ", "ᑙ", "ᑚ", "ᑛ", "ᑜ", "ᑝ", "ᑞ", "ᑟ", "ᑠ",
+               "ᑡ", "ᑢ", "ᑣ", "ᑤ", "ᑥ", "ᑦ", "ᑧ", "ᑨ", "ᑩ", "ᑪ", "ᑫ", "ᑬ", "ᑭ", "ᑮ", "ᑯ", "ᑰ",
+               "ᑱ", "ᑲ", "ᑳ", "ᑴ", "ᑵ", "ᑶ", "ᑷ", "ᑸ", "ᑹ", "ᑺ", "ᑻ", "ᑼ", "ᑽ", "ᑾ", "ᑿ", "ᒀ",
+               "ᒁ", "ᒂ", "ᒃ", "ᒄ", "ᒅ", "ᒆ", "ᒇ", "ᒈ", "ᒉ", "ᒊ", "ᒋ", "ᒌ", "ᒍ", "ᒎ", "ᒏ", "ᒐ",
+               "ᒑ", "ᒒ", "ᒓ", "ᒔ", "ᒕ", "ᒖ", "ᒗ", "ᒘ", "ᒙ", "ᒚ", "ᒛ", "ᒜ", "ᒝ", "ᒞ", "ᒟ", "ᒠ",
+               "ᒡ", "ᒢ", "ᒣ", "ᒤ", "ᒥ", "ᒦ", "ᒧ", "ᒨ", "ᒩ", "ᒪ", "ᒫ", "ᒬ", "ᒭ", "ᒮ", "ᒯ", "ᒰ",
+               "ᒱ", "ᒲ", "ᒳ", "ᒴ", "ᒵ", "ᒶ", "ᒷ", "ᒸ", "ᒹ", "ᒺ", "ᒻ", "ᒼ", "ᒽ", "ᒾ", "ᒿ", "ᓀ",
+               "ᓁ", "ᓂ", "ᓃ", "ᓄ", "ᓅ", "ᓆ", "ᓇ", "ᓈ", "ᓉ", "ᓊ", "ᓋ", "ᓌ", "ᓍ", "ᓎ", "ᓏ", "ᓐ",
+               "ᓑ", "ᓒ", "ᓓ", "ᓔ", "ᓕ", "ᓖ", "ᓗ", "ᓘ", "ᓙ", "ᓚ", "ᓛ", "ᓜ", "ᓝ", "ᓞ", "ᓟ", "ᓠ",
+               "ᓡ", "ᓢ", "ᓣ", "ᓤ", "ᓥ", "ᓦ", "ᓧ", "ᓨ", "ᓩ", "ᓪ", "ᓫ", "ᓬ", "ᓭ", "ᓮ", "ᓯ", "ᓰ",
+               "ᓱ", "ᓲ", "ᓳ", "ᓴ", "ᓵ", "ᓶ", "ᓷ", "ᓸ", "ᓹ", "ᓺ", "ᓻ", "ᓼ", "ᓽ", "ᓾ", "ᓿ", "ᔀ",
+               "ᔁ", "ᔂ", "ᔃ", "ᔄ", "ᔅ", "ᔆ", "ᔇ", "ᔈ", "ᔉ", "ᔊ", "ᔋ", "ᔌ", "ᔍ", "ᔎ", "ᔏ", "ᔐ",
+               "ᔑ", "ᔒ", "ᔓ", "ᔔ", "ᔕ", "ᔖ", "ᔗ", "ᔘ", "ᔙ", "ᔚ", "ᔛ", "ᔜ", "ᔝ", "ᔞ", "ᔟ", "ᔠ",
+               "ᔡ", "ᔢ", "ᔣ", "ᔤ", "ᔥ", "ᔦ", "ᔧ", "ᔨ", "ᔩ", "ᔪ", "ᔫ", "ᔬ", "ᔭ", "ᔮ", "ᔯ", "ᔰ",
+               "ᔱ", "ᔲ", "ᔳ", "ᔴ", "ᔵ", "ᔶ", "ᔷ", "ᔸ", "ᔹ", "ᔺ", "ᔻ", "ᔼ", "ᔽ", "ᔾ", "ᔿ", "ᕀ",
+               "ᕁ", "ᕂ", "ᕃ", "ᕄ", "ᕅ", "ᕆ", "ᕇ", "ᕈ", "ᕉ", "ᕊ", "ᕋ", "ᕌ", "ᕍ", "ᕎ", "ᕏ", "ᕐ",
+               "ᕑ", "ᕒ", "ᕓ", "ᕔ", "ᕕ", "ᕖ", "ᕗ", "ᕘ", "ᕙ", "ᕚ", "ᕛ", "ᕜ", "ᕝ", "ᕞ", "ᕟ", "ᕠ",
+               "ᕡ", "ᕢ", "ᕣ", "ᕤ", "ᕥ", "ᕦ", "ᕧ", "ᕨ", "ᕩ", "ᕪ", "ᕫ", "ᕬ", "ᕭ", "ᕮ", "ᕯ", "ᕰ",
+               "ᕱ", "ᕲ", "ᕳ", "ᕴ", "ᕵ", "ᕶ", "ᕷ", "ᕸ", "ᕹ", "ᕺ", "ᕻ", "ᕼ", "ᕽ", "ᕾ", "ᕿ", "ᖀ",
+               "ᖁ", "ᖂ", "ᖃ", "ᖄ", "ᖅ", "ᖆ", "ᖇ", "ᖈ", "ᖉ", "ᖊ", "ᖋ", "ᖌ", "ᖍ", "ᖎ", "ᖏ", "ᖐ",
+               "ᖑ", "ᖒ", "ᖓ", "ᖔ", "ᖕ", "ᖖ", "ᖗ", "ᖘ", "ᖙ", "ᖚ", "ᖛ", "ᖜ", "ᖝ", "ᖞ", "ᖟ", "ᖠ",
+               "ᖡ", "ᖢ", "ᖣ", "ᖤ", "ᖥ", "ᖦ", "ᖧ", "ᖨ", "ᖩ", "ᖪ", "ᖫ", "ᖬ", "ᖭ", "ᖮ", "ᖯ", "ᖰ",
+               "ᖱ", "ᖲ", "ᖳ", "ᖴ", "ᖵ", "ᖶ", "ᖷ", "ᖸ", "ᖹ", "ᖺ", "ᖻ", "ᖼ", "ᖽ", "ᖾ", "ᖿ", "ᗀ",
+               "ᗁ", "ᗂ", "ᗃ", "ᗄ", "ᗅ", "ᗆ", "ᗇ", "ᗈ", "ᗉ", "ᗊ", "ᗋ", "ᗌ", "ᗍ", "ᗎ", "ᗏ", "ᗐ",
+               "ᗑ", "ᗒ", "ᗓ", "ᗔ", "ᗕ", "ᗖ", "ᗗ", "ᗘ", "ᗙ", "ᗚ", "ᗛ", "ᗜ", "ᗝ", "ᗞ", "ᗟ", "ᗠ",
+               "ᗡ", "ᗢ", "ᗣ", "ᗤ", "ᗥ", "ᗦ", "ᗧ", "ᗨ", "ᗩ", "ᗪ", "ᗫ", "ᗬ", "ᗭ", "ᗮ", "ᗯ", "ᗰ",
+               "ᗱ", "ᗲ", "ᗳ", "ᗴ", "ᗵ", "ᗶ", "ᗷ", "ᗸ", "ᗹ", "ᗺ", "ᗻ", "ᗼ", "ᗽ", "ᗾ", "ᗿ", "ᘀ",
+               "ᘁ", "ᘂ", "ᘃ", "ᘄ", "ᘅ", "ᘆ", "ᘇ", "ᘈ", "ᘉ", "ᘊ", "ᘋ", "ᘌ", "ᘍ", "ᘎ", "ᘏ", "ᘐ",
+               "ᘑ", "ᘒ", "ᘓ", "ᘔ", "ᘕ", "ᘖ", "ᘗ", "ᘘ", "ᘙ", "ᘚ", "ᘛ", "ᘜ", "ᘝ", "ᘞ", "ᘟ", "ᘠ",
+               "ᘡ", "ᘢ", "ᘣ", "ᘤ", "ᘥ", "ᘦ", "ᘧ", "ᘨ", "ᘩ", "ᘪ", "ᘫ", "ᘬ", "ᘭ", "ᘮ", "ᘯ", "ᘰ",
+               "ᘱ", "ᘲ", "ᘳ", "ᘴ", "ᘵ", "ᘶ", "ᘷ", "ᘸ", "ᘹ", "ᘺ", "ᘻ", "ᘼ", "ᘽ", "ᘾ", "ᘿ", "ᙀ",
+               "ᙁ", "ᙂ", "ᙃ", "ᙄ", "ᙅ", "ᙆ", "ᙇ", "ᙈ", "ᙉ", "ᙊ", "ᙋ", "ᙌ", "ᙍ", "ᙎ", "ᙏ", "ᙐ",
+               "ᙑ", "ᙒ", "ᙓ", "ᙔ", "ᙕ", "ᙖ", "ᙗ", "ᙘ", "ᙙ", "ᙚ", "ᙛ", "ᙜ", "ᙝ", "ᙞ", "ᙟ", "ᙠ",
+               "ᙡ", "ᙢ", "ᙣ", "ᙤ", "ᙥ", "ᙦ", "ᙧ", "ᙨ", "ᙩ", "ᙪ", "ᙫ", "ᙬ", "᙭", "᙮", "ᙯ", "ᙰ",
+               "ᙱ", "ᙲ", "ᙳ", "ᙴ", "ᙵ", "ᙶ"
        ]
 }
index 7c4dbb1..7b2d711 100644 (file)
@@ -459,4 +459,4 @@ html > body.rtl .mw-body ul#filetoc {
        display: block;
 }
 
-/* RTL specific CSS ends here **/
+/** RTL specific CSS ends here **/
index ff0c0e3..8d7a2a9 100644 (file)
@@ -322,6 +322,21 @@ a.new {
        color: #ba0000;
 }
 
+/* self links */
+a.mw-selflink {
+       color: inherit;
+       font-weight: bold;
+       text-decoration: inherit;
+}
+a.mw-selflink:hover {
+       cursor: inherit;
+       text-decoration: inherit;
+}
+a.mw-selflink:active,
+a.mw-selflink:visited {
+       color: inherit;
+}
+
 /* Plainlinks - this can be used to switch
  * off special external link styling */
 .plainlinks a.external {
index b3ed88c..67460ad 100644 (file)
@@ -10,7 +10,7 @@
  * - Add mw.libs.jpegmeta wrapper.
  */
 
-( function () {
+( function ( mw ) {
        /*
        Copyright (c) 2009 Ben Leslie
        
                return new JpegMeta.JpegFile( fileReaderResult, fileName );
        };
 
-}() );
+}( mediaWiki ) );
index 22323e8..3ec544c 100644 (file)
         * @cfg {boolean} [active] Group is active
         * @cfg {boolean} [fullCoverage] This filters in this group collectively cover all results
         * @cfg {Object} [conflicts] Defines the conflicts for this filter group
+        * @cfg {Object} [whatsThis] Defines the messages that should appear for the 'what's this' popup
+        * @cfg {string} [whatsThis.header] The header of the whatsThis popup message
+        * @cfg {string} [whatsThis.body] The body of the whatsThis popup message
+        * @cfg {string} [whatsThis.url] The url for the link in the whatsThis popup message
+        * @cfg {string} [whatsThis.linkMessage] The text for the link in the whatsThis popup message
         */
        mw.rcfilters.dm.FilterGroup = function MwRcfiltersDmFilterGroup( name, config ) {
                config = config || {};
@@ -30,6 +35,8 @@
                this.active = !!config.active;
                this.fullCoverage = !!config.fullCoverage;
 
+               this.whatsThis = config.whatsThis || {};
+
                this.conflicts = config.conflicts || {};
 
                this.aggregate( { update: 'filterItemUpdate' } );
                return this.name;
        };
 
+       /**
+        * Get the messags defining the 'whats this' popup for this group
+        *
+        * @return {Object} What's this messages
+        */
+       mw.rcfilters.dm.FilterGroup.prototype.getWhatsThis = function () {
+               return this.whatsThis;
+       };
+
+       /**
+        * Check whether this group has a 'what's this' message
+        *
+        * @return {boolean} This group has a what's this message
+        */
+       mw.rcfilters.dm.FilterGroup.prototype.hasWhatsThis = function () {
+               return !!this.whatsThis.body;
+       };
+
        /**
         * Get the conflicts associated with the entire group.
         * Conflict object is set up by filter name keys and conflict
                );
        };
 
+       /**
+        * Get the parameter representation from this group
+        *
+        * @return {Object} Parameter representation
+        */
+       mw.rcfilters.dm.FilterGroup.prototype.getParamRepresentation = function () {
+               var i, values,
+                       result = {},
+                       filterItems = this.getItems();
+
+               if ( this.getType() === 'send_unselected_if_any' ) {
+                       // First, check if any of the items are selected at all.
+                       // If none is selected, we're treating it as if they are
+                       // all false
+
+                       // Go over the items and define the correct values
+                       for ( i = 0; i < filterItems.length; i++ ) {
+                               result[ filterItems[ i ].getParamName() ] = this.areAnySelected() ?
+                                       Number( !filterItems[ i ].isSelected() ) : 0;
+                       }
+
+               } else if ( this.getType() === 'string_options' ) {
+                       values = [];
+                       for ( i = 0; i < filterItems.length; i++ ) {
+                               if ( filterItems[ i ].isSelected() ) {
+                                       values.push( filterItems[ i ].getParamName() );
+                               }
+                       }
+
+                       result[ this.getName() ] = ( values.length === filterItems.length ) ?
+                               'all' : values.join( this.getSeparator() );
+               }
+
+               return result;
+       };
+
        /**
         * Get group type
         *
                return this.type;
        };
 
+       /**
+        * Get the prefix used for the filter names inside this group
+        *
+        * @return {string} Group prefix
+        */
+       mw.rcfilters.dm.FilterGroup.prototype.getNamePrefix = function () {
+               return this.getName() + '__';
+       };
+
        /**
         * Get group's title
         *
index f162528..221d2a5 100644 (file)
@@ -5,7 +5,7 @@
         * @mixins OO.EventEmitter
         *
         * @constructor
-        * @param {string} name Filter name
+        * @param {string} param Filter param name
         * @param {mw.rcfilters.dm.FilterGroup} groupModel Filter group model
         * @param {Object} config Configuration object
         * @cfg {string} [group] The group this item belongs to
         * @cfg {Object} [conflicts] Defines the conflicts for this filter
         * @cfg {string} [cssClass] The class identifying the results that match this filter
         */
-       mw.rcfilters.dm.FilterItem = function MwRcfiltersDmFilterItem( name, groupModel, config ) {
+       mw.rcfilters.dm.FilterItem = function MwRcfiltersDmFilterItem( param, groupModel, config ) {
                config = config || {};
 
                // Mixin constructor
                OO.EventEmitter.call( this );
 
-               this.name = name;
+               this.param = param;
                this.groupModel = groupModel;
+               this.name = this.groupModel.getNamePrefix() + param;
 
                this.label = config.label || this.name;
                this.description = config.description;
                return this.name;
        };
 
+       /**
+        * Get the param name or value of this filter
+        *
+        * @return {string} Filter param name
+        */
+       mw.rcfilters.dm.FilterItem.prototype.getParamName = function () {
+               return this.param;
+       };
+
+       /**
+        * Get the message for the display area for the currently active conflict
+        *
+        * @return {string} Conflict result message key
+        */
+       mw.rcfilters.dm.FilterItem.prototype.getCurrentConflictResultMessage = function () {
+               var details = {};
+
+               // First look in filter's own conflicts
+               details = this.getConflictDetails( this.getOwnConflicts(), 'globalDescription' );
+               if ( !details.message ) {
+                       // Fall back onto conflicts in the group
+                       details = this.getConflictDetails( this.getGroupModel().getConflicts(), 'globalDescription' );
+               }
+
+               return details.message;
+       };
+
+       /**
+        * Get the details of the active conflict on this filter
+        *
+        * @param {Object} conflicts Conflicts to examine
+        * @param {string} [key='contextDescription'] Message key
+        * @return {Object} Object with conflict message and conflict items
+        * @return {string} return.message Conflict message
+        * @return {string[]} return.names Conflicting item labels
+        */
+       mw.rcfilters.dm.FilterItem.prototype.getConflictDetails = function ( conflicts, key ) {
+               var group,
+                       conflictMessage = '',
+                       itemLabels = [];
+
+               key = key || 'contextDescription';
+
+               $.each( conflicts, function ( filterName, conflict ) {
+                       if ( !conflict.item.isSelected() ) {
+                               return;
+                       }
+
+                       if ( !conflictMessage ) {
+                               conflictMessage = conflict[ key ];
+                               group = conflict.group;
+                       }
+
+                       if ( group === conflict.group ) {
+                               itemLabels.push( mw.msg( 'quotation-marks', conflict.item.getLabel() ) );
+                       }
+               } );
+
+               return {
+                       message: conflictMessage,
+                       names: itemLabels
+               };
+
+       };
+
+       /**
+        * Get the message representing the state of this model.
+        *
+        * @return {string} State message
+        */
+       mw.rcfilters.dm.FilterItem.prototype.getStateMessage = function () {
+               var messageKey, details, superset,
+                       affectingItems = [];
+
+               if ( this.isSelected() ) {
+                       if ( this.isConflicted() ) {
+                               // First look in filter's own conflicts
+                               details = this.getConflictDetails( this.getOwnConflicts() );
+                               if ( !details.message ) {
+                                       // Fall back onto conflicts in the group
+                                       details = this.getConflictDetails( this.getGroupModel().getConflicts() );
+                               }
+
+                               messageKey = details.message;
+                               affectingItems = details.names;
+                       } else if ( this.isIncluded() && !this.isHighlighted() ) {
+                               // We only show the 'no effect' full-coverage message
+                               // if the item is also not highlighted. See T161273
+                               superset = this.getSuperset();
+                               // For this message we need to collect the affecting superset
+                               affectingItems = this.getGroupModel().getSelectedItems( this )
+                                       .filter( function ( item ) {
+                                               return superset.indexOf( item.getName() ) !== -1;
+                                       } )
+                                       .map( function ( item ) {
+                                               return mw.msg( 'quotation-marks', item.getLabel() );
+                                       } );
+
+                               messageKey = 'rcfilters-state-message-subset';
+                       } else if ( this.isFullyCovered() && !this.isHighlighted() ) {
+                               affectingItems = this.getGroupModel().getSelectedItems( this )
+                                       .map( function ( item ) {
+                                               return mw.msg( 'quotation-marks', item.getLabel() );
+                                       } );
+
+                               messageKey = 'rcfilters-state-message-fullcoverage';
+                       }
+               }
+
+               if ( messageKey ) {
+                       // Build message
+                       return mw.msg(
+                               messageKey,
+                               mw.language.listToText( affectingItems ),
+                               affectingItems.length
+                       );
+               }
+
+               // Display description
+               return this.getDescription();
+       };
+
        /**
         * Get the model of the group this filter belongs to
         *
        };
 
        /**
-        * Get filter conflicts
+        * Get all conflicts associated with this filter or its group
         *
         * Conflict object is set up by filter name keys and conflict
         * definition. For example:
         *              {
         *                      filterName: {
         *                              filter: filterName,
-        *                              group: group1
+        *                              group: group1,
+        *                              label: itemLabel,
+        *                              item: itemModel
         *                      }
         *                      filterName2: {
         *                              filter: filterName2,
         *                              group: group2
+        *                              label: itemLabel2,
+        *                              item: itemModel2
         *                      }
         *              }
         *
                return $.extend( {}, this.conflicts, this.getGroupModel().getConflicts() );
        };
 
+       /**
+        * Get the conflicts associated with this filter
+        *
+        * @return {Object} Filter conflicts
+        */
+       mw.rcfilters.dm.FilterItem.prototype.getOwnConflicts = function () {
+               return this.conflicts;
+       };
+
        /**
         * Set conflicts for this filter. See #getConflicts for the expected
         * structure of the definition.
                this.superset = superset || [];
        };
 
+       /**
+        * Set filter subset
+        *
+        * @param {string[]} subset Filter subset
+        */
+       mw.rcfilters.dm.FilterItem.prototype.setSubset = function ( subset ) {
+               this.subset = subset || [];
+       };
+
        /**
         * Check whether a filter exists in the subset list for this filter
         *
index 36fc4a7..8fd1553 100644 (file)
@@ -16,6 +16,7 @@
                this.defaultParams = {};
                this.defaultFiltersEmpty = null;
                this.highlightEnabled = false;
+               this.parameterMap = {};
 
                // Events
                this.aggregate( { update: 'filterItemUpdate' } );
                } );
        };
 
+       /**
+        * Get whether the model has any conflict in its items
+        *
+        * @return {boolean} There is a conflict
+        */
+       mw.rcfilters.dm.FiltersViewModel.prototype.hasConflict = function () {
+               return this.getItems().some( function ( filterItem ) {
+                       return filterItem.isSelected() && filterItem.isConflicted();
+               } );
+       };
+
+       /**
+        * Get the first item with a current conflict
+        *
+        * @return {mw.rcfilters.dm.FilterItem} Conflicted item
+        */
+       mw.rcfilters.dm.FiltersViewModel.prototype.getFirstConflictedItem = function () {
+               var conflictedItem;
+
+               $.each( this.getItems(), function ( index, filterItem ) {
+                       if ( filterItem.isSelected() && filterItem.isConflicted() ) {
+                               conflictedItem = filterItem;
+                               return false;
+                       }
+               } );
+
+               return conflictedItem;
+       };
+
        /**
         * Set filters and preserve a group relationship based on
         * the definition given by an object
         * @param {Array} filters Filter group definition
         */
        mw.rcfilters.dm.FiltersViewModel.prototype.initializeFilters = function ( filters ) {
-               var i, filterItem, selectedFilterNames, filterConflictResult, groupConflictResult,
+               var i, filterItem, filterConflictResult, groupConflictResult, subsetNames,
                        model = this,
                        items = [],
                        supersetMap = {},
                        expandConflictDefinitions = function ( obj ) {
                                var result = {};
 
-                               $.each( obj, function ( group, conflicts ) {
-                                       var adjustedConflicts = {};
+                               $.each( obj, function ( key, conflicts ) {
+                                       var filterName,
+                                               adjustedConflicts = {};
+
                                        conflicts.forEach( function ( conflict ) {
+                                               var filter;
+
                                                if ( conflict.filter ) {
-                                                       adjustedConflicts[ conflict.filter ] = conflict;
+                                                       filterName = model.groups[ conflict.group ].getNamePrefix() + conflict.filter;
+                                                       filter = model.getItemByName( filterName );
+
+                                                       // Rename
+                                                       adjustedConflicts[ filterName ] = $.extend(
+                                                               {},
+                                                               conflict,
+                                                               {
+                                                                       filter: filterName,
+                                                                       item: filter
+                                                               }
+                                                       );
                                                } else {
                                                        // This conflict is for an entire group. Split it up to
                                                        // represent each filter
                                                        // Get the relevant group items
                                                        model.groups[ conflict.group ].getItems().forEach( function ( groupItem ) {
                                                                // Rebuild the conflict
-                                                               adjustedConflicts[ groupItem.getName() ] = $.extend( {}, conflict, { filter: groupItem.getName() } );
+                                                               adjustedConflicts[ groupItem.getName() ] = $.extend(
+                                                                       {},
+                                                                       conflict,
+                                                                       {
+                                                                               filter: groupItem.getName(),
+                                                                               item: groupItem
+                                                                       }
+                                                               );
                                                        } );
                                                }
                                        } );
 
-                                       result[ group ] = adjustedConflicts;
+                                       result[ key ] = adjustedConflicts;
                                } );
 
                                return result;
                                        type: data.type,
                                        title: mw.msg( data.title ),
                                        separator: data.separator,
-                                       fullCoverage: !!data.fullCoverage
+                                       fullCoverage: !!data.fullCoverage,
+                                       whatsThis: {
+                                               body: data.whatsThisBody,
+                                               header: data.whatsThisHeader,
+                                               linkText: data.whatsThisLinkText,
+                                               url: data.whatsThisUrl
+                                       }
                                } );
                        }
 
                                groupConflictMap[ group ] = data.conflicts;
                        }
 
-                       selectedFilterNames = [];
                        for ( i = 0; i < data.filters.length; i++ ) {
                                data.filters[ i ].subset = data.filters[ i ].subset || [];
                                data.filters[ i ].subset = data.filters[ i ].subset.map( function ( el ) {
                                        group: group,
                                        label: mw.msg( data.filters[ i ].label ),
                                        description: mw.msg( data.filters[ i ].description ),
-                                       subset: data.filters[ i ].subset,
                                        cssClass: data.filters[ i ].cssClass
                                } );
 
-                               // For convenience, we should store each filter's "supersets" -- these are
-                               // the filters that have that item in their subset list. This will just
-                               // make it easier to go through whether the item has any other items
-                               // that affect it (and are selected) at any given time
                                if ( data.filters[ i ].subset ) {
+                                       subsetNames = [];
                                        data.filters[ i ].subset.forEach( function ( subsetFilterName ) { // eslint-disable-line no-loop-func
-                                               supersetMap[ subsetFilterName ] = supersetMap[ subsetFilterName ] || [];
+                                               var subsetName = model.groups[ group ].getNamePrefix() + subsetFilterName;
+                                               // For convenience, we should store each filter's "supersets" -- these are
+                                               // the filters that have that item in their subset list. This will just
+                                               // make it easier to go through whether the item has any other items
+                                               // that affect it (and are selected) at any given time
+                                               supersetMap[ subsetName ] = supersetMap[ subsetName ] || [];
                                                addArrayElementsUnique(
-                                                       supersetMap[ subsetFilterName ],
+                                                       supersetMap[ subsetName ],
                                                        filterItem.getName()
                                                );
+
+                                               // Translate subset param name to add the group name, so we
+                                               // get consistent naming. We know that subsets are only within
+                                               // the same group
+                                               subsetNames.push( subsetName );
                                        } );
+
+                                       // Set translated subset
+                                       filterItem.setSubset( subsetNames );
                                }
 
                                // Store conflicts
                                if ( data.filters[ i ].conflicts ) {
-                                       filterConflictMap[ data.filters[ i ].name ] = data.filters[ i ].conflicts;
+                                       filterConflictMap[ filterItem.getName() ] = data.filters[ i ].conflicts;
                                }
 
                                if ( data.type === 'send_unselected_if_any' ) {
                                        // Store the default parameter state
                                        // For this group type, parameter values are direct
                                        model.defaultParams[ data.filters[ i ].name ] = Number( !!data.filters[ i ].default );
-                               } else if (
-                                       data.type === 'string_options' &&
-                                       data.filters[ i ].default
-                               ) {
-                                       selectedFilterNames.push( data.filters[ i ].name );
                                }
 
                                model.groups[ group ].addItems( filterItem );
                                items.push( filterItem );
                        }
 
-                       if ( data.type === 'string_options' ) {
+                       if ( data.type === 'string_options' && data.default ) {
                                // Store the default parameter group state
                                // For this group, the parameter is group name and value is the names
                                // of selected items
-                               model.defaultParams[ group ] = model.sanitizeStringOptionGroup( group, selectedFilterNames ).join( model.groups[ group ].getSeparator() );
+                               model.defaultParams[ group ] = model.sanitizeStringOptionGroup(
+                                       group,
+                                       data.default.split( model.groups[ group ].getSeparator() )
+                               ).join( model.groups[ group ].getSeparator() );
                        }
                } );
 
+               // Add items to the model
+               this.addItems( items );
+
                // Expand conflicts
                groupConflictResult = expandConflictDefinitions( groupConflictMap );
                filterConflictResult = expandConflictDefinitions( filterConflictMap );
                        }
                } );
 
-               // Add items to the model
-               this.addItems( items );
+               // Create a map between known parameters and their models
+               $.each( this.groups, function ( group, groupModel ) {
+                       if ( groupModel.getType() === 'send_unselected_if_any' ) {
+                               // Individual filters
+                               groupModel.getItems().forEach( function ( filterItem ) {
+                                       model.parameterMap[ filterItem.getParamName() ] = filterItem;
+                               } );
+                       } else if ( groupModel.getType() === 'string_options' ) {
+                               // Group
+                               model.parameterMap[ groupModel.getName() ] = groupModel;
+                       }
+               } );
 
                this.emit( 'initialize' );
        };
         * @return {Object} Parameter state object
         */
        mw.rcfilters.dm.FiltersViewModel.prototype.getParametersFromFilters = function ( filterGroups ) {
-               var i, filterItems, anySelected, values,
-                       result = {},
+               var result = {},
                        groupItems = filterGroups || this.getFilterGroups();
 
                $.each( groupItems, function ( group, model ) {
-                       filterItems = model.getItems();
-
-                       if ( model.getType() === 'send_unselected_if_any' ) {
-                               // First, check if any of the items are selected at all.
-                               // If none is selected, we're treating it as if they are
-                               // all false
-                               anySelected = filterItems.some( function ( filterItem ) {
-                                       return filterItem.isSelected();
-                               } );
-
-                               // Go over the items and define the correct values
-                               for ( i = 0; i < filterItems.length; i++ ) {
-                                       result[ filterItems[ i ].getName() ] = anySelected ?
-                                               Number( !filterItems[ i ].isSelected() ) : 0;
-                               }
-                       } else if ( model.getType() === 'string_options' ) {
-                               values = [];
-                               for ( i = 0; i < filterItems.length; i++ ) {
-                                       if ( filterItems[ i ].isSelected() ) {
-                                               values.push( filterItems[ i ].getName() );
-                                       }
-                               }
-
-                               if ( values.length === filterItems.length ) {
-                                       result[ group ] = 'all';
-                               } else {
-                                       result[ group ] = values.join( model.getSeparator() );
-                               }
-                       }
+                       $.extend( result, model.getParamRepresentation() );
                } );
 
                return result;
        mw.rcfilters.dm.FiltersViewModel.prototype.sanitizeStringOptionGroup = function( groupName, valueArray ) {
                var result = [],
                        validNames = this.getGroupFilters( groupName ).map( function ( filterItem ) {
-                               return filterItem.getName();
+                               return filterItem.getParamName();
                        } );
 
                if ( valueArray.indexOf( 'all' ) > -1 ) {
         * @return {Object} Filter state object
         */
        mw.rcfilters.dm.FiltersViewModel.prototype.getFiltersFromParameters = function ( params ) {
-               var i, filterItem,
+               var i,
                        groupMap = {},
                        model = this,
                        base = this.getDefaultParams(),
 
                params = $.extend( {}, base, params );
 
+               // Go over the given parameters
                $.each( params, function ( paramName, paramValue ) {
-                       // Find the filter item
-                       filterItem = model.getItemByName( paramName );
-                       // Ignore if no filter item exists
-                       if ( filterItem ) {
-                               groupMap[ filterItem.getGroupName() ] = groupMap[ filterItem.getGroupName() ] || {};
+                       var itemOrGroup = model.parameterMap[ paramName ];
 
+                       if ( itemOrGroup instanceof mw.rcfilters.dm.FilterItem ) {
                                // Mark the group if it has any items that are selected
-                               groupMap[ filterItem.getGroupName() ].hasSelected = (
-                                       groupMap[ filterItem.getGroupName() ].hasSelected ||
+                               groupMap[ itemOrGroup.getGroupName() ] = groupMap[ itemOrGroup.getGroupName() ] || {};
+                               groupMap[ itemOrGroup.getGroupName() ].hasSelected = (
+                                       groupMap[ itemOrGroup.getGroupName() ].hasSelected ||
                                        !!Number( paramValue )
                                );
 
-                               // Add the relevant filter into the group map
-                               groupMap[ filterItem.getGroupName() ].filters = groupMap[ filterItem.getGroupName() ].filters || [];
-                               groupMap[ filterItem.getGroupName() ].filters.push( filterItem );
-                       } else if ( model.groups.hasOwnProperty( paramName ) ) {
+                               // Add filters
+                               groupMap[ itemOrGroup.getGroupName() ].filters = groupMap[ itemOrGroup.getGroupName() ].filters || [];
+                               groupMap[ itemOrGroup.getGroupName() ].filters.push( itemOrGroup );
+                       } else if ( itemOrGroup instanceof mw.rcfilters.dm.FilterGroup ) {
+                               groupMap[ itemOrGroup.getName() ] = groupMap[ itemOrGroup.getName() ] || {};
                                // This parameter represents a group (values are the filters)
                                // this is equivalent to checking if the group is 'string_options'
-                               groupMap[ paramName ] = { filters: model.groups[ paramName ].getItems() };
+                               groupMap[ itemOrGroup.getName() ].filters = itemOrGroup.getItems();
                        }
                } );
 
                                for ( i = 0; i < allItemsInGroup.length; i++ ) {
                                        filterItem = allItemsInGroup[ i ];
 
-                                       result[ filterItem.getName() ] = data.hasSelected ?
+                                       result[ filterItem.getName() ] = groupMap[ filterItem.getGroupName() ].hasSelected ?
                                                // Flip the definition between the parameter
                                                // state and the filter state
                                                // This is what the 'toggleSelected' value of the filter is
-                                               !Number( params[ filterItem.getName() ] ) :
+                                               !Number( params[ filterItem.getParamName() ] ) :
                                                // Otherwise, there are no selected items in the
                                                // group, which means the state is false
                                                false;
                                }
                        } else if ( model.groups[ group ].getType() === 'string_options' ) {
-                               paramValues = model.sanitizeStringOptionGroup( group, params[ group ].split( model.groups[ group ].getSeparator() ) );
+                               paramValues = model.sanitizeStringOptionGroup(
+                                       group,
+                                       params[ group ].split(
+                                               model.groups[ group ].getSeparator()
+                                       )
+                               );
 
                                for ( i = 0; i < allItemsInGroup.length; i++ ) {
                                        filterItem = allItemsInGroup[ i ];
                                                        paramValues.length === model.groups[ group ].getItemCount()
                                                ) ?
                                                // All true (either because all values are written or the term 'all' is written)
-                                               // is the same as all filters set to false
-                                               false :
+                                               // is the same as all filters set to true
+                                               true :
                                                // Otherwise, the filter is selected only if it appears in the parameter values
-                                               paramValues.indexOf( filterItem.getName() ) > -1;
+                                               paramValues.indexOf( filterItem.getParamName() ) > -1;
                                }
                        }
                } );
+
                return result;
        };
 
         * @param {boolean} [isSelected] Filter selected state
         */
        mw.rcfilters.dm.FiltersViewModel.prototype.toggleFilterSelected = function ( name, isSelected ) {
-               this.getItemByName( name ).toggleSelected( isSelected );
+               var item = this.getItemByName( name );
+
+               if ( item ) {
+                       item.toggleSelected( isSelected );
+               }
        };
 
        /**
index f8008b6..669420c 100644 (file)
         * @param {Array} filterStructure Filter definition and structure for the model
         */
        mw.rcfilters.Controller.prototype.initialize = function ( filterStructure ) {
+               var $changesList = $( '.mw-changeslist' ).first().contents();
                // Initialize the model
                this.filtersModel.initializeFilters( filterStructure );
                this.updateStateBasedOnUrl();
+
+               // Update the changes list with the existing data
+               // so it gets processed
+               this.changesListModel.update(
+                       $changesList.length ? $changesList : 'NO_RESULTS',
+                       $( 'fieldset.rcoptions' ).first()
+               );
+
        };
 
        /**
         * Empty all selected filters
         */
        mw.rcfilters.Controller.prototype.emptyFilters = function () {
+               var highlightedFilterNames = this.filtersModel
+                       .getHighlightedItems()
+                       .map( function ( filterItem ) { return { name: filterItem.getName() }; } );
+
                this.filtersModel.emptyAllFilters();
                this.filtersModel.clearAllHighlightColors();
                // Check all filter interactions
                this.filtersModel.reassessFilterInteractions();
 
                this.updateChangesList();
+
+               if ( highlightedFilterNames ) {
+                       this.trackHighlight( 'clearAll', highlightedFilterNames );
+               }
        };
 
        /**
        mw.rcfilters.Controller.prototype.toggleFilterSelect = function ( filterName, isSelected ) {
                var filterItem = this.filtersModel.getItemByName( filterName );
 
+               if ( !filterItem ) {
+                       // If no filter was found, break
+                       return;
+               }
+
                isSelected = isSelected === undefined ? !filterItem.isSelected() : isSelected;
 
                if ( filterItem.isSelected() !== isSelected ) {
        mw.rcfilters.Controller.prototype.toggleHighlight = function () {
                this.filtersModel.toggleHighlight();
                this.updateURL();
+
+               if ( this.filtersModel.isHighlightEnabled() ) {
+                       mw.hook( 'RcFilters.highlight.enable' ).fire();
+               }
        };
 
        /**
        mw.rcfilters.Controller.prototype.setHighlightColor = function ( filterName, color ) {
                this.filtersModel.setHighlightColor( filterName, color );
                this.updateURL();
+               this.trackHighlight( 'set', { name: filterName, color: color } );
        };
 
        /**
        mw.rcfilters.Controller.prototype.clearHighlightColor = function ( filterName ) {
                this.filtersModel.clearHighlightColor( filterName );
                this.updateURL();
+               this.trackHighlight( 'clear', filterName );
        };
 
        /**
         * @param {string} filterName Name of the filter item
         */
        mw.rcfilters.Controller.prototype.clearFilter = function ( filterName ) {
-               var filterItem = this.filtersModel.getItemByName( filterName );
+               var filterItem = this.filtersModel.getItemByName( filterName ),
+                       isHighlighted = filterItem.isHighlighted();
 
-               if ( filterItem.isSelected() || filterItem.isHighlighted() ) {
+               if ( filterItem.isSelected() || isHighlighted ) {
                        this.filtersModel.clearHighlightColor( filterName );
                        this.filtersModel.toggleFilterSelected( filterName, false );
                        this.updateChangesList();
                        this.filtersModel.reassessFilterInteractions( filterItem );
                }
+
+               if ( isHighlighted ) {
+                       this.trackHighlight( 'clear', filterName );
+               }
        };
 
        /**
                        this.getUpdatedUri().toString()
                );
        };
+
+       /**
+        * Track usage of highlight feature
+        *
+        * @param {string} action
+        * @param {array|object|string} filters
+        */
+       mw.rcfilters.Controller.prototype.trackHighlight = function ( action, filters ) {
+               filters = typeof filters === 'string' ? { name: filters } : filters;
+               filters = !Array.isArray( filters ) ? [ filters ] : filters;
+               mw.track(
+                       'event.ChangesListHighlights',
+                       {
+                               action: action,
+                               filters: filters,
+                               userId: mw.user.getId()
+                       }
+               );
+       };
 }( mediaWiki, jQuery ) );
index 9fe0ec6..b16e84c 100644 (file)
@@ -3,7 +3,6 @@
 .mw-rcfilters-ui-capsuleItemWidget {
        background-color: #fff;
        border-color: #979797;
-       margin: 0 0.6em 0 0;
        color: #222;
 
        // Background and color of the capsule widget need a bit
diff --git a/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.CapsuleItemWidget.monobook.less b/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.CapsuleItemWidget.monobook.less
new file mode 100644 (file)
index 0000000..04e5efe
--- /dev/null
@@ -0,0 +1,9 @@
+.mw-rcfilters-ui-capsuleItemWidget {
+       .oo-ui-buttonElement {
+               // Override the vertical align for the close button
+               // for some unknown reason, this rule, in combination
+               // with the negative margin-top rule, pushes all the
+               // close buttons up above the capsule item.
+               vertical-align: baseline;
+       }
+}
index c18fe5e..402f0ad 100644 (file)
@@ -1,6 +1,17 @@
 @import 'mw.rcfilters.mixins';
 
 .mw-rcfilters-ui-changesListWrapperWidget {
+       &-results {
+               width: 35em;
+               margin: 5em auto;
+
+               &-noresult,
+               &-conflict {
+                       font-weight: bold;
+                       margin-bottom: 0.5em;
+               }
+       }
+
        &-highlighted {
                ul {
                        list-style: none;
index 83491ac..d774ad2 100644 (file)
@@ -3,16 +3,51 @@
 .mw-rcfilters-ui-filterGroupWidget {
        padding-bottom: 0.5em;
 
-       &-title {
-               // TODO: Unify colors with official design palette
+       &-header {
                background: #eaecf0;
                padding: 0.5em 0.75em;
-               color: #555a5d;
-               .box-sizing( border-box );
+
+               &-title {
+                       // TODO: Unify colors with official design palette
+                       color: #555a5d;
+                       .box-sizing( border-box );
+                       display: inline-block;
+               }
+       }
+
+       &-whatsThisButton {
+               display: inline-block;
+               margin-left: 1.5em;
+
+               &.oo-ui-buttonElement {
+                       vertical-align: text-bottom;
+
+                       & > .oo-ui-buttonElement-button {
+                               font-weight: normal;
+                       }
+               }
+
+               &-popup-content {
+                       padding: 1em;
+
+                       &-header {
+                               font-weight: bold;
+                               margin-bottom: 1em;
+                       }
+
+                       &-link {
+                               margin: 1em 0;
+
+                       }
+
+                       .oo-ui-buttonElement-frameless.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+                               margin-left: 0;
+                       }
+               }
        }
 
        &-active {
-               .mw-rcfilters-ui-filterGroupWidget-title {
+               .mw-rcfilters-ui-filterGroupWidget-header-title {
                        font-weight: bold;
                }
        }
index 0e38942..3d63831 100644 (file)
                        // Override margin-top and -bottom rules from FieldLayout
                        margin: 0 !important; /* stylelint-disable-line declaration-no-important */
                }
+
+               .oo-ui-checkboxInputWidget {
+                       // Workaround for IE11 rendering issues. T162098
+                       display: block;
+               }
        }
 
        &-highlightButton {
index ca19c22..b22abc6 100644 (file)
@@ -4,9 +4,7 @@
        direction: ltr;
 
        &-popup {
-               // We have to override OOUI's definition, which is set
-               // on the inline style of the popup
-               margin-top: 2em !important; /* stylelint-disable-line declaration-no-important */
+               margin-top: 1px;
                max-width: 650px;
 
                .oo-ui-popupWidget-body {
diff --git a/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.Overlay.monobook.less b/resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.Overlay.monobook.less
new file mode 100644 (file)
index 0000000..fae2b32
--- /dev/null
@@ -0,0 +1,3 @@
+.mw-rcfilters-ui-overlay {
+       font-size: 1.28em; /* 0.8em / x-small */
+}
index 1ef49e2..3060f25 100644 (file)
@@ -11,9 +11,9 @@
 
 // Result list circle indicators
 // Defined and used in mw.rcfilters.ui.ChangesListWrapperWidget.less
-@result-circle-margin: 0.1em;
+@result-circle-margin: 3px;
 @result-circle-general-margin: 0.5em;
 // In these small sizes, 'em' appears
 // squished and inconsistent.
 // Pixels are better for this use case:
-@result-circle-diameter: 5px;
+@result-circle-diameter: 6px;
index f28523a..20eff8b 100644 (file)
         * @cfg {jQuery} [$overlay] A jQuery object serving as overlay for popups
         */
        mw.rcfilters.ui.CapsuleItemWidget = function MwRcfiltersUiCapsuleItemWidget( controller, model, config ) {
-               var $popupContent = $( '<div>' )
-                               .addClass( 'mw-rcfilters-ui-capsuleItemWidget-popup-content' ),
-                       descLabelWidget = new OO.ui.LabelWidget();
-
                // Configuration initialization
                config = config || {};
 
                this.controller = controller;
                this.model = model;
+               this.popupLabel = new OO.ui.LabelWidget();
                this.$overlay = config.$overlay || this.$element;
                this.positioned = false;
                this.popupTimeoutShow = null;
                                padded: false,
                                align: 'center',
                                position: 'above',
-                               $content: $popupContent
-                                       .append( descLabelWidget.$element ),
+                               $content: $( '<div>' )
+                                       .addClass( 'mw-rcfilters-ui-capsuleItemWidget-popup-content' )
+                                       .append( this.popupLabel.$element ),
                                $floatableContainer: this.$element,
                                classes: [ 'mw-rcfilters-ui-capsuleItemWidget-popup' ]
                        }
                }, config ) );
 
-               // Set initial text for the popup - the description
-               descLabelWidget.setLabel( this.model.getDescription() );
-
                this.$highlight = $( '<div>' )
                        .addClass( 'mw-rcfilters-ui-capsuleItemWidget-highlight' );
 
                // Events
                this.model.connect( this, { update: 'onModelUpdate' } );
 
-               this.closeButton.$element.on( 'mousedown', this.onCloseButtonMouseDown.bind( this ) );
-
                // Initialization
                this.$overlay.append( this.popup.$element );
                this.$element
                        .prepend( this.$highlight )
                        .attr( 'aria-haspopup', 'true' )
                        .addClass( 'mw-rcfilters-ui-capsuleItemWidget' )
+                       .on( 'mousedown', this.onMouseDown.bind( this ) )
                        .on( 'mouseenter', this.onMouseEnter.bind( this ) )
                        .on( 'mouseleave', this.onMouseLeave.bind( this ) );
 
@@ -89,7 +83,7 @@
         *
         * @param {jQuery.Event} e Event
         */
-       mw.rcfilters.ui.CapsuleItemWidget.prototype.onCloseButtonMouseDown = function ( e ) {
+       mw.rcfilters.ui.CapsuleItemWidget.prototype.onMouseDown = function ( e ) {
                e.stopPropagation();
        };
 
                        )
                        .toggleClass(
                                'mw-rcfilters-ui-capsuleItemWidget-conflicted',
-                               this.model.isConflicted()
+                               this.model.isSelected() && this.model.isConflicted()
                        );
        };
 
         * Respond to mouse enter event
         */
        mw.rcfilters.ui.CapsuleItemWidget.prototype.onMouseEnter = function () {
-               if ( this.model.getDescription() ) {
+               var labelText = this.model.getStateMessage();
+
+               if ( labelText ) {
+                       this.popupLabel.setLabel( labelText );
+
                        if ( !this.positioned ) {
                                // Recalculate anchor position to be center of the capsule item
                                this.popup.$anchor.css( 'margin-left', ( this.$element.width() / 2 ) );
index 84248e1..c7e6961 100644 (file)
         * @param {jQuery|string} $changesListContent The content of the updated changes list
         */
        mw.rcfilters.ui.ChangesListWrapperWidget.prototype.onModelUpdate = function ( $changesListContent ) {
-               var isEmpty = $changesListContent === 'NO_RESULTS';
+               var conflictItem,
+                       $message = $( '<div>' )
+                               .addClass( 'mw-rcfilters-ui-changesListWrapperWidget-results' ),
+                       isEmpty = $changesListContent === 'NO_RESULTS';
 
                this.$element.toggleClass( 'mw-changeslist', !isEmpty );
                this.$element.toggleClass( 'mw-changeslist-empty', isEmpty );
                if ( isEmpty ) {
                        this.$changesListContent = null;
-                       this.$element.empty().append(
-                               document.createTextNode( mw.message( 'recentchanges-noresult' ).text() )
-                       );
+                       this.$element.empty();
+
+                       if ( this.filtersViewModel.hasConflict() ) {
+                               conflictItem = this.filtersViewModel.getFirstConflictedItem();
+
+                               $message
+                                       .append(
+                                               $( '<div>' )
+                                                       .addClass( 'mw-rcfilters-ui-changesListWrapperWidget-results-conflict' )
+                                                       .text( mw.message( 'rcfilters-noresults-conflict' ).text() ),
+                                               $( '<div>' )
+                                                       .addClass( 'mw-rcfilters-ui-changesListWrapperWidget-results-message' )
+                                                       .text( mw.message( conflictItem.getCurrentConflictResultMessage() ).text() )
+                                       );
+                       } else {
+                               $message
+                                       .append(
+                                               $( '<div>' )
+                                                       .addClass( 'mw-rcfilters-ui-changesListWrapperWidget-results-noresult' )
+                                                       .text( mw.message( 'recentchanges-noresult' ).text() )
+                                       );
+                       }
+
+                       this.$element.append( $message );
                } else {
                        this.$changesListContent = $changesListContent;
                        this.$element.empty().append( this.$changesListContent );
index a06b103..f4f460d 100644 (file)
 
                // Parent
                mw.rcfilters.ui.FilterCapsuleMultiselectWidget.parent.call( this, $.extend( true, {
-                       popup: { $autoCloseIgnore: filterInput.$element.add( this.$overlay ) }
+                       popup: {
+                               $autoCloseIgnore: filterInput.$element.add( this.$overlay ),
+                               $floatableContainer: filterInput.$element
+                       }
                }, config ) );
 
                this.controller = controller;
@@ -34,9 +37,7 @@
                this.selected = null;
 
                this.resetButton = new OO.ui.ButtonWidget( {
-                       icon: 'trash',
                        framed: false,
-                       title: mw.msg( 'rcfilters-clear-all-filters' ),
                        classes: [ 'mw-rcfilters-ui-filterCapsuleMultiselectWidget-resetButton' ]
                } );
 
@@ -48,6 +49,7 @@
 
                // Events
                this.resetButton.connect( this, { click: 'onResetButtonClick' } );
+               this.resetButton.$element.on( 'mousedown', this.onResetButtonMouseDown.bind( this ) );
                this.model.connect( this, {
                        itemUpdate: 'onModelItemUpdate',
                        highlightChange: 'onModelHighlightChange'
                }
        };
 
+       /**
+        * Respond to mouse down event on the reset button to prevent the popup from opening
+        *
+        * @param {jQuery.Event} e Event
+        */
+       mw.rcfilters.ui.FilterCapsuleMultiselectWidget.prototype.onResetButtonMouseDown = function ( e ) {
+               e.stopPropagation();
+       };
+
        /**
         * Reevaluate the restore state for the widget between setting to defaults and clearing all filters
         */
                this.resetButton.setLabel(
                        currFiltersAreEmpty ? mw.msg( 'rcfilters-restore-default-filters' ) : ''
                );
+               this.resetButton.setTitle(
+                       currFiltersAreEmpty ? null : mw.msg( 'rcfilters-clear-all-filters' )
+               );
 
                this.resetButton.toggle( !hideResetButton );
                this.emptyFilterMessage.toggle( currFiltersAreEmpty );
index a750c44..e19208a 100644 (file)
         * @param {mw.rcfilters.Controller} controller Controller
         * @param {mw.rcfilters.dm.FilterGroup} model Filter group model
         * @param {Object} config Configuration object
+        * @cfg {jQuery} [$overlay] Overlay
         */
        mw.rcfilters.ui.FilterGroupWidget = function MwRcfiltersUiFilterGroupWidget( controller, model, config ) {
+               var whatsThisMessages,
+                       $header = $( '<div>' )
+                               .addClass( 'mw-rcfilters-ui-filterGroupWidget-header' ),
+                       $popupContent = $( '<div>' )
+                               .addClass( 'mw-rcfilters-ui-filterGroupWidget-whatsThisButton-popup-content' );
+
                config = config || {};
 
                // Parent
                this.controller = controller;
                this.model = model;
                this.filters = {};
+               this.$overlay = config.$overlay || this.$element;
 
                // Mixin constructors
                OO.ui.mixin.GroupWidget.call( this, config );
                OO.ui.mixin.LabelElement.call( this, $.extend( {}, config, {
                        label: this.model.getTitle(),
                        $label: $( '<div>' )
-                               .addClass( 'mw-rcfilters-ui-filterGroupWidget-title' )
+                               .addClass( 'mw-rcfilters-ui-filterGroupWidget-header-title' )
                } ) );
-               this.$overlay = config.$overlay || this.$element;
+
+               $header.append( this.$label );
+
+               if ( this.model.hasWhatsThis() ) {
+                       whatsThisMessages = this.model.getWhatsThis();
+
+                       // Create popup
+                       if ( whatsThisMessages.header ) {
+                               $popupContent.append(
+                                       ( new OO.ui.LabelWidget( {
+                                               label: mw.msg( whatsThisMessages.header ),
+                                               classes: [ 'mw-rcfilters-ui-filterGroupWidget-whatsThisButton-popup-content-header' ]
+                                       } ) ).$element
+                               );
+                       }
+                       if ( whatsThisMessages.body ) {
+                               $popupContent.append(
+                                       ( new OO.ui.LabelWidget( {
+                                               label: mw.msg( whatsThisMessages.body ),
+                                               classes: [ 'mw-rcfilters-ui-filterGroupWidget-whatsThisButton-popup-content-body' ]
+                                       } ) ).$element
+                               );
+                       }
+                       if ( whatsThisMessages.linkText && whatsThisMessages.url ) {
+                               $popupContent.append(
+                                       ( new OO.ui.ButtonWidget( {
+                                               framed: false,
+                                               flags: [ 'progressive' ],
+                                               href: whatsThisMessages.url,
+                                               label: mw.msg( whatsThisMessages.linkText ),
+                                               classes: [ 'mw-rcfilters-ui-filterGroupWidget-whatsThisButton-popup-content-link' ]
+                                       } ) ).$element
+                               );
+                       }
+
+                       // Add button
+                       this.whatsThisButton = new OO.ui.PopupButtonWidget( {
+                               framed: false,
+                               label: mw.msg( 'rcfilters-filterlist-whatsthis' ),
+                               $overlay: this.$overlay,
+                               classes: [ 'mw-rcfilters-ui-filterGroupWidget-whatsThisButton' ],
+                               flags: [ 'progressive' ],
+                               popup: {
+                                       padded: false,
+                                       align: 'center',
+                                       position: 'above',
+                                       $content: $popupContent,
+                                       classes: [ 'mw-rcfilters-ui-filterGroupWidget-whatsThisButton-popup' ]
+                               }
+                       } );
+
+                       $header
+                               .append( this.whatsThisButton.$element );
+               }
 
                // Populate
                this.populateFromModel();
                        .addClass( 'mw-rcfilters-ui-filterGroupWidget' )
                        .addClass( 'mw-rcfilters-ui-filterGroupWidget-name-' + this.model.getName() )
                        .append(
-                               this.$label,
+                               $header,
                                this.$group
                                        .addClass( 'mw-rcfilters-ui-filterGroupWidget-group' )
                        );
index e64a4c0..e17d028 100644 (file)
                        enter: 'onTextInputEnter'
                } );
                this.capsule.connect( this, { capsuleItemClick: 'onCapsuleItemClick' } );
-               this.capsule.popup.connect( this, { toggle: 'onCapsulePopupToggle' } );
+               this.capsule.popup.connect( this, {
+                       toggle: 'onCapsulePopupToggle',
+                       ready: 'onCapsulePopupReady'
+               } );
 
                // Initialize
                this.$element
                this.filterPopup.select( filterName );
                this.capsule.select( item );
 
+               this.capsule.popup.toggle( true );
                this.scrollToTop( filterWidget.$element );
        };
 
+       /**
+        * Respond to capsule popup ready event, fired after the popup is visible, positioned and clipped
+        */
+       mw.rcfilters.ui.FilterWrapperWidget.prototype.onCapsulePopupReady = function () {
+               mw.hook( 'RcFilters.popup.open' ).fire( this.filterPopup.getSelectedFilter() );
+
+               this.scrollToTop( this.capsule.$element, 10 );
+               if ( !this.filterPopup.getSelectedFilter() ) {
+                       // No selection, scroll the popup list to top
+                       setTimeout( function () { this.capsule.popup.$body.scrollTop( 0 ); }.bind( this ), 0 );
+               }
+       };
+
        /**
         * Respond to popup toggle event. Reset selection in the list when the popup is closed.
         *
         * @param {boolean} isVisible Popup is visible
         */
        mw.rcfilters.ui.FilterWrapperWidget.prototype.onCapsulePopupToggle = function ( isVisible ) {
-               if ( !isVisible ) {
-                       if ( !this.textInput.getValue() ) {
-                               // Only reset selection if we are not filtering
-                               this.filterPopup.resetSelection();
-                               this.capsule.resetSelection();
-                       }
-               } else {
-                       this.scrollToTop( this.capsule.$element, 10 );
+               if ( !isVisible && !this.textInput.getValue() ) {
+                       // Only reset selection if we are not filtering
+                       this.filterPopup.resetSelection();
+                       this.capsule.resetSelection();
                }
        };
 
                var filter = this.filterPopup.getSelectedFilter();
 
                // Toggle the filter
-               this.controller.toggleFilterSelect( filter );
+               if ( filter ) {
+                       this.controller.toggleFilterSelect( filter );
+               }
        };
 
        /**
index b3d1613..b09986f 100644 (file)
@@ -46,7 +46,9 @@ sub {
 /**
  * Block media items
  */
-figure[typeof*='mw:Image'] {
+figure[typeof*='mw:Image'],
+figure[typeof*='mw:Video'],
+figure[typeof*='mw:Audio'] {
        margin: 0;
 
        a {
@@ -88,18 +90,18 @@ figure[typeof*='mw:Image'] {
                display: table-caption;
                caption-side: bottom;
                /* In mw-core the font-size is duplicated, 94% in thumbiner
-                * and again 94% in thumbcaption. 88% for font size of the
+                * and again 94% in thumbcaption. 88.4% for font size of the
                 * caption results in the same behavior. */
-               font-size: 88%;
+               font-size: 88.4%;
                line-height: 1.4em;
                text-align: left;
 
-               border: 1px solid #ccc;
+               border: 1px solid #c8ccd1;
                border-top: 0;
 
                /* taken from .thumbcaption, plus .thumbinner */
-               padding: 1px 5px 5px;
-               background-color: #f9f9f9;
+               padding: 0 6px 6px 6px;
+               background-color: #f8f9fa;
 
                table {
                        /* reset caption side for tables inside figcaptions */
@@ -109,14 +111,18 @@ figure[typeof*='mw:Image'] {
 }
 
 figure[typeof~='mw:Image/Thumb'],
-figure[typeof~='mw:Image/Frame'] {
+figure[typeof~='mw:Video/Thumb'],
+figure[typeof~='mw:Audio/Thumb'],
+figure[typeof~='mw:Image/Frame'],
+figure[typeof~='mw:Video/Frame'],
+figure[typeof~='mw:Audio/Frame'] {
        display: table;
        overflow: auto;
        text-align: center;
-       border: 1px solid #ccc;
+       border: 1px solid #c8ccd1;
        border-bottom: 0; // No border to caption
        border-collapse: collapse;
-       background-color: #f9f9f9;
+       background-color: #f8f9fa;
        // Default to right alignment. This is needed since Parsoid only specifies the
        // alignment class when the alignment is explicitly set.
        margin: 0.5em 0 1.3em 1.4em;
@@ -125,15 +131,28 @@ figure[typeof~='mw:Image/Frame'] {
 }
 
 figure[typeof~='mw:Image/Thumb'] > *:first-child > img,
+figure[typeof~='mw:Video/Thumb'] > *:first-child > video,
+figure[typeof~='mw:Audio/Thumb'] > *:first-child > video,
 figure[typeof~='mw:Image/Frame'] > *:first-child > img,
-.mw-image-border > *:first-child > img {
-       border: 1px solid #ccc;
+figure[typeof~='mw:Video/Frame'] > *:first-child > video,
+figure[typeof~='mw:Audio/Frame'] > *:first-child > video {
+       border: 1px solid #c8ccd1;
        margin: 3px;
        background: #fff;
 }
 
+/* Same as img.thumbborder in content.css */
+.mw-image-border > *:first-child > img,
+.mw-image-border > *:first-child > video {
+       border: 1px solid #eaecf0;
+}
+
 /* Hide the caption for frameless and plain floated images */
 figure[typeof~='mw:Image/Frameless'] > figcaption,
-figure[typeof~='mw:Image'] > figcaption {
+figure[typeof~='mw:Video/Frameless'] > figcaption,
+figure[typeof~='mw:Audio/Frameless'] > figcaption,
+figure[typeof~='mw:Image'] > figcaption,
+figure[typeof~='mw:Video'] > figcaption,
+figure[typeof~='mw:Audio'] > figcaption {
        display: none;
 }
index 97659ed..7cb67b0 100644 (file)
                                        break;
 
                                default:
-                                       if ( !$.isArray( pi.type ) ) {
+                                       if ( !Array.isArray( pi.type ) ) {
                                                throw new Error( 'Unknown parameter type ' + pi.type );
                                        }
 
                                                                break;
 
                                                        default:
-                                                               if ( $.isArray( pi.parameters[ i ].type ) ) {
+                                                               if ( Array.isArray( pi.parameters[ i ].type ) ) {
                                                                        flag = false;
                                                                        count = pi.parameters[ i ].type.length;
                                                                }
diff --git a/resources/src/mediawiki.special/mediawiki.special.changecredentials.js b/resources/src/mediawiki.special/mediawiki.special.changecredentials.js
new file mode 100644 (file)
index 0000000..9592879
--- /dev/null
@@ -0,0 +1,55 @@
+/*!
+ * JavaScript for change credentials form.
+ */
+( function ( mw, $, OO ) {
+       mw.hook( 'htmlform.enhance' ).add( function ( $root ) {
+               var api = new mw.Api();
+
+               $root.find( '.mw-changecredentials-validate-password.oo-ui-fieldLayout' ).each( function () {
+                       var currentApiPromise,
+                               self = OO.ui.FieldLayout.static.infuse( $( this ) );
+
+                       self.getField().setValidation( function ( password ) {
+                               var d;
+
+                               if ( currentApiPromise ) {
+                                       currentApiPromise.abort();
+                                       currentApiPromise = undefined;
+                               }
+
+                               password = $.trim( password );
+
+                               if ( password === '' ) {
+                                       self.setErrors( [] );
+                                       return true;
+                               }
+
+                               d = $.Deferred();
+                               currentApiPromise = api.post( {
+                                       action: 'validatepassword',
+                                       password: password,
+                                       formatversion: 2,
+                                       errorformat: 'html',
+                                       errorsuselocal: true,
+                                       uselang: mw.config.get( 'wgUserLanguage' )
+                               } ).done( function ( resp ) {
+                                       var pwinfo = resp.validatepassword,
+                                               good = pwinfo.validity === 'Good',
+                                               errors = [];
+
+                                       currentApiPromise = undefined;
+
+                                       if ( !good ) {
+                                               pwinfo.validitymessages.map( function ( m ) {
+                                                       errors.push( new OO.ui.HtmlSnippet( m.html ) );
+                                               } );
+                                       }
+                                       self.setErrors( errors );
+                                       d.resolve( good );
+                               } ).fail( d.reject );
+
+                               return d.promise( { abort: currentApiPromise.abort } );
+                       } );
+               } );
+       } );
+}( mediaWiki, jQuery, OO ) );
index 0b0f912..d5e1c48 100644 (file)
@@ -148,7 +148,7 @@ to resemble a traditional dictionary definition */
        left: 0;
        text-align: center;
        color: #fff;
-       text-shadow: 0 0 10px rgba( 0, 0, 0, 0.4 ); /* improves legibility on white background*/
+       text-shadow: 0 0 10px rgba( 0, 0, 0, 0.4 ); /* improves legibility on white background */
        font-size: 0.8em;
        padding: 5px;
        background-color: rgba( 0, 0, 0, 0.5 );
@@ -183,7 +183,7 @@ to resemble a traditional dictionary definition */
 
        #mw-interwiki-results {
                width: 30%;
-               display: inline-block; /* used to align iw sidebar with the top of the main search results*/
+               display: inline-block; /* used to align iw sidebar with the top of the main search results */
                margin-left: 10%;
        }
        .searchresults .mw-search-createlink,
index 9da6c83..4a48f46 100644 (file)
@@ -29,7 +29,7 @@
        font-size: 0.8em;
 }
 
-/* Put some space under template's header, which may contain CAPTCHA HTML.*/
+/* Put some space under template's header, which may contain CAPTCHA HTML. */
 section.mw-form-header {
        margin-bottom: 10px;
 }
index 24f54d0..10e19e7 100644 (file)
        } );
 
        // Check if the username is invalid or already taken
-       $( function () {
-               var
-                       // We need to hook to all of these events to be sure we are notified of all changes to the
-                       // value of an <input type=text> field.
-                       events = 'keyup keydown change mouseup cut paste focus blur',
-                       $input = $( '#wpName2' ),
-                       $statusContainer = $( '#mw-createacct-status-area' ),
+       mw.hook( 'htmlform.enhance' ).add( function ( $root ) {
+               var $usernameInput = $root.find( '#wpName2' ),
+                       $passwordInput = $root.find( '#wpPassword2' ),
+                       $emailInput = $root.find( '#wpEmail' ),
+                       $realNameInput = $root.find( '#wpRealName' ),
                        api = new mw.Api(),
-                       currentRequest;
-
-               // Hide any present status messages.
-               function clearStatus() {
-                       $statusContainer.slideUp( function () {
-                               $statusContainer
-                                       .removeAttr( 'class' )
-                                       .empty();
-                       } );
-               }
+                       usernameChecker, passwordChecker;
 
-               // Returns a promise receiving a { state:, username: } object, where:
-               // * 'state' is one of 'invalid', 'taken', 'ok'
-               // * 'username' is the validated username if 'state' is 'ok', null otherwise (if it's not
-               //   possible to register such an account)
                function checkUsername( username ) {
                        // We could just use .then() if we didn't have to pass on .abort()…
                        var d, apiPromise;
                        apiPromise = api.get( {
                                action: 'query',
                                list: 'users',
-                               ususers: username // '|' in usernames is handled below
+                               ususers: username,
+                               usprop: 'cancreate',
+                               formatversion: 2,
+                               errorformat: 'html',
+                               errorsuselocal: true,
+                               uselang: mw.config.get( 'wgUserLanguage' )
                        } )
                                .done( function ( resp ) {
                                        var userinfo = resp.query.users[ 0 ];
 
-                                       if ( resp.query.users.length !== 1 ) {
-                                               // Happens if the user types '|' into the field
-                                               d.resolve( { state: 'invalid', username: null } );
-                                       } else if ( userinfo.invalid !== undefined ) {
-                                               d.resolve( { state: 'invalid', username: null } );
+                                       if ( resp.query.users.length !== 1 || userinfo.invalid ) {
+                                               d.resolve( { valid: false, messages: [ mw.message( 'noname' ).parseDom() ] } );
                                        } else if ( userinfo.userid !== undefined ) {
-                                               d.resolve( { state: 'taken', username: null } );
+                                               d.resolve( { valid: false, messages: [ mw.message( 'userexists' ).parseDom() ] } );
+                                       } else if ( !userinfo.cancreate ) {
+                                               d.resolve( {
+                                                       valid: false,
+                                                       messages: userinfo.cancreateerror ? userinfo.cancreateerror.map( function ( m ) {
+                                                               return m.html;
+                                                       } ) : []
+                                               } );
                                        } else {
-                                               d.resolve( { state: 'ok', username: username } );
+                                               d.resolve( { valid: true, messages: [] } );
                                        }
                                } )
                                .fail( d.reject );
                        return d.promise( { abort: apiPromise.abort } );
                }
 
-               function updateUsernameStatus() {
-                       var
-                               username = $.trim( $input.val() ),
-                               currentRequestInternal;
-
-                       // Abort any pending requests.
-                       if ( currentRequest ) {
-                               currentRequest.abort();
-                       }
+               function checkPassword() {
+                       // We could just use .then() if we didn't have to pass on .abort()…
+                       var apiPromise,
+                               d = $.Deferred();
 
-                       if ( username === '' ) {
-                               clearStatus();
-                               return;
+                       if ( $.trim( $usernameInput.val() ) === '' ) {
+                               d.resolve( { valid: true, messages: [] } );
+                               return d.promise();
                        }
 
-                       currentRequest = currentRequestInternal = checkUsername( username ).done( function ( info ) {
-                               var message;
-
-                               // Another request was fired in the meantime, the result we got here is no longer current.
-                               // This shouldn't happen as we abort pending requests, but you never know.
-                               if ( currentRequest !== currentRequestInternal ) {
-                                       return;
-                               }
-                               // If we're here, then the current request has finished, avoid calling .abort() needlessly.
-                               currentRequest = undefined;
-
-                               if ( info.state === 'ok' ) {
-                                       clearStatus();
-                               } else {
-                                       if ( info.state === 'invalid' ) {
-                                               message = mw.message( 'noname' ).text();
-                                       } else if ( info.state === 'taken' ) {
-                                               message = mw.message( 'userexists' ).text();
-                                       }
+                       apiPromise = api.post( {
+                               action: 'validatepassword',
+                               user: $usernameInput.val(),
+                               password: $passwordInput.val(),
+                               email: $emailInput.val() || '',
+                               realname: $realNameInput.val() || '',
+                               formatversion: 2,
+                               errorformat: 'html',
+                               errorsuselocal: true,
+                               uselang: mw.config.get( 'wgUserLanguage' )
+                       } )
+                               .done( function ( resp ) {
+                                       var pwinfo = resp.validatepassword || {};
+
+                                       d.resolve( {
+                                               valid: pwinfo.validity === 'Good',
+                                               messages: pwinfo.validitymessages ? pwinfo.validitymessages.map( function ( m ) {
+                                                       return m.html;
+                                               } ) : []
+                                       } );
+                               } )
+                               .fail( d.reject );
 
-                                       $statusContainer
-                                               .attr( 'class', 'errorbox' )
-                                               .empty()
-                                               .append(
-                                                       // Ugh…
-                                                       // TODO Change the HTML structure in includes/templates/Usercreate.php
-                                                       $( '<strong>' ).text( mw.message( 'createacct-error' ).text() ),
-                                                       $( '<br>' ),
-                                                       document.createTextNode( message )
-                                               )
-                                               .slideDown();
-                               }
-                       } ).fail( function () {
-                               clearStatus();
-                       } );
+                       return d.promise( { abort: apiPromise.abort } );
                }
 
-               $input.on( events, $.debounce( 1000, updateUsernameStatus ) );
+               usernameChecker = new mw.htmlform.Checker( $usernameInput, checkUsername );
+               usernameChecker.attach();
+
+               passwordChecker = new mw.htmlform.Checker( $passwordInput, checkPassword );
+               passwordChecker.attach( $usernameInput.add( $emailInput ).add( $realNameInput ) );
        } );
 }( mediaWiki, jQuery ) );
index e9fc024..2af8b2f 100644 (file)
                 *  button object in a list of variadic arguments.
                 */
                addButtons: function ( buttons ) {
-                       if ( !$.isArray( buttons ) ) {
+                       if ( !Array.isArray( buttons ) ) {
                                buttons = slice.call( arguments );
                        }
                        if ( isReady ) {
 
                for ( i = 0; i < queue.length; i++ ) {
                        button = queue[ i ];
-                       if ( $.isArray( button ) ) {
+                       if ( Array.isArray( button ) ) {
                                // Forwarded arguments array from mw.toolbar.addButton
                                insertButton.apply( toolbar, button );
                        } else {
index bc752b5..2a47fa2 100644 (file)
 .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,
@@ -35,7 +33,7 @@
 }
 
 .mw-widget-mediaResultWidget-crop {
-       background-size: cover; /* stylelint-disable-line no-unsupported-browser-features */
+       background-size: cover;
        background-position: center center;
 }
 
@@ -56,7 +54,7 @@
 .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-size: auto;
        background-position: center center;
        background-repeat: no-repeat;
 }
@@ -69,7 +67,7 @@
        overflow: hidden;
        padding: 0.5em;
        color: #fff;
-       text-shadow: 1px 1px #000; /* stylelint-disable-line no-unsupported-browser-features */
+       text-shadow: 1px 1px #000;
        line-height: 1.125em;
        background-color: rgba( 0, 0, 0, 0.5 );
        text-overflow: ellipsis;
index c6938e8..5cbd2ec 100644 (file)
@@ -65,7 +65,7 @@
                this.$results.on( 'scroll', this.onResultsScroll.bind( this ) );
                this.$query.append( this.noItemsMessage.$element );
                this.results.connect( this, {
-                       add: 'onResultsAdd',
+                       change: 'onResultsChange',
                        remove: 'onResultsRemove'
                } );
 
         *
         * @param {mw.widgets.MediaResultWidget[]} items An array of item elements
         */
-       mw.widgets.MediaSearchWidget.prototype.onResultsAdd = function ( items ) {
+       mw.widgets.MediaSearchWidget.prototype.onResultsChange = function ( items ) {
                var search = this;
 
+               if ( !items.length ) {
+                       return;
+               }
+
                // Add method to a queue; this queue will only run when the widget
                // is visible
                this.layoutQueue.push( function () {
diff --git a/resources/src/mediawiki.widgets/mw.widgets.CategoryMultiselectWidget.js b/resources/src/mediawiki.widgets/mw.widgets.CategoryMultiselectWidget.js
new file mode 100644 (file)
index 0000000..5f68030
--- /dev/null
@@ -0,0 +1,416 @@
+/*!
+ * MediaWiki Widgets - CategoryMultiselectWidget class.
+ *
+ * @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
+ * @license The MIT License (MIT); see LICENSE.txt
+ */
+( function ( $, mw ) {
+       var NS_CATEGORY = mw.config.get( 'wgNamespaceIds' ).category;
+
+       /**
+        * Category selector widget. Displays an OO.ui.CapsuleMultiselectWidget
+        * and autocompletes with available categories.
+        *
+        *     mw.loader.using( 'mediawiki.widgets.CategoryMultiselectWidget', function () {
+        *       var selector = new mw.widgets.CategoryMultiselectWidget( {
+        *         searchTypes: [
+        *           mw.widgets.CategoryMultiselectWidget.SearchType.OpenSearch,
+        *           mw.widgets.CategoryMultiselectWidget.SearchType.InternalSearch
+        *         ]
+        *       } );
+        *
+        *       $( 'body' ).append( selector.$element );
+        *
+        *       selector.setSearchTypes( [ mw.widgets.CategoryMultiselectWidget.SearchType.SubCategories ] );
+        *     } );
+        *
+        * @class mw.widgets.CategoryMultiselectWidget
+        * @uses mw.Api
+        * @extends OO.ui.CapsuleMultiselectWidget
+        * @mixins OO.ui.mixin.PendingElement
+        *
+        * @constructor
+        * @param {Object} [config] Configuration options
+        * @cfg {mw.Api} [api] Instance of mw.Api (or subclass thereof) to use for queries
+        * @cfg {number} [limit=10] Maximum number of results to load
+        * @cfg {mw.widgets.CategoryMultiselectWidget.SearchType[]} [searchTypes=[mw.widgets.CategoryMultiselectWidget.SearchType.OpenSearch]]
+        *   Default search API to use when searching.
+        */
+       mw.widgets.CategoryMultiselectWidget = function MWCategoryMultiselectWidget( config ) {
+               // Config initialization
+               config = $.extend( {
+                       limit: 10,
+                       searchTypes: [ mw.widgets.CategoryMultiselectWidget.SearchType.OpenSearch ]
+               }, config );
+               this.limit = config.limit;
+               this.searchTypes = config.searchTypes;
+               this.validateSearchTypes();
+
+               // Parent constructor
+               mw.widgets.CategoryMultiselectWidget.parent.call( this, $.extend( true, {}, config, {
+                       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
+               } ) );
+
+               // Mixin constructors
+               OO.ui.mixin.PendingElement.call( this, $.extend( {}, config, { $pending: this.$handle } ) );
+
+               // Event handler to call the autocomplete methods
+               this.$input.on( 'change input cut paste', OO.ui.debounce( this.updateMenuItems.bind( this ), 100 ) );
+
+               // Initialize
+               this.api = config.api || new mw.Api();
+               this.searchCache = {};
+       };
+
+       /* Setup */
+
+       OO.inheritClass( mw.widgets.CategoryMultiselectWidget, OO.ui.CapsuleMultiselectWidget );
+       OO.mixinClass( mw.widgets.CategoryMultiselectWidget, OO.ui.mixin.PendingElement );
+
+       /* Methods */
+
+       /**
+        * Gets new items based on the input by calling
+        * {@link #getNewMenuItems getNewItems} and updates the menu
+        * after removing duplicates based on the data value.
+        *
+        * @private
+        * @method
+        */
+       mw.widgets.CategoryMultiselectWidget.prototype.updateMenuItems = function () {
+               this.getMenu().clearItems();
+               this.getNewMenuItems( this.$input.val() ).then( function ( items ) {
+                       var existingItems, filteredItems,
+                               menu = this.getMenu();
+
+                       // Never show the menu if the input lost focus in the meantime
+                       if ( !this.$input.is( ':focus' ) ) {
+                               return;
+                       }
+
+                       // Array of strings of the data of OO.ui.MenuOptionsWidgets
+                       existingItems = menu.getItems().map( function ( item ) {
+                               return item.data;
+                       } );
+
+                       // Remove if items' data already exists
+                       filteredItems = items.filter( function ( item ) {
+                               return existingItems.indexOf( item ) === -1;
+                       } );
+
+                       // Map to an array of OO.ui.MenuOptionWidgets
+                       filteredItems = filteredItems.map( function ( item ) {
+                               return new OO.ui.MenuOptionWidget( {
+                                       data: item,
+                                       label: item
+                               } );
+                       } );
+
+                       menu.addItems( filteredItems ).toggle( true );
+               }.bind( this ) );
+       };
+
+       /**
+        * @inheritdoc
+        */
+       mw.widgets.CategoryMultiselectWidget.prototype.clearInput = function () {
+               mw.widgets.CategoryMultiselectWidget.parent.prototype.clearInput.call( this );
+               // Abort all pending requests, we won't need their results
+               this.api.abort();
+       };
+
+       /**
+        * Searches for categories based on the input.
+        *
+        * @private
+        * @method
+        * @param {string} input The input used to prefix search categories
+        * @return {jQuery.Promise} Resolves with an array of categories
+        */
+       mw.widgets.CategoryMultiselectWidget.prototype.getNewMenuItems = function ( input ) {
+               var i,
+                       promises = [],
+                       deferred = $.Deferred();
+
+               if ( $.trim( input ) === '' ) {
+                       deferred.resolve( [] );
+                       return deferred.promise();
+               }
+
+               // Abort all pending requests, we won't need their results
+               this.api.abort();
+               for ( i = 0; i < this.searchTypes.length; i++ ) {
+                       promises.push( this.searchCategories( input, this.searchTypes[ i ] ) );
+               }
+
+               this.pushPending();
+
+               $.when.apply( $, promises ).done( function () {
+                       var categoryNames,
+                               allData = [],
+                               dataSets = Array.prototype.slice.apply( arguments );
+
+                       // Collect values from all results
+                       allData = allData.concat.apply( allData, dataSets );
+
+                       categoryNames = allData
+                               // Remove duplicates
+                               .filter( function ( value, index, self ) {
+                                       return self.indexOf( value ) === index;
+                               } )
+                               // Get Title objects
+                               .map( function ( name ) {
+                                       return mw.Title.newFromText( name );
+                               } )
+                               // Keep only titles from 'Category' namespace
+                               .filter( function ( title ) {
+                                       return title && title.getNamespaceId() === NS_CATEGORY;
+                               } )
+                               // Convert back to strings, strip 'Category:' prefix
+                               .map( function ( title ) {
+                                       return title.getMainText();
+                               } );
+
+                       deferred.resolve( categoryNames );
+
+               } ).always( this.popPending.bind( this ) );
+
+               return deferred.promise();
+       };
+
+       /**
+        * @inheritdoc
+        */
+       mw.widgets.CategoryMultiselectWidget.prototype.createItemWidget = function ( data ) {
+               var title = mw.Title.makeTitle( NS_CATEGORY, data );
+               if ( !title ) {
+                       return null;
+               }
+               return new mw.widgets.CategoryCapsuleItemWidget( {
+                       apiUrl: this.api.apiUrl || undefined,
+                       title: title
+               } );
+       };
+
+       /**
+        * @inheritdoc
+        */
+       mw.widgets.CategoryMultiselectWidget.prototype.getItemFromData = function ( data ) {
+               // This is a bit of a hack... We have to canonicalize the data in the same way that
+               // #createItemWidget and CategoryCapsuleItemWidget will do, otherwise we won't find duplicates.
+               var title = mw.Title.makeTitle( NS_CATEGORY, data );
+               if ( !title ) {
+                       return null;
+               }
+               return OO.ui.mixin.GroupElement.prototype.getItemFromData.call( this, title.getMainText() );
+       };
+
+       /**
+        * Validates the values in `this.searchType`.
+        *
+        * @private
+        * @return {boolean}
+        */
+       mw.widgets.CategoryMultiselectWidget.prototype.validateSearchTypes = function () {
+               var validSearchTypes = false,
+                       searchTypeEnumCount = Object.keys( mw.widgets.CategoryMultiselectWidget.SearchType ).length;
+
+               // Check if all values are in the SearchType enum
+               validSearchTypes = this.searchTypes.every( function ( searchType ) {
+                       return searchType > -1 && searchType < searchTypeEnumCount;
+               } );
+
+               if ( validSearchTypes === false ) {
+                       throw new Error( 'Unknown searchType in searchTypes' );
+               }
+
+               // If the searchTypes has mw.widgets.CategoryMultiselectWidget.SearchType.SubCategories
+               // it can be the only search type.
+               if ( this.searchTypes.indexOf( mw.widgets.CategoryMultiselectWidget.SearchType.SubCategories ) > -1 &&
+                       this.searchTypes.length > 1
+               ) {
+                       throw new Error( 'Can\'t have additional search types with mw.widgets.CategoryMultiselectWidget.SearchType.SubCategories' );
+               }
+
+               // If the searchTypes has mw.widgets.CategoryMultiselectWidget.SearchType.ParentCategories
+               // it can be the only search type.
+               if ( this.searchTypes.indexOf( mw.widgets.CategoryMultiselectWidget.SearchType.ParentCategories ) > -1 &&
+                       this.searchTypes.length > 1
+               ) {
+                       throw new Error( 'Can\'t have additional search types with mw.widgets.CategoryMultiselectWidget.SearchType.ParentCategories' );
+               }
+
+               return true;
+       };
+
+       /**
+        * Sets and validates the value of `this.searchType`.
+        *
+        * @param {mw.widgets.CategoryMultiselectWidget.SearchType[]} searchTypes
+        */
+       mw.widgets.CategoryMultiselectWidget.prototype.setSearchTypes = function ( searchTypes ) {
+               this.searchTypes = searchTypes;
+               this.validateSearchTypes();
+       };
+
+       /**
+        * Searches categories based on input and searchType.
+        *
+        * @private
+        * @method
+        * @param {string} input The input used to prefix search categories
+        * @param {mw.widgets.CategoryMultiselectWidget.SearchType} searchType
+        * @return {jQuery.Promise} Resolves with an array of categories
+        */
+       mw.widgets.CategoryMultiselectWidget.prototype.searchCategories = function ( input, searchType ) {
+               var deferred = $.Deferred(),
+                       cacheKey = input + searchType.toString();
+
+               // Check cache
+               if ( this.searchCache[ cacheKey ] !== undefined ) {
+                       return this.searchCache[ cacheKey ];
+               }
+
+               switch ( searchType ) {
+                       case mw.widgets.CategoryMultiselectWidget.SearchType.OpenSearch:
+                               this.api.get( {
+                                       formatversion: 2,
+                                       action: 'opensearch',
+                                       namespace: NS_CATEGORY,
+                                       limit: this.limit,
+                                       search: input
+                               } ).done( function ( res ) {
+                                       var categories = res[ 1 ];
+                                       deferred.resolve( categories );
+                               } ).fail( deferred.reject.bind( deferred ) );
+                               break;
+
+                       case mw.widgets.CategoryMultiselectWidget.SearchType.InternalSearch:
+                               this.api.get( {
+                                       formatversion: 2,
+                                       action: 'query',
+                                       list: 'allpages',
+                                       apnamespace: NS_CATEGORY,
+                                       aplimit: this.limit,
+                                       apfrom: input,
+                                       apprefix: input
+                               } ).done( function ( res ) {
+                                       var categories = res.query.allpages.map( function ( page ) {
+                                               return page.title;
+                                       } );
+                                       deferred.resolve( categories );
+                               } ).fail( deferred.reject.bind( deferred ) );
+                               break;
+
+                       case mw.widgets.CategoryMultiselectWidget.SearchType.Exists:
+                               if ( input.indexOf( '|' ) > -1 ) {
+                                       deferred.resolve( [] );
+                                       break;
+                               }
+
+                               this.api.get( {
+                                       formatversion: 2,
+                                       action: 'query',
+                                       prop: 'info',
+                                       titles: 'Category:' + input
+                               } ).done( function ( res ) {
+                                       var categories = [];
+
+                                       $.each( res.query.pages, function ( index, page ) {
+                                               if ( !page.missing ) {
+                                                       categories.push( page.title );
+                                               }
+                                       } );
+
+                                       deferred.resolve( categories );
+                               } ).fail( deferred.reject.bind( deferred ) );
+                               break;
+
+                       case mw.widgets.CategoryMultiselectWidget.SearchType.SubCategories:
+                               if ( input.indexOf( '|' ) > -1 ) {
+                                       deferred.resolve( [] );
+                                       break;
+                               }
+
+                               this.api.get( {
+                                       formatversion: 2,
+                                       action: 'query',
+                                       list: 'categorymembers',
+                                       cmtype: 'subcat',
+                                       cmlimit: this.limit,
+                                       cmtitle: 'Category:' + input
+                               } ).done( function ( res ) {
+                                       var categories = res.query.categorymembers.map( function ( category ) {
+                                               return category.title;
+                                       } );
+                                       deferred.resolve( categories );
+                               } ).fail( deferred.reject.bind( deferred ) );
+                               break;
+
+                       case mw.widgets.CategoryMultiselectWidget.SearchType.ParentCategories:
+                               if ( input.indexOf( '|' ) > -1 ) {
+                                       deferred.resolve( [] );
+                                       break;
+                               }
+
+                               this.api.get( {
+                                       formatversion: 2,
+                                       action: 'query',
+                                       prop: 'categories',
+                                       cllimit: this.limit,
+                                       titles: 'Category:' + input
+                               } ).done( function ( res ) {
+                                       var categories = [];
+
+                                       $.each( res.query.pages, function ( index, page ) {
+                                               if ( !page.missing && Array.isArray( page.categories ) ) {
+                                                       categories.push.apply( categories, page.categories.map( function ( category ) {
+                                                               return category.title;
+                                                       } ) );
+                                               }
+                                       } );
+
+                                       deferred.resolve( categories );
+                               } ).fail( deferred.reject.bind( deferred ) );
+                               break;
+
+                       default:
+                               throw new Error( 'Unknown searchType' );
+               }
+
+               // Cache the result
+               this.searchCache[ cacheKey ] = deferred.promise();
+
+               return deferred.promise();
+       };
+
+       /**
+        * @enum mw.widgets.CategoryMultiselectWidget.SearchType
+        * Types of search available.
+        */
+       mw.widgets.CategoryMultiselectWidget.SearchType = {
+               /** Search using action=opensearch */
+               OpenSearch: 0,
+
+               /** Search using action=query */
+               InternalSearch: 1,
+
+               /** Search for existing categories with the exact title */
+               Exists: 2,
+
+               /** Search only subcategories  */
+               SubCategories: 3,
+
+               /** Search only parent categories */
+               ParentCategories: 4
+       };
+
+       // For backwards compatibility. See T161285.
+       mw.widgets.CategorySelector = mw.widgets.CategoryMultiselectWidget;
+}( jQuery, mediaWiki ) );
diff --git a/resources/src/mediawiki.widgets/mw.widgets.CategorySelector.js b/resources/src/mediawiki.widgets/mw.widgets.CategorySelector.js
deleted file mode 100644 (file)
index 422c048..0000000
+++ /dev/null
@@ -1,417 +0,0 @@
-/*!
- * MediaWiki Widgets - CategorySelector class.
- *
- * @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
- * @license The MIT License (MIT); see LICENSE.txt
- */
-( function ( $, mw ) {
-       var CSP,
-               NS_CATEGORY = mw.config.get( 'wgNamespaceIds' ).category;
-
-       /**
-        * Category selector widget. Displays an OO.ui.CapsuleMultiselectWidget
-        * and autocompletes with available categories.
-        *
-        *     mw.loader.using( 'mediawiki.widgets.CategorySelector', function () {
-        *       var selector = new mw.widgets.CategorySelector( {
-        *         searchTypes: [
-        *           mw.widgets.CategorySelector.SearchType.OpenSearch,
-        *           mw.widgets.CategorySelector.SearchType.InternalSearch
-        *         ]
-        *       } );
-        *
-        *       $( 'body' ).append( selector.$element );
-        *
-        *       selector.setSearchTypes( [ mw.widgets.CategorySelector.SearchType.SubCategories ] );
-        *     } );
-        *
-        * @class mw.widgets.CategorySelector
-        * @uses mw.Api
-        * @extends OO.ui.CapsuleMultiselectWidget
-        * @mixins OO.ui.mixin.PendingElement
-        *
-        * @constructor
-        * @param {Object} [config] Configuration options
-        * @cfg {mw.Api} [api] Instance of mw.Api (or subclass thereof) to use for queries
-        * @cfg {number} [limit=10] Maximum number of results to load
-        * @cfg {mw.widgets.CategorySelector.SearchType[]} [searchTypes=[mw.widgets.CategorySelector.SearchType.OpenSearch]]
-        *   Default search API to use when searching.
-        */
-       function CategorySelector( config ) {
-               // Config initialization
-               config = $.extend( {
-                       limit: 10,
-                       searchTypes: [ CategorySelector.SearchType.OpenSearch ]
-               }, config );
-               this.limit = config.limit;
-               this.searchTypes = config.searchTypes;
-               this.validateSearchTypes();
-
-               // Parent constructor
-               mw.widgets.CategorySelector.parent.call( this, $.extend( true, {}, config, {
-                       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
-               } ) );
-
-               // Mixin constructors
-               OO.ui.mixin.PendingElement.call( this, $.extend( {}, config, { $pending: this.$handle } ) );
-
-               // Event handler to call the autocomplete methods
-               this.$input.on( 'change input cut paste', OO.ui.debounce( this.updateMenuItems.bind( this ), 100 ) );
-
-               // Initialize
-               this.api = config.api || new mw.Api();
-               this.searchCache = {};
-       }
-
-       /* Setup */
-
-       OO.inheritClass( CategorySelector, OO.ui.CapsuleMultiselectWidget );
-       OO.mixinClass( CategorySelector, OO.ui.mixin.PendingElement );
-       CSP = CategorySelector.prototype;
-
-       /* Methods */
-
-       /**
-        * Gets new items based on the input by calling
-        * {@link #getNewMenuItems getNewItems} and updates the menu
-        * after removing duplicates based on the data value.
-        *
-        * @private
-        * @method
-        */
-       CSP.updateMenuItems = function () {
-               this.getMenu().clearItems();
-               this.getNewMenuItems( this.$input.val() ).then( function ( items ) {
-                       var existingItems, filteredItems,
-                               menu = this.getMenu();
-
-                       // Never show the menu if the input lost focus in the meantime
-                       if ( !this.$input.is( ':focus' ) ) {
-                               return;
-                       }
-
-                       // Array of strings of the data of OO.ui.MenuOptionsWidgets
-                       existingItems = menu.getItems().map( function ( item ) {
-                               return item.data;
-                       } );
-
-                       // Remove if items' data already exists
-                       filteredItems = items.filter( function ( item ) {
-                               return existingItems.indexOf( item ) === -1;
-                       } );
-
-                       // Map to an array of OO.ui.MenuOptionWidgets
-                       filteredItems = filteredItems.map( function ( item ) {
-                               return new OO.ui.MenuOptionWidget( {
-                                       data: item,
-                                       label: item
-                               } );
-                       } );
-
-                       menu.addItems( filteredItems ).toggle( true );
-               }.bind( this ) );
-       };
-
-       /**
-        * @inheritdoc
-        */
-       CSP.clearInput = function () {
-               CategorySelector.parent.prototype.clearInput.call( this );
-               // Abort all pending requests, we won't need their results
-               this.api.abort();
-       };
-
-       /**
-        * Searches for categories based on the input.
-        *
-        * @private
-        * @method
-        * @param {string} input The input used to prefix search categories
-        * @return {jQuery.Promise} Resolves with an array of categories
-        */
-       CSP.getNewMenuItems = function ( input ) {
-               var i,
-                       promises = [],
-                       deferred = $.Deferred();
-
-               if ( $.trim( input ) === '' ) {
-                       deferred.resolve( [] );
-                       return deferred.promise();
-               }
-
-               // Abort all pending requests, we won't need their results
-               this.api.abort();
-               for ( i = 0; i < this.searchTypes.length; i++ ) {
-                       promises.push( this.searchCategories( input, this.searchTypes[ i ] ) );
-               }
-
-               this.pushPending();
-
-               $.when.apply( $, promises ).done( function () {
-                       var categoryNames,
-                               allData = [],
-                               dataSets = Array.prototype.slice.apply( arguments );
-
-                       // Collect values from all results
-                       allData = allData.concat.apply( allData, dataSets );
-
-                       categoryNames = allData
-                               // Remove duplicates
-                               .filter( function ( value, index, self ) {
-                                       return self.indexOf( value ) === index;
-                               } )
-                               // Get Title objects
-                               .map( function ( name ) {
-                                       return mw.Title.newFromText( name );
-                               } )
-                               // Keep only titles from 'Category' namespace
-                               .filter( function ( title ) {
-                                       return title && title.getNamespaceId() === NS_CATEGORY;
-                               } )
-                               // Convert back to strings, strip 'Category:' prefix
-                               .map( function ( title ) {
-                                       return title.getMainText();
-                               } );
-
-                       deferred.resolve( categoryNames );
-
-               } ).always( this.popPending.bind( this ) );
-
-               return deferred.promise();
-       };
-
-       /**
-        * @inheritdoc
-        */
-       CSP.createItemWidget = function ( data ) {
-               var title = mw.Title.makeTitle( NS_CATEGORY, data );
-               if ( !title ) {
-                       return null;
-               }
-               return new mw.widgets.CategoryCapsuleItemWidget( {
-                       apiUrl: this.api.apiUrl || undefined,
-                       title: title
-               } );
-       };
-
-       /**
-        * @inheritdoc
-        */
-       CSP.getItemFromData = function ( data ) {
-               // This is a bit of a hack... We have to canonicalize the data in the same way that
-               // #createItemWidget and CategoryCapsuleItemWidget will do, otherwise we won't find duplicates.
-               var title = mw.Title.makeTitle( NS_CATEGORY, data );
-               if ( !title ) {
-                       return null;
-               }
-               return OO.ui.mixin.GroupElement.prototype.getItemFromData.call( this, title.getMainText() );
-       };
-
-       /**
-        * Validates the values in `this.searchType`.
-        *
-        * @private
-        * @return {boolean}
-        */
-       CSP.validateSearchTypes = function () {
-               var validSearchTypes = false,
-                       searchTypeEnumCount = Object.keys( CategorySelector.SearchType ).length;
-
-               // Check if all values are in the SearchType enum
-               validSearchTypes = this.searchTypes.every( function ( searchType ) {
-                       return searchType > -1 && searchType < searchTypeEnumCount;
-               } );
-
-               if ( validSearchTypes === false ) {
-                       throw new Error( 'Unknown searchType in searchTypes' );
-               }
-
-               // If the searchTypes has CategorySelector.SearchType.SubCategories
-               // it can be the only search type.
-               if ( this.searchTypes.indexOf( CategorySelector.SearchType.SubCategories ) > -1 &&
-                       this.searchTypes.length > 1
-               ) {
-                       throw new Error( 'Can\'t have additional search types with CategorySelector.SearchType.SubCategories' );
-               }
-
-               // If the searchTypes has CategorySelector.SearchType.ParentCategories
-               // it can be the only search type.
-               if ( this.searchTypes.indexOf( CategorySelector.SearchType.ParentCategories ) > -1 &&
-                       this.searchTypes.length > 1
-               ) {
-                       throw new Error( 'Can\'t have additional search types with CategorySelector.SearchType.ParentCategories' );
-               }
-
-               return true;
-       };
-
-       /**
-        * Sets and validates the value of `this.searchType`.
-        *
-        * @param {mw.widgets.CategorySelector.SearchType[]} searchTypes
-        */
-       CSP.setSearchTypes = function ( searchTypes ) {
-               this.searchTypes = searchTypes;
-               this.validateSearchTypes();
-       };
-
-       /**
-        * Searches categories based on input and searchType.
-        *
-        * @private
-        * @method
-        * @param {string} input The input used to prefix search categories
-        * @param {mw.widgets.CategorySelector.SearchType} searchType
-        * @return {jQuery.Promise} Resolves with an array of categories
-        */
-       CSP.searchCategories = function ( input, searchType ) {
-               var deferred = $.Deferred(),
-                       cacheKey = input + searchType.toString();
-
-               // Check cache
-               if ( this.searchCache[ cacheKey ] !== undefined ) {
-                       return this.searchCache[ cacheKey ];
-               }
-
-               switch ( searchType ) {
-                       case CategorySelector.SearchType.OpenSearch:
-                               this.api.get( {
-                                       formatversion: 2,
-                                       action: 'opensearch',
-                                       namespace: NS_CATEGORY,
-                                       limit: this.limit,
-                                       search: input
-                               } ).done( function ( res ) {
-                                       var categories = res[ 1 ];
-                                       deferred.resolve( categories );
-                               } ).fail( deferred.reject.bind( deferred ) );
-                               break;
-
-                       case CategorySelector.SearchType.InternalSearch:
-                               this.api.get( {
-                                       formatversion: 2,
-                                       action: 'query',
-                                       list: 'allpages',
-                                       apnamespace: NS_CATEGORY,
-                                       aplimit: this.limit,
-                                       apfrom: input,
-                                       apprefix: input
-                               } ).done( function ( res ) {
-                                       var categories = res.query.allpages.map( function ( page ) {
-                                               return page.title;
-                                       } );
-                                       deferred.resolve( categories );
-                               } ).fail( deferred.reject.bind( deferred ) );
-                               break;
-
-                       case CategorySelector.SearchType.Exists:
-                               if ( input.indexOf( '|' ) > -1 ) {
-                                       deferred.resolve( [] );
-                                       break;
-                               }
-
-                               this.api.get( {
-                                       formatversion: 2,
-                                       action: 'query',
-                                       prop: 'info',
-                                       titles: 'Category:' + input
-                               } ).done( function ( res ) {
-                                       var categories = [];
-
-                                       $.each( res.query.pages, function ( index, page ) {
-                                               if ( !page.missing ) {
-                                                       categories.push( page.title );
-                                               }
-                                       } );
-
-                                       deferred.resolve( categories );
-                               } ).fail( deferred.reject.bind( deferred ) );
-                               break;
-
-                       case CategorySelector.SearchType.SubCategories:
-                               if ( input.indexOf( '|' ) > -1 ) {
-                                       deferred.resolve( [] );
-                                       break;
-                               }
-
-                               this.api.get( {
-                                       formatversion: 2,
-                                       action: 'query',
-                                       list: 'categorymembers',
-                                       cmtype: 'subcat',
-                                       cmlimit: this.limit,
-                                       cmtitle: 'Category:' + input
-                               } ).done( function ( res ) {
-                                       var categories = res.query.categorymembers.map( function ( category ) {
-                                               return category.title;
-                                       } );
-                                       deferred.resolve( categories );
-                               } ).fail( deferred.reject.bind( deferred ) );
-                               break;
-
-                       case CategorySelector.SearchType.ParentCategories:
-                               if ( input.indexOf( '|' ) > -1 ) {
-                                       deferred.resolve( [] );
-                                       break;
-                               }
-
-                               this.api.get( {
-                                       formatversion: 2,
-                                       action: 'query',
-                                       prop: 'categories',
-                                       cllimit: this.limit,
-                                       titles: 'Category:' + input
-                               } ).done( function ( res ) {
-                                       var categories = [];
-
-                                       $.each( res.query.pages, function ( index, page ) {
-                                               if ( !page.missing && $.isArray( page.categories ) ) {
-                                                       categories.push.apply( categories, page.categories.map( function ( category ) {
-                                                               return category.title;
-                                                       } ) );
-                                               }
-                                       } );
-
-                                       deferred.resolve( categories );
-                               } ).fail( deferred.reject.bind( deferred ) );
-                               break;
-
-                       default:
-                               throw new Error( 'Unknown searchType' );
-               }
-
-               // Cache the result
-               this.searchCache[ cacheKey ] = deferred.promise();
-
-               return deferred.promise();
-       };
-
-       /**
-        * @enum mw.widgets.CategorySelector.SearchType
-        * Types of search available.
-        */
-       CategorySelector.SearchType = {
-               /** Search using action=opensearch */
-               OpenSearch: 0,
-
-               /** Search using action=query */
-               InternalSearch: 1,
-
-               /** Search for existing categories with the exact title */
-               Exists: 2,
-
-               /** Search only subcategories  */
-               SubCategories: 3,
-
-               /** Search only parent categories */
-               ParentCategories: 4
-       };
-
-       mw.widgets.CategorySelector = CategorySelector;
-}( jQuery, mediaWiki ) );
index f67ed3d..b0c9f91 100644 (file)
                }
        };
 
+       /**
+        * @inheritdoc
+        */
+       mw.widgets.ComplexNamespaceInputWidget.prototype.setDisabled = function ( disabled ) {
+               mw.widgets.ComplexNamespaceInputWidget.parent.prototype.setDisabled.call( this, disabled );
+               this.namespace.setDisabled( disabled );
+
+               if ( this.invert ) {
+                       this.invert.setDisabled( disabled );
+               }
+
+               if ( this.associated ) {
+                       this.associated.setDisabled( disabled );
+               }
+       };
+
 }( jQuery, mediaWiki ) );
index 8f48ec3..030fbb0 100644 (file)
                this.title.restorePreInfuseState( state.title );
        };
 
+       /**
+        * @inheritdoc
+        */
+       mw.widgets.ComplexTitleInputWidget.prototype.setDisabled = function ( disabled ) {
+               mw.widgets.ComplexTitleInputWidget.parent.prototype.setDisabled.call( this, disabled );
+               this.namespace.setDisabled( disabled );
+               this.title.setDisabled( disabled );
+       };
+
 }( jQuery, mediaWiki ) );
index 37e6e1a..51508ab 100644 (file)
                } );
 
                // Highlight matching parts of link suggestion
-               this.$label.autoEllipsis( { hasSpan: false, tooltip: true, matchText: config.query } );
+               this.$label
+                       .highlightText( config.query )
+                       .attr( 'title', config.data );
 
                if ( config.missing ) {
                        this.$label.addClass( 'new' );
+               } else if ( config.redirect ) {
+                       this.$label.addClass( 'mw-redirect' );
+               } else if ( config.disambiguation ) {
+                       this.$label.addClass( 'mw-disambig' );
                }
 
                if ( config.imageUrl ) {
index 37c0c9b..b4639ab 100644 (file)
                        // Handle common MediaWiki API idioms for passing parameters
                        for ( key in parameters ) {
                                // Multiple values are pipe-separated
-                               if ( $.isArray( parameters[ key ] ) ) {
+                               if ( Array.isArray( parameters[ key ] ) ) {
                                        if ( !useUS || parameters[ key ].join( '' ).indexOf( '|' ) === -1 ) {
                                                parameters[ key ] = parameters[ key ].join( '|' );
                                        } else {
index 5299252..f50e59a 100644 (file)
@@ -28,7 +28,7 @@
                                {
                                        formatversion: 2,
                                        action: 'watch',
-                                       titles: $.isArray( pages ) ? pages.join( '|' ) : String( pages )
+                                       titles: Array.isArray( pages ) ? pages.join( '|' ) : String( pages )
                                },
                                addParams
                        )
@@ -37,7 +37,7 @@
                return apiPromise
                        .then( function ( data ) {
                                // If a single page was given (not an array) respond with a single item as well.
-                               return $.isArray( pages ) ? data.watch : data.watch[ 0 ];
+                               return Array.isArray( pages ) ? data.watch : data.watch[ 0 ];
                        } )
                        .promise( { abort: apiPromise.abort } );
        }
index 157ac06..3bf75ae 100644 (file)
@@ -66,7 +66,7 @@
                                funcs = [];
                                fields = [];
                                for ( i = 1; i < l; i++ ) {
-                                       if ( !$.isArray( spec[ i ] ) ) {
+                                       if ( !Array.isArray( spec[ i ] ) ) {
                                                throw new Error( op + ' parameters must be arrays' );
                                        }
                                        v = hideIfParse( $el, spec[ i ] );
                                if ( l !== 2 ) {
                                        throw new Error( 'NOT takes exactly one parameter' );
                                }
-                               if ( !$.isArray( spec[ 1 ] ) ) {
+                               if ( !Array.isArray( spec[ 1 ] ) ) {
                                        throw new Error( 'NOT parameters must be arrays' );
                                }
                                v = hideIfParse( $el, spec[ 1 ] );
diff --git a/resources/src/mediawiki/htmlform/htmlform.Checker.js b/resources/src/mediawiki/htmlform/htmlform.Checker.js
new file mode 100644 (file)
index 0000000..3f53b63
--- /dev/null
@@ -0,0 +1,180 @@
+( function ( mw, $ ) {
+
+       mw.htmlform = {};
+
+       /**
+        * @class mw.htmlform.Checker
+        */
+
+       /**
+        * A helper class to add validation to non-OOUI HtmlForm fields.
+        *
+        * @constructor
+        * @param {jQuery} $element Form field generated by HTMLForm
+        * @param {Function} validator Validation callback
+        * @param {string} validator.value Value of the form field to be validated
+        * @param {jQuery.Promise} validator.return The promise should be resolved
+        *  with an object with two properties: Boolean 'valid' to indicate success
+        *  or failure of validation, and an array 'messages' to be passed to
+        *  setErrors() on failure.
+        */
+       mw.htmlform.Checker = function ( $element, validator ) {
+               this.validator = validator;
+               this.$element = $element;
+
+               this.$errorBox = $element.next( '.error' );
+               if ( !this.$errorBox.length ) {
+                       this.$errorBox = $( '<span>' );
+                       this.$errorBox.hide();
+                       $element.after( this.$errorBox );
+               }
+
+               this.currentValue = this.$element.val();
+       };
+
+       /**
+        * Attach validation events to the form element
+        *
+        * @param {jQuery} [$extraElements] Additional elements to listen for change
+        *  events on.
+        * @return {mw.htmlform.Checker}
+        * @chainable
+        */
+       mw.htmlform.Checker.prototype.attach = function ( $extraElements ) {
+               var $e,
+                       // We need to hook to all of these events to be sure we are
+                       // notified of all changes to the value of an <input type=text>
+                       // field.
+                       events = 'keyup keydown change mouseup cut paste focus blur';
+
+               $e = this.$element;
+               if ( $extraElements ) {
+                       $e = $e.add( $extraElements );
+               }
+               $e.on( events, $.debounce( 1000, this.validate.bind( this ) ) );
+
+               return this;
+       };
+
+       /**
+        * Validate the form element
+        * @return {jQuery.Promise}
+        */
+       mw.htmlform.Checker.prototype.validate = function () {
+               var currentRequestInternal,
+                       that = this,
+                       value = this.$element.val();
+
+               // Abort any pending requests.
+               if ( this.currentRequest && this.currentRequest.abort ) {
+                       this.currentRequest.abort();
+               }
+
+               if ( value === '' ) {
+                       this.currentValue = value;
+                       this.setErrors( [] );
+                       return;
+               }
+
+               this.currentRequest = currentRequestInternal = this.validator( value )
+                       .done( function ( info ) {
+                               var forceReplacement = value !== that.currentValue;
+
+                               // Another request was fired in the meantime, the result we got here is no longer current.
+                               // This shouldn't happen as we abort pending requests, but you never know.
+                               if ( that.currentRequest !== currentRequestInternal ) {
+                                       return;
+                               }
+                               // If we're here, then the current request has finished, avoid calling .abort() needlessly.
+                               that.currentRequest = undefined;
+
+                               that.currentValue = value;
+
+                               if ( info.valid ) {
+                                       that.setErrors( [], forceReplacement );
+                               } else {
+                                       that.setErrors( info.messages, forceReplacement );
+                               }
+                       } ).fail( function () {
+                               that.currentValue = null;
+                               that.setErrors( [] );
+                       } );
+
+               return currentRequestInternal;
+       };
+
+       /**
+        * Display errors associated with the form element
+        * @param {Array} errors Error messages. Each error message will be appended to a
+        *  `<span>` or `<li>`, as with jQuery.append().
+        * @param {boolean} [forceReplacement] Set true to force a visual replacement even
+        *  if the errors are the same. Ignored if errors are empty.
+        * @return {mw.htmlform.Checker}
+        * @chainable
+        */
+       mw.htmlform.Checker.prototype.setErrors = function ( errors, forceReplacement ) {
+               var $oldErrorBox, tagName, showFunc, text, replace,
+                       $errorBox = this.$errorBox;
+
+               if ( errors.length === 0 ) {
+                       $errorBox.slideUp( function () {
+                               $errorBox
+                                       .removeAttr( 'class' )
+                                       .empty();
+                       } );
+               } else {
+                       // Match behavior of HTMLFormField::formatErrors(), <span> or <ul>
+                       // depending on the count.
+                       tagName = errors.length === 1 ? 'span' : 'ul';
+
+                       // We have to animate the replacement if we're changing the tag. We
+                       // also want to if told to by the caller (i.e. to make it visually
+                       // obvious that the changed field value gives the same error) or if
+                       // the error text changes (because it makes more sense than
+                       // changing the text with no animation).
+                       replace = (
+                               forceReplacement || $errorBox.length > 1 ||
+                               $errorBox[ 0 ].tagName.toLowerCase() !== tagName
+                       );
+                       if ( !replace ) {
+                               text = $( '<' + tagName + '>' )
+                                       .append( errors.map( function ( e ) {
+                                               return errors.length === 1 ? e : $( '<li>' ).append( e );
+                                       } ) );
+                               if ( text.text() !== $errorBox.text() ) {
+                                       replace = true;
+                               }
+                       }
+
+                       $oldErrorBox = $errorBox;
+                       if ( replace ) {
+                               this.$errorBox = $errorBox = $( '<' + tagName + '>' );
+                               $errorBox.hide();
+                               $oldErrorBox.after( this.$errorBox );
+                       }
+
+                       showFunc = function () {
+                               if ( $oldErrorBox !== $errorBox ) {
+                                       $oldErrorBox
+                                               .removeAttr( 'class' )
+                                               .detach();
+                               }
+                               $errorBox
+                                       .attr( 'class', 'error' )
+                                       .empty()
+                                       .append( errors.map( function ( e ) {
+                                               return errors.length === 1 ? e : $( '<li>' ).append( e );
+                                       } ) )
+                                       .slideDown();
+                       };
+                       if ( $oldErrorBox !== $errorBox && $oldErrorBox.hasClass( 'error' ) ) {
+                               $oldErrorBox.slideUp( showFunc );
+                       } else {
+                               showFunc();
+                       }
+               }
+
+               return this;
+       };
+
+}( mediaWiki, jQuery ) );
index f2b6f5f..8c80cb8 100644 (file)
                return mw.ForeignStructuredUpload.BookletLayout.parent.prototype.initialize.call( this ).then(
                        function () {
                                return $.when(
-                                       // Point the CategorySelector to the right wiki
+                                       // Point the CategoryMultiselectWidget to the right wiki
                                        booklet.upload.getApi().then( function ( api ) {
                                                // If this is a ForeignApi, it will have a apiUrl, otherwise we don't need to do anything
                                                if ( api.apiUrl ) {
-                                                       // Can't reuse the same object, CategorySelector calls #abort on its mw.Api instance
+                                                       // Can't reuse the same object, CategoryMultiselectWidget calls #abort on its mw.Api instance
                                                        booklet.categoriesWidget.api = new mw.ForeignApi( api.apiUrl );
                                                }
                                                return $.Deferred().resolve();
                        multiline: true,
                        autosize: true
                } );
-               this.categoriesWidget = new mw.widgets.CategorySelector( {
+               this.categoriesWidget = new mw.widgets.CategoryMultiselectWidget( {
                        // Can't be done here because we don't know the target wiki yet... done in #initialize.
                        // api: new mw.ForeignApi( ... ),
                        $overlay: this.$overlay
index 0e2af50..6765270 100644 (file)
                        var i, len,
                                pages = this.pages;
 
-                       titles = $.isArray( titles ) ? titles : [ titles ];
+                       titles = Array.isArray( titles ) ? titles : [ titles ];
                        state = state === undefined ? true : !!state;
 
                        for ( i = 0, len = titles.length; i < len; i++ ) {
index 172cac2..3fcbb3f 100644 (file)
@@ -1,4 +1,4 @@
-/* global moment*/
+/* global moment */
 ( function ( $, mw, moment ) {
 
        /**
         */
        mw.Upload.BookletLayout.prototype.uploadFile = function () {
                var deferred = $.Deferred(),
-                       startTime = new Date(),
+                       startTime = mw.now(),
                        layout = this,
                        file = this.getFile();
 
                                deferred.reject( errorMessage );
                        } );
                }, function ( progress ) {
-                       var elapsedTime = new Date() - startTime,
+                       var elapsedTime = mw.now() - startTime,
                                estimatedTotalTime = ( 1 / progress ) * elapsedTime,
                                estimatedRemainingTime = moment.duration( estimatedTotalTime - elapsedTime );
                        layout.emit( 'fileUploadProgress', progress, estimatedRemainingTime );
index 95263ec..59261cd 100644 (file)
                                                // Only copy direct properties, not inherited ones
                                                if ( uri.hasOwnProperty( prop ) ) {
                                                        // Deep copy object properties
-                                                       if ( $.isArray( uri[ prop ] ) || $.isPlainObject( uri[ prop ] ) ) {
+                                                       if ( Array.isArray( uri[ prop ] ) || $.isPlainObject( uri[ prop ] ) ) {
                                                                this[ prop ] = $.extend( true, {}, uri[ prop ] );
                                                        } else {
                                                                this[ prop ] = uri[ prop ];
                                                                        q[ k ] = [ q[ k ] ];
                                                                }
                                                                // Add to the array
-                                                               if ( $.isArray( q[ k ] ) ) {
+                                                               if ( Array.isArray( q[ k ] ) ) {
                                                                        q[ k ].push( v );
                                                                }
                                                        }
                                var args = [];
                                $.each( this.query, function ( key, val ) {
                                        var k = Uri.encode( key ),
-                                               vals = $.isArray( val ) ? val : [ val ];
+                                               vals = Array.isArray( val ) ? val : [ val ];
                                        $.each( vals, function ( i, v ) {
                                                if ( v === null ) {
                                                        args.push( k );
index 5c2f83f..638fba7 100644 (file)
 
                                // Grep module's CSS
                                if (
-                                       $.isPlainObject( module.style ) && $.isArray( module.style.css ) &&
+                                       $.isPlainObject( module.style ) && Array.isArray( module.style.css ) &&
                                        pattern.test( module.style.css.join( '' ) )
                                ) {
                                        // Module's CSS source matches
index c82b9cb..6d3b4f0 100644 (file)
@@ -16,8 +16,7 @@
                parserDefaults = {
                        magic: {
                                PAGENAME: mw.config.get( 'wgPageName' ),
-                               PAGENAMEE: mw.util.wikiUrlencode( mw.config.get( 'wgPageName' ) ),
-                               SITENAME: mw.config.get( 'wgSiteName' )
+                               PAGENAMEE: mw.util.wikiUrlencode( mw.config.get( 'wgPageName' ) )
                        },
                        // Whitelist for allowed HTML elements in wikitext.
                        // Self-closing tags are not currently supported.
@@ -74,7 +73,7 @@
        function appendWithoutParsing( $parent, children ) {
                var i, len;
 
-               if ( !$.isArray( children ) ) {
+               if ( !Array.isArray( children ) ) {
                        children = [ children ];
                }
 
                                // 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 );
+                               argsArray = Array.isArray( args[ 1 ] ) ? args[ 1 ] : slice.call( args, 1 );
                        try {
                                return parser.parse( key, argsArray );
                        } catch ( e ) {
         * parsers, pass the relevant options to mw.jqueryMsg.parser.
         *
         * @private
-        * @param {Object} data
+        * @param {Object} data New data to extend parser defaults with
+        * @param {boolean} [deep=false] Whether the extend is done recursively (deep)
         */
-       mw.jqueryMsg.setParserDefaults = function ( data ) {
-               $.extend( parserDefaults, data );
+       mw.jqueryMsg.setParserDefaults = function ( data, deep ) {
+               if ( deep ) {
+                       $.extend( true, parserDefaults, data );
+               } else {
+                       $.extend( parserDefaults, data );
+               }
        };
 
        /**
index c2cee7e..86a9a0a 100644 (file)
                        var results, i;
                        fallback = arguments.length > 1 ? fallback : null;
 
-                       if ( $.isArray( selection ) ) {
+                       if ( Array.isArray( selection ) ) {
                                results = {};
                                for ( i = 0; i < selection.length; i++ ) {
                                        if ( typeof selection[ i ] === 'string' ) {
                 */
                exists: function ( selection ) {
                        var i;
-                       if ( $.isArray( selection ) ) {
+                       if ( Array.isArray( selection ) ) {
                                for ( i = 0; i < selection.length; i++ ) {
                                        if ( typeof selection[ i ] !== 'string' || !hasOwn.call( this.values, selection[ i ] ) ) {
                                                return false;
 
        /* eslint-disable no-console */
        log = ( function () {
-               // Also update the restoration of methods in mediawiki.log.js
-               // when adding or removing methods here.
+               /**
+                * Write a verbose message to the browser's console in debug mode.
+                *
+                * This method is mainly intended for verbose logging. It is a no-op in production mode.
+                * In ResourceLoader debug mode, it will use the browser's console if available, with
+                * fallback to creating a console interface in the DOM and logging messages there.
+                *
+                * See {@link mw.log} for other logging methods.
+                *
+                * @member mw
+                * @param {...string} msg Messages to output to console.
+                */
                var log = function () {},
                        console = window.console;
 
+               // Note: Keep list of methods in sync with restoration in mediawiki.log.js
+               // when adding or removing mw.log methods below!
+
                /**
+                * Collection of methods to help log messages to the console.
+                *
                 * @class mw.log
                 * @singleton
                 */
 
                /**
-                * Write a message to the console's warning channel.
-                * Actions not supported by the browser console are silently ignored.
+                * Write a message to the browser console's warning channel.
+                *
+                * This method is a no-op in browsers that don't implement the Console API.
                 *
                 * @param {...string} msg Messages to output to console
                 */
                        $.noop;
 
                /**
-                * Write a message to the console's error channel.
+                * Write a message to the browser console's error channel.
+                *
+                * Most browsers also print a stacktrace when calling this method if the
+                * argument is an Error object.
                 *
-                * Most browsers provide a stacktrace by default if the argument
-                * is a caught Error object.
+                * This method is a no-op in browsers that don't implement the Console API.
                 *
                 * @since 1.26
                 * @param {Error|...string} msg Messages to output to console
                        $.noop;
 
                /**
-                * Create a property in a host object that, when accessed, will produce
+                * Create a property on a host object that, when accessed, will produce
                 * a deprecation warning in the console.
                 *
                 * @param {Object} obj Host object of deprecated property
                        return mw.message.apply( mw.message, arguments ).toString();
                },
 
-               /**
-                * No-op dummy placeholder for {@link mw.log} in debug mode.
-                *
-                * @method
-                */
+               // Expose mw.log
                log: log,
 
                /**
                                cssBuffer = '',
                                cssBufferTimer = null,
                                cssCallbacks = $.Callbacks(),
-                               isIE9 = document.documentMode === 9,
                                rAF = window.requestAnimationFrame || setTimeout;
 
                        function getMarker() {
                         * @param {Function} [callback]
                         */
                        function addEmbeddedCSS( cssText, callback ) {
-                               var $style, styleEl;
-
                                function fireCallbacks() {
                                        var oldCallbacks = cssCallbacks;
                                        // Reset cssCallbacks variable so it's not polluted by any calls to
                                        cssBuffer = '';
                                }
 
-                               // By default, always create a new <style>. Appending text to a <style> tag is
-                               // is a performance anti-pattern as it requires CSS to be reparsed (T47810).
-                               //
-                               // Support: IE 6-9
-                               // Try to re-use existing <style> tags due to the IE stylesheet limit (T33676).
-                               if ( isIE9 ) {
-                                       $style = $( getMarker() ).prev();
-                                       // Verify that the element before the marker actually is a <style> tag created
-                                       // by mw.loader (not some other style tag, or e.g. a <meta> tag).
-                                       if ( $style.data( 'ResourceLoaderDynamicStyleTag' ) ) {
-                                               styleEl = $style[ 0 ];
-                                               styleEl.appendChild( document.createTextNode( cssText ) );
-                                               fireCallbacks();
-                                               return;
-                                       }
-                                       // Else: No existing tag to reuse. Continue below and create the first one.
-                               }
-
-                               $style = $( newStyleTag( cssText, getMarker() ) );
-
-                               if ( isIE9 ) {
-                                       $style.data( 'ResourceLoaderDynamicStyleTag', true );
-                               }
+                               $( newStyleTag( cssText, getMarker() ) );
 
                                fireCallbacks();
                        }
                         * @return {string} Hash of concatenated version hashes.
                         */
                        function getCombinedVersion( modules ) {
-                               var hashes = $.map( modules, function ( module ) {
+                               var hashes = modules.map( function ( module ) {
                                        return registry[ module ].version;
                                } );
                                return fnv132( hashes.join( '' ) );
                                        el.media = media;
                                }
                                // If you end up here from an IE exception "SCRIPT: Invalid property value.",
-                               // see #addEmbeddedCSS, T33676, and T49277 for details.
+                               // see #addEmbeddedCSS, T33676, T43331, and T49277 for details.
                                el.href = url;
 
                                $( getMarker() ).before( el );
 
                                        legacyWait.always( function () {
                                                try {
-                                                       if ( $.isArray( script ) ) {
+                                                       if ( Array.isArray( script ) ) {
                                                                nestedAddScript( script, markModuleReady, 0 );
                                                        } else if ( typeof script === 'function' ) {
                                                                // Pass jQuery twice so that the signature of the closure which wraps
 
                                                // Array of css strings in key 'css',
                                                // or back-compat array of urls from media-type
-                                               if ( $.isArray( value ) ) {
+                                               if ( Array.isArray( value ) ) {
                                                        for ( i = 0; i < value.length; i++ ) {
                                                                if ( key === 'bc-url' ) {
                                                                        // back-compat: { <media>: [url, ..] }
                                                // "https://example.org/x.js", "http://example.org/x.js", "//example.org/x.js", "/x.js"
                                                if ( /^(https?:)?\/?\//.test( modules ) ) {
                                                        if ( type === 'text/css' ) {
-                                                               // Support: IE 7-8
-                                                               // Use properties instead of attributes as IE throws security
-                                                               // warnings when inserting a <link> tag with a protocol-relative
-                                                               // URL set though attributes - when on HTTPS. See T43331.
                                                                l = document.createElement( 'link' );
                                                                l.rel = 'stylesheet';
                                                                l.href = modules;
                                 * @return {Array}
                                 */
                                getModuleNames: function () {
-                                       return $.map( registry, function ( i, key ) {
-                                               return key;
-                                       } );
+                                       return Object.keys( registry );
                                },
 
                                /**
                // for all loading modules. If one fails, fall back to tracking each module
                // separately via $.when(), this is expensive.
                loading = mw.loader.using( loading ).then( null, function () {
-                       var all = $.map( loading, function ( module ) {
+                       var all = loading.map( function ( module ) {
                                return mw.loader.using( module ).then( null, function () {
                                        return $.Deferred().resolve();
                                } );
index 4d23604..969e872 100644 (file)
        var original = mw.log,
                slice = Array.prototype.slice;
 
-       /**
-        * Logs a message to the console in debug mode.
-        *
-        * In the case the browser does not have a console API, a console is created on-the-fly by appending
-        * a `<div id="mw-log-console">` element to the bottom of the body and then appending this and future
-        * messages to that, instead of the console.
-        *
-        * @member mw.log
-        * @param {...string} msg Messages to output to console.
-        */
        mw.log = function () {
                // Turn arguments into an array
                var args = slice.call( arguments ),
index 147de92..633798d 100644 (file)
@@ -1,7 +1,8 @@
 .mw-notification-area {
        top: 0;
        right: 0;
-       padding: 1em 1em 0 0;
+       /* Padding on all sides so drop shadows aren't cut by overflow: hidden */
+       padding: 1em;
        width: 20em;
        line-height: 1.35;
        z-index: 10000;
index 4849f5a..d36c4a0 100644 (file)
                defaults: {
                        autoHide: true,
                        autoHideSeconds: 'short',
-                       tag: false,
-                       title: undefined,
-                       type: false
+                       tag: null,
+                       title: null,
+                       type: null
                },
 
                /**
index 0955c23..9ef6c43 100644 (file)
@@ -3,56 +3,60 @@
 
        // Table of contents toggle
        mw.hook( 'wikipage.content' ).add( function ( $content ) {
-               var $toc, $tocTitle, $tocToggleLink, $tocList, hideToc;
-               $toc = $content.find( '#toc' );
-               $tocTitle = $content.find( '#toctitle' );
-               $tocToggleLink = $content.find( '#togglelink' );
-               $tocList = $toc.find( 'ul' ).eq( 0 );
+               $content.find( '.toc' ).addBack( '.toc' ).each( function () {
+                       var hideToc,
+                               $this = $( this ),
+                               // .toctitle is new so may not exist in HTML caches for a few weeks,
+                               // so keep checking for #toctitle for now
+                               $tocTitle = $this.find( '.toctitle, #toctitle' ),
+                               $tocToggleLink = $this.find( '.togglelink' ),
+                               $tocList = $this.find( 'ul' ).eq( 0 );
 
-               // Hide/show the table of contents element
-               function toggleToc() {
-                       if ( $tocList.is( ':hidden' ) ) {
-                               $tocList.slideDown( 'fast' );
-                               $tocToggleLink.text( mw.msg( 'hidetoc' ) );
-                               $toc.removeClass( 'tochidden' );
-                               mw.cookie.set( 'hidetoc', null );
-                       } else {
-                               $tocList.slideUp( 'fast' );
-                               $tocToggleLink.text( mw.msg( 'showtoc' ) );
-                               $toc.addClass( 'tochidden' );
-                               mw.cookie.set( 'hidetoc', '1' );
+                       // Hide/show the table of contents element
+                       function toggleToc() {
+                               if ( $tocList.is( ':hidden' ) ) {
+                                       $tocList.slideDown( 'fast' );
+                                       $tocToggleLink.text( mw.msg( 'hidetoc' ) );
+                                       $this.removeClass( 'tochidden' );
+                                       mw.cookie.set( 'hidetoc', null );
+                               } else {
+                                       $tocList.slideUp( 'fast' );
+                                       $tocToggleLink.text( mw.msg( 'showtoc' ) );
+                                       $this.addClass( 'tochidden' );
+                                       mw.cookie.set( 'hidetoc', '1' );
+                               }
                        }
-               }
 
-               // Only add it if there is a complete TOC and it doesn't
-               // have a toggle added already
-               if ( $toc.length && $tocTitle.length && $tocList.length && !$tocToggleLink.length ) {
-                       hideToc = mw.cookie.get( 'hidetoc' ) === '1';
+                       // Only add it if there is a complete TOC and it doesn't
+                       // have a toggle added already
+                       if ( $tocTitle.length && $tocList.length && !$tocToggleLink.length ) {
+                               hideToc = mw.cookie.get( 'hidetoc' ) === '1';
 
-                       $tocToggleLink = $( '<a role="button" tabindex="0" id="togglelink"></a>' )
-                               .text( mw.msg( hideToc ? 'showtoc' : 'hidetoc' ) )
-                               .on( 'click keypress', function ( e ) {
-                                       if (
-                                               e.type === 'click' ||
-                                               e.type === 'keypress' && e.which === 13
-                                       ) {
-                                               toggleToc();
-                                       }
-                               } );
+                               $tocToggleLink = $( '<a role="button" tabindex="0" class="togglelink"></a>' )
+                                       .text( mw.msg( hideToc ? 'showtoc' : 'hidetoc' ) )
+                                       .on( 'click keypress', function ( e ) {
+                                               if (
+                                                       e.type === 'click' ||
+                                                       e.type === 'keypress' && e.which === 13
+                                               ) {
+                                                       toggleToc();
+                                               }
+                                       } );
 
-                       $tocTitle.append(
-                               $tocToggleLink
-                                       .wrap( '<span class="toctoggle"></span>' )
-                                       .parent()
-                                               .prepend( '&nbsp;[' )
-                                               .append( ']&nbsp;' )
-                       );
+                               $tocTitle.append(
+                                       $tocToggleLink
+                                               .wrap( '<span class="toctoggle"></span>' )
+                                               .parent()
+                                                       .prepend( '&nbsp;[' )
+                                                       .append( ']&nbsp;' )
+                               );
 
-                       if ( hideToc ) {
-                               $tocList.hide();
-                               $toc.addClass( 'tochidden' );
+                               if ( hideToc ) {
+                                       $tocList.hide();
+                                       $this.addClass( 'tochidden' );
+                               }
                        }
-               }
+               } );
        } );
 
 }( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki/mediawiki.user.blockcookie.js b/resources/src/mediawiki/mediawiki.user.blockcookie.js
deleted file mode 100644 (file)
index ffff039..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-( 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 78634f6..67e2ebb 100644 (file)
                 * This function returns the styleSheet object for convience (due to cross-browsers
                 * difference as to where it is located).
                 *
-                *     var sheet = mw.util.addCSS( '.foobar { display: none; }' );
+                *     var sheet = util.addCSS( '.foobar { display: none; }' );
                 *     $( foo ).click( function () {
                 *         // Toggle the sheet on and off
                 *         sheet.disabled = !sheet.disabled;
                 * (e.g. `document.getElementById( 'foobar' )`) or a jQuery-selector
                 * (e.g. `'#foobar'`) for that item.
                 *
-                *     mw.util.addPortletLink(
+                *     util.addPortletLink(
                 *         'p-tb', 'https://www.mediawiki.org/',
                 *         'mediawiki.org', 't-mworg', 'Go to mediawiki.org', 'm', '#t-print'
                 *     );
                 *
-                *     var node = mw.util.addPortletLink(
+                *     var node = util.addPortletLink(
                 *         'p-tb',
                 *         new mw.Title( 'Special:Example' ).getUrl(),
                 *         'Example'
        }, 'Use mw.notify instead.' );
 
        mw.util = util;
+       module.exports = util;
 
 }( mediaWiki, jQuery ) );
index f11bbde..d5a667e 100644 (file)
@@ -1,6 +1,4 @@
 ( function ( mw, $ ) {
-       var supportsPlaceholder = 'placeholder' in document.createElement( 'input' );
-
        // Break out of framesets
        if ( mw.config.get( 'wgBreakFrames' ) ) {
                // Note: In IE < 9 strict comparison to window is non-standard (the standard didn't exist yet)
        mw.hook( 'wikipage.content' ).add( function ( $content ) {
                var $sortable, $collapsible;
 
-               // Run jquery.placeholder polyfill if placeholder is not supported
-               if ( !supportsPlaceholder ) {
-                       $content.find( 'input[placeholder]' ).placeholder();
-               }
-
                $collapsible = $content.find( '.mw-collapsible' );
                if ( $collapsible.length ) {
                        // Preloaded by Skin::getDefaultModules()
        $( function () {
                var $nodes;
 
-               if ( !supportsPlaceholder ) {
-                       // Exclude content to avoid hitting it twice for the (first) wikipage content
-                       $( 'input[placeholder]' ).not( '#mw-content-text input' ).placeholder();
-               }
-
                // Add accesskey hints to the tooltips
                $( '[accesskey]' ).updateTooltipAccessKeys();
 
index 8aba831..bafb86a 100644 (file)
@@ -1,42 +1,44 @@
-/* global moment, mw */
+/* global mediaWiki, moment */
 
-// HACK: Overwrite moment's i18n with MediaWiki's for the current language so that
-// wgTranslateNumerals is respected.
-moment.updateLocale( moment.locale(), {
-       preparse: function ( s ) {
-               var i,
-                       table = mw.language.getDigitTransformTable();
-               if ( mw.config.get( 'wgTranslateNumerals' ) ) {
-                       for ( i = 0; i < 10; i++ ) {
-                               if ( table[ i ] !== undefined ) {
-                                       s = s.replace( new RegExp( mw.RegExp.escape( table[ i ] ), 'g' ), i );
+( function ( mw ) {
+       // HACK: Overwrite moment's i18n with MediaWiki's for the current language so that
+       // wgTranslateNumerals is respected.
+       moment.updateLocale( moment.locale(), {
+               preparse: function ( s ) {
+                       var i,
+                               table = mw.language.getDigitTransformTable();
+                       if ( mw.config.get( 'wgTranslateNumerals' ) ) {
+                               for ( i = 0; i < 10; i++ ) {
+                                       if ( table[ i ] !== undefined ) {
+                                               s = s.replace( new RegExp( mw.RegExp.escape( table[ i ] ), 'g' ), i );
+                                       }
                                }
                        }
-               }
-               // HACK: momentjs replaces commas in some languages, which is the only other use of preparse
-               // aside from digit transformation. We can only override preparse, not extend it, so we
-               // have to replicate the comma replacement functionality here.
-               if ( [ 'ar', 'ar-sa', 'fa' ].indexOf( mw.config.get( 'wgUserLanguage' ) ) !== -1 ) {
-                       s = s.replace( /،/g, ',' );
-               }
-               return s;
-       },
-       postformat: function ( s ) {
-               var i,
-                       table = mw.language.getDigitTransformTable();
-               if ( mw.config.get( 'wgTranslateNumerals' ) ) {
-                       for ( i = 0; i < 10; i++ ) {
-                               if ( table[ i ] !== undefined ) {
-                                       s = s.replace( new RegExp( i, 'g' ), table[ i ] );
+                       // HACK: momentjs replaces commas in some languages, which is the only other use of preparse
+                       // aside from digit transformation. We can only override preparse, not extend it, so we
+                       // have to replicate the comma replacement functionality here.
+                       if ( [ 'ar', 'ar-sa', 'fa' ].indexOf( mw.config.get( 'wgUserLanguage' ) ) !== -1 ) {
+                               s = s.replace( /،/g, ',' );
+                       }
+                       return s;
+               },
+               postformat: function ( s ) {
+                       var i,
+                               table = mw.language.getDigitTransformTable();
+                       if ( mw.config.get( 'wgTranslateNumerals' ) ) {
+                               for ( i = 0; i < 10; i++ ) {
+                                       if ( table[ i ] !== undefined ) {
+                                               s = s.replace( new RegExp( i, 'g' ), table[ i ] );
+                                       }
                                }
                        }
+                       // HACK: momentjs replaces commas in some languages, which is the only other use of postformat
+                       // aside from digit transformation. We can only override postformat, not extend it, so we
+                       // have to replicate the comma replacement functionality here.
+                       if ( [ 'ar', 'ar-sa', 'fa' ].indexOf( mw.config.get( 'wgUserLanguage' ) ) !== -1 ) {
+                               s = s.replace( /,/g, '،' );
+                       }
+                       return s;
                }
-               // HACK: momentjs replaces commas in some languages, which is the only other use of postformat
-               // aside from digit transformation. We can only override postformat, not extend it, so we
-               // have to replicate the comma replacement functionality here.
-               if ( [ 'ar', 'ar-sa', 'fa' ].indexOf( mw.config.get( 'wgUserLanguage' ) ) !== -1 ) {
-                       s = s.replace( /,/g, '،' );
-               }
-               return s;
-       }
-} );
+       } );
+}( mediaWiki ) );
diff --git a/resources/src/polyfill-object-create.js b/resources/src/polyfill-object-create.js
deleted file mode 100644 (file)
index 607faf6..0000000
+++ /dev/null
@@ -1,62 +0,0 @@
-/**
- * Simplified version of es5-sham#Object-create that also works around a bug
- * in the actual es5-sham: https://github.com/es-shims/es5-shim/issues/252
- *
- * Does not:
- * - Support empty inheritance via `Object.create(null)`.
- * - Support getter and setter accessors via `Object.create( .., properties )`.
- * - Support custom property descriptor (e.g. writable, configurtable, enumerable).
- * - Leave behind an enumerable "__proto__" all over the place.
- *
- * @author Timo Tijhof, 2014
- */
-
-// ES5 15.2.3.5
-// http://es5.github.com/#x15.2.3.5
-if ( !Object.create ) {
-       ( function () {
-               var hasOwn = Object.hasOwnProperty,
-                       // https://developer.mozilla.org/en-US/docs/ECMAScript_DontEnum_attribute#JScript_DontEnum_Bug
-                       // http://whattheheadsaid.com/2010/10/a-safer-object-keys-compatibility-implementation
-                       isEnumBug = !{ valueOf: 0 }.propertyIsEnumerable( 'valueOf' );
-
-               // Reusable constructor function for Object.create
-               function Empty() {}
-
-               function defineProperty( object, key, property ) {
-                       if ( hasOwn.call( property, 'value' ) ) {
-                               object[ key ] = property.value;
-                       } else {
-                               object[ key ] = property;
-                       }
-               }
-
-               Object.create = function create( prototype, properties ) {
-                       var object, key;
-
-                       if ( prototype !== Object( prototype ) ) {
-                               throw new TypeError( 'Called on non-object' );
-                       }
-
-                       Empty.prototype = prototype;
-                       object = new Empty();
-
-                       if ( properties !== undefined ) {
-                               if ( !isEnumBug ) {
-                                       for ( key in properties ) {
-                                               if ( hasOwn.call( properties, key ) ) {
-                                                       defineProperty( object, key, properties[ key ] );
-                                               }
-                                       }
-                               } else {
-                                       Object.keys( properties ).forEach( function ( key ) {
-                                               defineProperty( object, key, properties[ key ] );
-                                       } );
-                               }
-                       }
-
-                       return object;
-               };
-
-       }() );
-}
index deb280a..ad06b34 100644 (file)
@@ -15,7 +15,7 @@ var mwPerformance = ( window.performance && performance.mark ) ? performance : {
                        navStart = perf && perf.timing && perf.timing.navigationStart;
                return navStart && typeof perf.now === 'function' ?
                        function () { return navStart + perf.now(); } :
-                       function () { return +new Date(); };
+                       function () { return Date.now(); };
        }() ),
        // eslint-disable-next-line no-unused-vars
        mediaWikiLoadStart = mwNow();
@@ -26,19 +26,19 @@ mwPerformance.mark( 'mwLoadStart' );
  * See <https://www.mediawiki.org/wiki/Compatibility#Browsers>
  *
  * Capabilities required for modern run-time:
+ * - ECMAScript 5
  * - 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 4+
- * - IE 9+
- * - Firefox 3.5+
+ * - Chrome 13+
+ * - IE 10+
+ * - Firefox 4+
  * - Safari 5+
- * - Opera 10.5+
- * - Mobile Safari (iOS 4+)
- * - Android 2.0+
+ * - Opera 12.10+
+ * - Mobile Safari 5.1+ (iOS 5+)
+ * - Android 4.1+
  *
  * Browsers we support in our no-javascript run-time (Grade C):
  * - Chrome 1+
@@ -46,6 +46,8 @@ mwPerformance.mark( 'mwLoadStart' );
  * - Firefox 3+
  * - Safari 3+
  * - Opera 10+
+ * - Mobile Safari 5.0+ (iOS 4+)
+ * - Android 2.0+
  * - WebOS < 1.5
  * - PlayStation
  * - Symbian-based browsers
@@ -64,6 +66,14 @@ mwPerformance.mark( 'mwLoadStart' );
 function isCompatible( str ) {
        var ua = str || navigator.userAgent;
        return !!(
+               // http://caniuse.com/#feat=es5
+               // http://caniuse.com/#feat=use-strict
+               // http://caniuse.com/#feat=json / https://phabricator.wikimedia.org/T141344#2784065
+               ( function () {
+                       'use strict';
+                       return !this && !!Function.prototype.bind && !!window.JSON;
+               }() ) &&
+
                // http://caniuse.com/#feat=queryselector
                'querySelector' in document &&
 
@@ -75,10 +85,6 @@ function isCompatible( str ) {
                // http://caniuse.com/#feat=addeventlistener
                '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.
                // Note: Please extend the regex instead of adding new ones
index 5ce0b34..784c29c 100644 (file)
@@ -93,7 +93,7 @@ class DbTestPreviewer extends TestRecorder {
                                        $before = 'n';
                                } elseif ( $prevResults[$test] == 1 ) {
                                        $before = 'p';
-                               } else /* if ( $prevResults[$test] == 0 )*/ {
+                               } else /* if ( $prevResults[$test] == 0 ) */ {
                                        $before = 'f';
                                }
 
@@ -101,7 +101,7 @@ class DbTestPreviewer extends TestRecorder {
                                        $after = 'n';
                                } elseif ( $this->results[$test] == 1 ) {
                                        $after = 'p';
-                               } else /*if ( $this->results[$test] == 0 ) */ {
+                               } else /* if ( $this->results[$test] == 0 ) */ {
                                        $after = 'f';
                                }
 
index 04a2a8d..f68f595 100644 (file)
  * @ingroup Testing
  */
 
+use Wikimedia\Rdbms\IMaintainableDatabase;
+
 class DbTestRecorder extends TestRecorder {
        public $version;
+       /** @var Database */
        private $db;
 
-       public function __construct( IDatabase $db ) {
+       public function __construct( IMaintainableDatabase $db ) {
                $this->db = $db;
        }
 
index 35c2480..f100411 100644 (file)
@@ -25,6 +25,7 @@
  * @file
  * @ingroup Testing
  */
+use Wikimedia\Rdbms\IDatabase;
 use MediaWiki\MediaWikiServices;
 use Wikimedia\ScopedCallback;
 
index be6e3a8..e12c136 100644 (file)
@@ -8015,10 +8015,10 @@ title=[[Bug462]]
 !! wikitext
 [[Bu&#103;462]] [[Bug462]]
 !! html/php
-<p><strong class="selflink">Bu&#103;462</strong> <strong class="selflink">Bug462</strong>
+<p><a class="mw-selflink selflink">Bu&#103;462</a> <a class="mw-selflink selflink">Bug462</a>
 </p>
 !! html/php+tidy
-<p><strong class="selflink">Bug462</strong> <strong class="selflink">Bug462</strong></p>
+<p><a class="mw-selflink selflink">Bug462</a> <a class="mw-selflink selflink">Bug462</a></p>
 !! html/parsoid
 <p><a rel="mw:WikiLink" href="./Bug462" title="Bug462">Bug462</a> <a rel="mw:WikiLink" href="./Bug462" title="Bug462">Bug462</a></p>
 !! end
@@ -8047,7 +8047,7 @@ title=[[0]]
 !! wikitext
 [[0]]
 !! html
-<p><strong class="selflink">0</strong>
+<p><a class="mw-selflink selflink">0</a>
 </p>
 !!end
 
@@ -8503,7 +8503,7 @@ parsoid=wt2html,wt2wt,html2html
 !! wikitext
 [[local:Main Page]]
 !! html/php
-<p><strong class="selflink">local:Main Page</strong>
+<p><a class="mw-selflink selflink">local:Main Page</a>
 </p>
 !! html/parsoid
 <p><a rel="mw:WikiLink" href="./Main_Page" title="Main Page">local:Main Page</a></p>
@@ -9962,9 +9962,10 @@ Magic Words LOCAL (UTC)
 Magic Word: {{FULLPAGENAME}}
 !! options
 title=[[User:Ævar Arnfjörð Bjarmason]]
+parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true }
 !! wikitext
 {{FULLPAGENAME}}
-!! html
+!! html/*
 <p>User:Ævar Arnfjörð Bjarmason
 </p>
 !! end
@@ -9973,9 +9974,10 @@ title=[[User:Ævar Arnfjörð Bjarmason]]
 Magic Word: {{FULLPAGENAMEE}}
 !! options
 title=[[User:Ævar Arnfjörð Bjarmason]]
+parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true }
 !! wikitext
 {{FULLPAGENAMEE}}
-!! html
+!! html/*
 <p>User:%C3%86var_Arnfj%C3%B6r%C3%B0_Bjarmason
 </p>
 !! end
@@ -9984,9 +9986,10 @@ title=[[User:Ævar Arnfjörð Bjarmason]]
 Magic Word: {{TALKSPACE}}
 !! options
 title=[[User:Ævar Arnfjörð Bjarmason]]
+parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true }
 !! wikitext
 {{TALKSPACE}}
-!! html
+!! html/*
 <p>User talk
 </p>
 !! end
@@ -9995,9 +9998,10 @@ title=[[User:Ævar Arnfjörð Bjarmason]]
 Magic Word: {{TALKSPACE}}, same namespace
 !! options
 title=[[User talk:Ævar Arnfjörð Bjarmason]]
+parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true }
 !! wikitext
 {{TALKSPACE}}
-!! html
+!! html/*
 <p>User talk
 </p>
 !! end
@@ -10006,9 +10010,10 @@ title=[[User talk:Ævar Arnfjörð Bjarmason]]
 Magic Word: {{TALKSPACE}}, main namespace
 !! options
 title=[[Parser Test]]
+parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true }
 !! wikitext
 {{TALKSPACE}}
-!! html
+!! html/*
 <p>Talk
 </p>
 !! end
@@ -10017,9 +10022,10 @@ title=[[Parser Test]]
 Magic Word: {{TALKSPACEE}}
 !! options
 title=[[User:Ævar Arnfjörð Bjarmason]]
+parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true }
 !! wikitext
 {{TALKSPACEE}}
-!! html
+!! html/*
 <p>User_talk
 </p>
 !! end
@@ -10028,9 +10034,10 @@ title=[[User:Ævar Arnfjörð Bjarmason]]
 Magic Word: {{SUBJECTSPACE}}
 !! options
 title=[[User talk:Ævar Arnfjörð Bjarmason]]
+parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true }
 !! wikitext
 {{SUBJECTSPACE}}
-!! html
+!! html/*
 <p>User
 </p>
 !! end
@@ -10039,9 +10046,10 @@ title=[[User talk:Ævar Arnfjörð Bjarmason]]
 Magic Word: {{SUBJECTSPACE}}, same namespace
 !! options
 title=[[User:Ævar Arnfjörð Bjarmason]]
+parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true }
 !! wikitext
 {{SUBJECTSPACE}}
-!! html
+!! html/*
 <p>User
 </p>
 !! end
@@ -10050,9 +10058,10 @@ title=[[User:Ævar Arnfjörð Bjarmason]]
 Magic Word: {{SUBJECTSPACE}}, main namespace
 !! options
 title=[[Parser Test]]
+parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true }
 !! wikitext
 {{SUBJECTSPACE}}
-!! html
+!! html/*
 
 !! end
 
@@ -10060,9 +10069,10 @@ title=[[Parser Test]]
 Magic Word: {{SUBJECTSPACEE}}
 !! options
 title=[[User talk:Ævar Arnfjörð Bjarmason]]
+parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true }
 !! wikitext
 {{SUBJECTSPACEE}}
-!! html
+!! html/*
 <p>User
 </p>
 !! end
@@ -10071,9 +10081,10 @@ title=[[User talk:Ævar Arnfjörð Bjarmason]]
 Magic Word: {{NAMESPACE}}
 !! options
 title=[[User:Ævar Arnfjörð Bjarmason]]
+parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true }
 !! wikitext
 {{NAMESPACE}}
-!! html
+!! html/*
 <p>User
 </p>
 !! end
@@ -10082,9 +10093,10 @@ title=[[User:Ævar Arnfjörð Bjarmason]]
 Magic Word: {{NAMESPACEE}}
 !! options
 title=[[User:Ævar Arnfjörð Bjarmason]]
+parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true }
 !! wikitext
 {{NAMESPACEE}}
-!! html
+!! html/*
 <p>User
 </p>
 !! end
@@ -10093,9 +10105,10 @@ title=[[User:Ævar Arnfjörð Bjarmason]]
 Magic Word: {{NAMESPACENUMBER}}
 !! options
 title=[[User:Ævar Arnfjörð Bjarmason]]
+parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true }
 !! wikitext
 {{NAMESPACENUMBER}}
-!! html
+!! html/*
 <p>2
 </p>
 !! end
@@ -10104,9 +10117,10 @@ title=[[User:Ævar Arnfjörð Bjarmason]]
 Magic Word: {{SUBPAGENAME}}
 !! options
 title=[[Ævar Arnfjörð Bjarmason/sub ö]] subpage
+parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true }
 !! wikitext
 {{SUBPAGENAME}}
-!! html
+!! html/*
 <p>sub ö
 </p>
 !! end
@@ -10115,9 +10129,10 @@ title=[[Ævar Arnfjörð Bjarmason/sub ö]] subpage
 Magic Word: {{SUBPAGENAMEE}}
 !! options
 title=[[Ævar Arnfjörð Bjarmason/sub ö]] subpage
+parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true }
 !! wikitext
 {{SUBPAGENAMEE}}
-!! html
+!! html/*
 <p>sub_%C3%B6
 </p>
 !! end
@@ -10126,9 +10141,10 @@ title=[[Ævar Arnfjörð Bjarmason/sub ö]] subpage
 Magic Word: {{ROOTPAGENAME}}
 !! options
 title=[[Ævar Arnfjörð Bjarmason/sub/sub2]] subpage
+parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true }
 !! wikitext
 {{ROOTPAGENAME}}
-!! html
+!! html/*
 <p>Ævar Arnfjörð Bjarmason
 </p>
 !! end
@@ -10137,9 +10153,10 @@ title=[[Ævar Arnfjörð Bjarmason/sub/sub2]] subpage
 Magic Word: {{ROOTPAGENAMEE}}
 !! options
 title=[[Ævar Arnfjörð Bjarmason/sub/sub2]] subpage
+parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true }
 !! wikitext
 {{ROOTPAGENAMEE}}
-!! html
+!! html/*
 <p>%C3%86var_Arnfj%C3%B6r%C3%B0_Bjarmason
 </p>
 !! end
@@ -10148,9 +10165,10 @@ title=[[Ævar Arnfjörð Bjarmason/sub/sub2]] subpage
 Magic Word: {{BASEPAGENAME}}
 !! options
 title=[[Ævar Arnfjörð Bjarmason/sub]] subpage
+parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true }
 !! wikitext
 {{BASEPAGENAME}}
-!! html
+!! html/*
 <p>Ævar Arnfjörð Bjarmason
 </p>
 !! end
@@ -10159,9 +10177,10 @@ title=[[Ævar Arnfjörð Bjarmason/sub]] subpage
 Magic Word: {{BASEPAGENAMEE}}
 !! options
 title=[[Ævar Arnfjörð Bjarmason/sub]] subpage
+parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true }
 !! wikitext
 {{BASEPAGENAMEE}}
-!! html
+!! html/*
 <p>%C3%86var_Arnfj%C3%B6r%C3%B0_Bjarmason
 </p>
 !! end
@@ -10170,9 +10189,10 @@ title=[[Ævar Arnfjörð Bjarmason/sub]] subpage
 Magic Word: {{TALKPAGENAME}}
 !! options
 title=[[User:Ævar Arnfjörð Bjarmason]]
+parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true }
 !! wikitext
 {{TALKPAGENAME}}
-!! html
+!! html/*
 <p>User talk:Ævar Arnfjörð Bjarmason
 </p>
 !! end
@@ -10181,9 +10201,10 @@ title=[[User:Ævar Arnfjörð Bjarmason]]
 Magic Word: {{TALKPAGENAMEE}}
 !! options
 title=[[User:Ævar Arnfjörð Bjarmason]]
+parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true }
 !! wikitext
 {{TALKPAGENAMEE}}
-!! html
+!! html/*
 <p>User_talk:%C3%86var_Arnfj%C3%B6r%C3%B0_Bjarmason
 </p>
 !! end
@@ -10192,9 +10213,10 @@ title=[[User:Ævar Arnfjörð Bjarmason]]
 Magic Word: {{SUBJECTPAGENAME}}
 !! options
 title=[[User talk:Ævar Arnfjörð Bjarmason]]
+parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true }
 !! wikitext
 {{SUBJECTPAGENAME}}
-!! html
+!! html/*
 <p>User:Ævar Arnfjörð Bjarmason
 </p>
 !! end
@@ -10203,18 +10225,21 @@ title=[[User talk:Ævar Arnfjörð Bjarmason]]
 Magic Word: {{SUBJECTPAGENAMEE}}
 !! options
 title=[[User talk:Ævar Arnfjörð Bjarmason]]
+parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true }
 !! wikitext
 {{SUBJECTPAGENAMEE}}
-!! html
+!! html/*
 <p>User:%C3%86var_Arnfj%C3%B6r%C3%B0_Bjarmason
 </p>
 !! end
 
 !! test
 Magic Word: {{NUMBEROFFILES}}
+!! options
+parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true }
 !! wikitext
 {{NUMBEROFFILES}}
-!! html
+!! html/*
 <p>7
 </p>
 !! end
@@ -10223,9 +10248,10 @@ Magic Word: {{NUMBEROFFILES}}
 Magic Word: {{PAGENAME}}
 !! options
 title=[[User:Ævar Arnfjörð Bjarmason]]
+parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true }
 !! wikitext
 {{PAGENAME}}
-!! html
+!! html/*
 <p>Ævar Arnfjörð Bjarmason
 </p>
 !! end
@@ -10234,6 +10260,7 @@ title=[[User:Ævar Arnfjörð Bjarmason]]
 Magic Word: {{PAGENAME}} with metacharacters
 !! options
 title=[['foo & bar = baz']]
+parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true }
 !! wikitext
 ''{{PAGENAME}}''
 !! html/php
@@ -10247,6 +10274,7 @@ title=[['foo & bar = baz']]
 Magic Word: {{PAGENAME}} with metacharacters (T28781)
 !! options
 title=[[*RFC 1234 http://example.com/]]
+parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true }
 !! wikitext
 {{PAGENAME}}
 !! html/php
@@ -10260,9 +10288,10 @@ title=[[*RFC 1234 http://example.com/]]
 Magic Word: {{PAGENAMEE}}
 !! options
 title=[[User:Ævar Arnfjörð Bjarmason]]
+parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true }
 !! wikitext
 {{PAGENAMEE}}
-!! html
+!! html/*
 <p>%C3%86var_Arnfj%C3%B6r%C3%B0_Bjarmason
 </p>
 !! end
@@ -10271,6 +10300,7 @@ title=[[User:Ævar Arnfjörð Bjarmason]]
 Magic Word: {{PAGENAMEE}} with metacharacters (T28781)
 !! options
 title=[[*RFC 1234 http://example.com/]]
+parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true }
 !! wikitext
 {{PAGENAMEE}}
 !! html/php
@@ -10282,53 +10312,65 @@ title=[[*RFC 1234 http://example.com/]]
 
 !! test
 Magic Word: {{REVISIONID}}
+!! options
+parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true }
 !! wikitext
 {{REVISIONID}}
-!! html
+!! html/*
 <p>1337
 </p>
 !! end
 
 !! test
 Magic Word: {{SCRIPTPATH}}
+!! options
+parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true }
 !! wikitext
 {{SCRIPTPATH}}
-!! html
+!! html/*
 
 !! end
 
 !! test
 Magic Word: {{STYLEPATH}}
+!! options
+parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true }
 !! wikitext
 {{STYLEPATH}}
-!! html
+!! html/*
 <p>/skins
 </p>
 !! end
 
 !! test
 Magic Word: {{SERVER}}
+!! options
+parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true }
 !! wikitext
 {{SERVER}}
-!! html
+!! html/*
 <p><a rel="nofollow" class="external free" href="http://example.org">http://example.org</a>
 </p>
 !! end
 
 !! test
 Magic Word: {{SERVERNAME}}
+!! options
+parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true }
 !! wikitext
 {{SERVERNAME}}
-!! html
+!! html/*
 <p>example.org
 </p>
 !! end
 
 !! test
 Magic Word: {{SITENAME}}
+!! options
+parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true }
 !! wikitext
 {{SITENAME}}
-!! html
+!! html/*
 <p>MediaWiki
 </p>
 !! end
@@ -10337,18 +10379,21 @@ Magic Word: {{SITENAME}}
 Magic Word: {{PAGELANGUAGE}}
 !! options
 language=fr
+parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true }
 !! wikitext
 {{PAGELANGUAGE}}
-!! html
+!! html/*
 <p>fr
 </p>
 !! end
 
 !! test
 Magic Word: {{PAGELANGUAGE}} on a page with no explicitly set language
+!! options
+parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true }
 !! wikitext
 {{PAGELANGUAGE}}
-!! html
+!! html/*
 <p>en
 </p>
 !! end
@@ -13745,7 +13790,7 @@ Manually-specified thumbnail image
 !! options
 thumbsize=220
 !! wikitext
-[[File:Foobar.jpg|thumb=Thumb.png|Title]]
+[[File:Foobar.jpg|thumbnail=Thumb.png|Title]]
 !! html/php
 <div class="thumb tright"><div class="thumbinner" style="width:137px;"><a href="/wiki/File:Foobar.jpg"><img alt="" src="http://example.com/images/e/ea/Thumb.png" width="135" height="135" class="thumbimage" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"></a></div>Title</div></div></div>
 
@@ -15413,7 +15458,7 @@ Section headings with TOC
 Some text
 ===Another headline===
 !! html
-<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle" class="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#Headline_1"><span class="tocnumber">1</span> <span class="toctext">Headline 1</span></a>
 <ul>
@@ -15456,7 +15501,7 @@ __FORCETOC__
 == Headline 2 ==
 == Headline ==
 !! html/php
-<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle" class="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#Headline_2"><span class="tocnumber">1</span> <span class="toctext">Headline 2</span></a></li>
 <li class="toclevel-1 tocsection-2"><a href="#Headline"><span class="tocnumber">2</span> <span class="toctext">Headline</span></a></li>
@@ -15487,7 +15532,7 @@ Handling of sections up to level 6 and beyond
 ========= Level 9 Heading=========
 ========== Level 10 Heading==========
 !! html
-<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle" class="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#Level_1_Heading"><span class="tocnumber">1</span> <span class="toctext">Level 1 Heading</span></a>
 <ul>
@@ -15540,7 +15585,7 @@ TOC regression (T11764)
 == title 2 ==
 === title 2.1 ===
 !! html
-<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle" class="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#title_1"><span class="tocnumber">1</span> <span class="toctext">title 1</span></a>
 <ul>
@@ -15575,7 +15620,7 @@ TOC for heading containing <span id="..."></span> (T96153)
 __FORCETOC__
 ==<span id="old-anchor"></span>New title==
 !! html/php
-<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle" class="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#New_title"><span class="tocnumber">1</span> <span class="toctext">New title</span></a></li>
 </ul>
@@ -15597,7 +15642,7 @@ wgMaxTocLevel=3
 == title 2 ==
 === title 2.1 ===
 !! html
-<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle" class="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#title_1"><span class="tocnumber">1</span> <span class="toctext">title 1</span></a>
 <ul>
@@ -15633,7 +15678,7 @@ wgMaxTocLevel=3
 ====Section 1.1.1.1====
 ==Section 2==
 !! html
-<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle" class="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#Section_1"><span class="tocnumber">1</span> <span class="toctext">Section 1</span></a>
 <ul>
@@ -15726,7 +15771,7 @@ __TOC__
 === title 1.1 ===
 == title 2 ==
 !! html
-<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle" class="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#title_1"><span class="tocnumber">1</span> <span class="toctext">title 1</span></a>
 <ul>
@@ -15793,7 +15838,7 @@ section 5
 !! html
 <p>The tooltips shall not show entities to the user (ie. be double escaped)
 </p>
-<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle" class="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#text_.3E_text"><span class="tocnumber">1</span> <span class="toctext">text &gt; text</span></a></li>
 <li class="toclevel-1 tocsection-2"><a href="#text_.3C_text"><span class="tocnumber">2</span> <span class="toctext">text &lt; text</span></a></li>
@@ -15852,7 +15897,7 @@ section 6
 !! html
 <p>Id should not contain + for spaces
 </p>
-<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle" class="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#Space_between_Text"><span class="tocnumber">1</span> <span class="toctext">Space between Text</span></a></li>
 <li class="toclevel-1 tocsection-2"><a href="#Space-Entity_between_Text"><span class="tocnumber">2</span> <span class="toctext">Space-Entity&#32;between&#32;Text</span></a></li>
@@ -15898,7 +15943,7 @@ Headers with excess '=' characters
 =''italic'' heading==
 ==''italic'' heading=
 !! html
-<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle" class="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#foo.3D"><span class="tocnumber">1</span> <span class="toctext">foo=</span></a></li>
 <li class="toclevel-1 tocsection-2"><a href="#.3Dfoo"><span class="tocnumber">2</span> <span class="toctext">=foo</span></a></li>
@@ -15928,7 +15973,7 @@ HTML headers vs TOC (T25393)
 == Header 2.2 ==
 __NOEDITSECTION__
 !! html
-<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle" class="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1"><a href="#Header_1"><span class="tocnumber">1</span> <span class="toctext">Header 1</span></a>
 <ul>
@@ -17706,7 +17751,7 @@ Fuzz testing: Parser14
 http://__TOC__
 !! html
 <h2><span class="mw-headline" id="onmouseover.3D">onmouseover=</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: onmouseover=">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
-http://<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
+http://<div id="toc" class="toc"><div id="toctitle" class="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#onmouseover.3D"><span class="tocnumber">1</span> <span class="toctext">onmouseover=</span></a></li>
 </ul>
@@ -17717,7 +17762,7 @@ http://<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
 <h2><span class="mw-headline" id="onmouseover.3D">onmouseover=</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: onmouseover=">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 <p>http://</p>
 <div id="toc" class="toc">
-<div id="toctitle">
+<div id="toctitle" class="toctitle">
 <h2>Contents</h2>
 </div>
 <ul>
@@ -19069,6 +19114,27 @@ title=[[Parser test]]
 !! end
 ### Note: Above tests excludes the "{{NUMBEROFADMINS}}" magic word because it generates a MySQL error when included.
 
+!! test
+Gallery with valid attributes
+!! wikitext
+<gallery type="123" summary="345">
+File:File:Foobar.jpg
+</gallery>
+!! html/php
+<ul class="gallery mw-gallery-traditional" type="123">
+               <li class="gallerybox" style="width: 155px"><div style="width: 155px">
+                       <div class="thumb" style="height: 150px;">File:Foobar.jpg</div>
+                       <div class="gallerytext">
+                       </div>
+               </div></li>
+</ul>
+
+!! html/parsoid
+<ul class="gallery mw-gallery-traditional" type="123" typeof="mw:Extension/gallery" about="#mwt2" data-mw='{"name":"gallery","attrs":{"type":"123","summary":"345"},"body":{"extsrc":"\nFile:File:Foobar.jpg\n"}}'>
+<li class="gallerybox" style="width: 155px;"><div class="thumb" style="width: 150px; height: 150px;"><span style="display: inline-block; height: 100%; vertical-align: middle;"></span><span style="vertical-align: middle; display: inline-block;">File:File:Foobar.jpg</span></div><div class="gallerytext"></div></li>
+</ul>
+!! end
+
 ## Parsoid thinks the "centre" here is a property, not a caption.
 !! test
 Gallery
@@ -19613,6 +19679,56 @@ File:Test.png
 </gallery>
 !! end
 
+!! test
+Gallery with class and style attributes
+!! options
+parsoid={
+  "nativeGallery": true
+}
+!! wikitext
+<gallery class="center" style="text-align: center;">
+File:Foobar.jpg
+</gallery>
+!! html/php
+<ul class="gallery mw-gallery-traditional center" style="text-align: center;">
+               <li class="gallerybox" style="width: 155px"><div style="width: 155px">
+                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
+                       <div class="gallerytext">
+                       </div>
+               </div></li>
+</ul>
+
+!! html/parsoid
+<ul class="gallery mw-gallery-traditional center" style="text-align: center;" typeof="mw:Extension/gallery" about="#mwt2" data-mw='{"name":"gallery","attrs":{"class":"center","style":"text-align: center;"},"body":{}}'>
+<li class="gallerybox" style="width: 155px;"><div class="thumb" style="width: 150px; height: 150px;"><span style="display: inline-block; height: 100%; vertical-align: middle;"></span><span typeof="mw:Image" style="vertical-align: middle; display: inline-block;"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="14" width="120"/></a></span></div><div class="gallerytext"></div></li>
+</ul>
+!! end
+
+!! test
+Gallery in slideshow mode
+!! options
+parsoid={
+  "nativeGallery": true
+}
+!! wikitext
+<gallery mode="slideshow" showthumbnails="">
+File:Foobar.jpg
+</gallery>
+!! html/php
+<ul class="gallery mw-gallery-slideshow" data-showthumbnails="1">
+               <li class="gallerybox" style="width: 155px"><div style="width: 155px">
+                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/240px-Foobar.jpg 2x" /></a></div></div>
+                       <div class="gallerytext">
+                       </div>
+               </div></li>
+</ul>
+
+!! html/parsoid
+<ul class="gallery mw-gallery-slideshow" data-showthumbnails="1" typeof="mw:Extension/gallery" about="#mwt2" data-mw='{"name":"gallery","attrs":{"mode":"slideshow","showthumbnails":""},"body":{}}'>
+<li class="gallerybox" style="width: 155px;"><div class="thumb" style="width: 150px;"><span typeof="mw:Image"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="14" width="120"/></a></span></div><div class="gallerytext"></div></li>
+</ul>
+!! end
+
 !! test
 HTML Hex character encoding (spells the word "JavaScript")
 !! options
@@ -20129,7 +20245,7 @@ Out-of-order TOC heading levels
 =====5=====
 ==2==
 !! html
-<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle" class="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#2"><span class="tocnumber">1</span> <span class="toctext">2</span></a>
 <ul>
@@ -20327,7 +20443,7 @@ title=[[Dunav]] language=sr
 !! wikitext
 Both [[Dunav]] and [[Дунав]] are names for this river.
 !! html
-<p>Both <strong class="selflink">Dunav</strong> and <strong class="selflink">Дунав</strong> are names for this river.
+<p>Both <a class="mw-selflink selflink">Dunav</a> and <a class="mw-selflink selflink">Дунав</a> are names for this river.
 </p>
 !!end
 
@@ -20344,7 +20460,7 @@ title=[[Duna]] language=sr
 !! wikitext
 [[Дуна]] is not a self-link while [[Duna]] and [[Dуна]] are still self-links.
 !! html
-<p><a href="/wiki/%D0%94%D1%83%D0%BD%D0%B0" title="Дуна">Дуна</a> is not a self-link while <strong class="selflink">Duna</strong> and <strong class="selflink">Dуна</strong> are still self-links.
+<p><a href="/wiki/%D0%94%D1%83%D0%BD%D0%B0" title="Дуна">Дуна</a> is not a self-link while <a class="mw-selflink selflink">Duna</a> and <a class="mw-selflink selflink">Dуна</a> are still self-links.
 </p>
 !! end
 
@@ -20355,7 +20471,7 @@ title=[[Duna]] language=sr
 !! wikitext
 [[Dуна]] is a self-link while [[Dunа#Foo]] and [[Dуна#Foo]] are not self-links.
 !! html
-<p><strong class="selflink">Dуна</strong> is a self-link while <a href="/wiki/%D0%94%D1%83%D0%BD%D0%B0" title="Дуна">Dunа#Foo</a> and <a href="/wiki/%D0%94%D1%83%D0%BD%D0%B0" title="Дуна">Dуна#Foo</a> are not self-links.
+<p><a class="mw-selflink selflink">Dуна</a> is a self-link while <a href="/wiki/%D0%94%D1%83%D0%BD%D0%B0" title="Дуна">Dunа#Foo</a> and <a href="/wiki/%D0%94%D1%83%D0%BD%D0%B0" title="Дуна">Dуна#Foo</a> are not self-links.
 </p>
 !! end
 
@@ -21793,7 +21909,7 @@ showindicators
 !! wikitext
 <indicator name=" "></indicator>
 <indicator></indicator>
-!! html
+!! html/php
 <p><span class="error"><strong>Error:</strong> Page status indicators' <code>name</code> attribute must not be empty.</span>
 <span class="error"><strong>Error:</strong> Page status indicators' <code>name</code> attribute must not be empty.</span>
 </p>
@@ -21806,7 +21922,7 @@ showindicators
 !! wikitext
 <indicator name="empty" />
 <indicator name="name"></indicator>
-!! html
+!! html/php
 empty=
 name=
 <p><br />
@@ -21833,7 +21949,7 @@ showindicators
 <indicator name="10">Two
 
 paragraphs</indicator>
-!! html
+!! html/php
 01=hello world
 02=<a href="/wiki/Main_Page" title="Main Page">Main Page</a>
 03=<img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/25px-Foobar.jpg" width="25" height="3" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/38px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/50px-Foobar.jpg 2x" />
@@ -22111,7 +22227,7 @@ title=[[Main Page]]
 __TOC__
 == ''Lost'' episodes ==
 !! html
-<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle" class="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#Lost_episodes"><span class="tocnumber">1</span> <span class="toctext"><i>Lost</i> episodes</span></a></li>
 </ul>
@@ -22129,7 +22245,7 @@ title=[[Main Page]]
 __TOC__
 == '''should be bold''' then normal text ==
 !! html
-<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle" class="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#should_be_bold_then_normal_text"><span class="tocnumber">1</span> <span class="toctext"><b>should be bold</b> then normal text</span></a></li>
 </ul>
@@ -22147,7 +22263,7 @@ title=[[Main Page]]
 __TOC__
 == Image [[Image:foobar.jpg]] ==
 !! html
-<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle" class="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#Image"><span class="tocnumber">1</span> <span class="toctext">Image</span></a></li>
 </ul>
@@ -22165,7 +22281,7 @@ title=[[Main Page]]
 __TOC__
 == <blockquote>Quote</blockquote> ==
 !! html
-<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle" class="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#Quote"><span class="tocnumber">1</span> <span class="toctext">Quote</span></a></li>
 </ul>
@@ -22176,7 +22292,7 @@ __TOC__
 !! html+tidy
 <p></p>
 <div id="toc" class="toc">
-<div id="toctitle">
+<div id="toctitle" class="toctitle">
 <h2>Contents</h2>
 </div>
 <ul>
@@ -22201,7 +22317,7 @@ __TOC__
 <small>Hanc marginis exiguitas non caperet.</small>
 QED
 !! html
-<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle" class="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#Proof:_2_.3C_3"><span class="tocnumber">1</span> <span class="toctext">Proof: 2 &lt; 3</span></a></li>
 </ul>
@@ -22221,7 +22337,7 @@ __TOC__
 
 == <i>Foo</i> <blockquote>Bar</blockquote> ==
 !! html
-<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle" class="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#Foo_Bar"><span class="tocnumber">1</span> <span class="toctext"><i>Foo</i> <b>Bar</b></span></a></li>
 <li class="toclevel-1 tocsection-2"><a href="#Foo_Bar_2"><span class="tocnumber">2</span> <span class="toctext"><i>Foo</i> Bar</span></a></li>
@@ -22234,7 +22350,7 @@ __TOC__
 !! html+tidy
 <p></p>
 <div id="toc" class="toc">
-<div id="toctitle">
+<div id="toctitle" class="toctitle">
 <h2>Contents</h2>
 </div>
 <ul>
@@ -22263,7 +22379,7 @@ __TOC__
 
 == <sup class="a > b">Evilbye</sup> ==
 !! html/php
-<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle" class="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#Hello"><span class="tocnumber">1</span> <span class="toctext"><sup>Hello</sup></span></a></li>
 <li class="toclevel-1 tocsection-2"><a href="#b.22.3EEvilbye"><span class="tocnumber">2</span> <span class="toctext"><sup> b"&gt;Evilbye</sup></span></a></li>
@@ -22294,7 +22410,7 @@ __TOC__
 
 == <span dir="ltr" style="font-style: italic">Attributes after dir on these span tags must be deleted from the TOC</span> ==
 !! html
-<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle" class="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#C.2B.2B"><span class="tocnumber">1</span> <span class="toctext"><span dir="ltr">C++</span></span></a></li>
 <li class="toclevel-1 tocsection-2"><a href="#.D7.96.D7.91.D7.A0.D7.92.21"><span class="tocnumber">2</span> <span class="toctext"><span dir="rtl">זבנג!</span></span></a></li>
@@ -22318,7 +22434,7 @@ T74884: bdi element in ToC
 __TOC__
 == <bdi>test</bdi> ==
 !! html
-<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle" class="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#test"><span class="tocnumber">1</span> <span class="toctext"><bdi>test</bdi></span></a></li>
 </ul>
@@ -22334,7 +22450,7 @@ T35715: s/strike element in ToC
 __TOC__
 == <s>test</s> test <strike>test</strike> ==
 !! html
-<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle" class="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#test_test_test"><span class="tocnumber">1</span> <span class="toctext"><s>test</s> test <strike>test</strike></span></a></li>
 </ul>
@@ -22353,7 +22469,7 @@ Empty <p> tag in TOC, removed by Sanitizer (T92892)
 __TOC__
 == x ==
 !! html
-<div id="toc" class="toc"><div id="toctitle"><h2>Contents</h2></div>
+<div id="toc" class="toc"><div id="toctitle" class="toctitle"><h2>Contents</h2></div>
 <ul>
 <li class="toclevel-1 tocsection-1"><a href="#x"><span class="tocnumber">1</span> <span class="toctext">x</span></a></li>
 </ul>
@@ -22364,7 +22480,7 @@ __TOC__
 !! html+tidy
 <p></p>
 <div id="toc" class="toc">
-<div id="toctitle">
+<div id="toctitle" class="toctitle">
 <h2>Contents</h2>
 </div>
 <ul>
@@ -22746,14 +22862,12 @@ parsoid={
 ## recognized as an extension tag w/o a native handler.
 !! test
 LST Sections: Newfangled approach
-!! options
-parsoid={ "suppressErrors": true }
 !! wikitext
 <section begin="2011-05-16" />
 <section end="2014-04-10 (MW 1.23wmf22)" />
 !! html/parsoid
-<p><span typeof="mw:Extension/section" about="#mwt1" data-parsoid='{"stx":"html","selfClose":true,"src":"&lt;section begin=\"2011-05-16\" />","tagWidths":[30,0]}'>&lt;section begin="2011-05-16" /></span>
-<span typeof="mw:Extension/section" about="#mwt2" data-parsoid='{"stx":"html","selfClose":true,"src":"&lt;section end=\"2014-04-10 (MW 1.23wmf22)\" />","tagWidths":[43,0]}'>&lt;section end="2014-04-10 (MW 1.23wmf22)" /></span></p>
+<p><span typeof="mw:Error mw:Extension/section" about="#mwt1" data-mw='{"name":"section","attrs":{"begin":"2011-05-16"},"body":null,"errors":[{"key":"mw-api-extexpand-error","message":"Could not expand extension source."}]}'>&lt;section begin="2011-05-16" /></span>
+<span typeof="mw:Error mw:Extension/section" about="#mwt2" data-mw='{"name":"section","attrs":{"end":"2014-04-10 (MW 1.23wmf22)"},"body":null,"errors":[{"key":"mw-api-extexpand-error","message":"Could not expand extension source."}]}'>&lt;section end="2014-04-10 (MW 1.23wmf22)" /></span></p>
 !! end
 
 #--------- Test stripping of empty nodes in template content ----------
@@ -23780,7 +23894,8 @@ Links 4. ExtLinks: Escapes needed
 parsoid=html2wt
 !! html/parsoid
 <p><a rel="mw:ExtLink" href="http://google.com">[google]</a>
-<a rel="mw:ExtLink" href="http://google.com">google]</a></p>
+<a rel="mw:ExtLink" href="http://google.com">google]</a>
+<a rel="mw:ExtLink" href="http://google.com">goog] le</a></p>
 <p>[http://google.com]</p>
 <p>[http://google.com google]</p>
 <p>[<a rel="mw:ExtLink" href="http://google.com">http://google.com</a>]</p>
@@ -23788,6 +23903,7 @@ parsoid=html2wt
 !! wikitext
 [http://google.com <nowiki>[google]</nowiki>]
 [http://google.com <nowiki>google]</nowiki>]
+[http://google.com <nowiki>goog] le</nowiki>]
 
 <nowiki>[http://google.com]</nowiki>
 
@@ -23799,6 +23915,7 @@ parsoid=html2wt
 !! html/php
 <p><a rel="nofollow" class="external text" href="http://google.com">[google]</a>
 <a rel="nofollow" class="external text" href="http://google.com">google]</a>
+<a rel="nofollow" class="external text" href="http://google.com">goog] le</a>
 </p><p>[http://google.com]
 </p><p>[http://google.com google]
 </p><p>[<a rel="nofollow" class="external free" href="http://google.com">http://google.com</a>]
@@ -24142,7 +24259,7 @@ parsoid=html2wt
 !! test
 4. No escaping needed
 !! options
-options=html2wt
+parsoid=html2wt
 !! html/parsoid
 <p>'<span><i>bar</i></span>'
 '<span><b>bar</b></span>'
@@ -24279,7 +24396,7 @@ parsoid=html2wt
 !! test
 4. Leading whitespace in indent-pre suppressing contexts should not be escaped
 !! options
-options=html2wt
+parsoid=html2wt
 !! html/parsoid
  <figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="./File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/thumb/3/3a/Foobar.jpg/220px-Foobar.jpg" data-file-width="1941" data-file-height="220" data-file-type="bitmap" height="25" width="220"/></a><figcaption>caption</figcaption></figure>
 !! wikitext
@@ -26633,6 +26750,20 @@ parsoid= {
 # Tests spec'ing wikitext serialization norms |
 # --------------------------------------------
 
+!! test
+Serialize multi-line indent-pre starting with wikitext syntax
+!! options
+parsoid=html2wt
+!! html/parsoid
+<pre>* 1
+** 2
+* 3</pre>
+!! wikitext
+ * 1
+ ** 2
+ * 3
+!! end
+
 !! test
 1. Categories should always be serialized on their own line
 !! options
 |}
 !! end
 
+!! test
+Anchor without href scenarios
+!! options
+parsoid={ "modes": ["html2wt"], "suppressErrors": true }
+!! html/parsoid
+<a class="bc"></a>
+<a class="no">dice</a>
+<a name="foo"></a>
+!! wikitext
+
+dice
+<span name="foo"></span>
+!! end
+
 # -----------------------------------------------------------------
 # End of section for Parsoid-only html2wt tests for serialization
 # of new content
index 419ff00..29da00d 100644 (file)
@@ -1298,7 +1298,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
         */
        public function __call( $func, $args ) {
                static $compatibility = [
-                       'assertEmpty' => 'assertEmpty2', // assertEmpty was added in phpunit 3.7.32
+                       'createMock' => 'createMock2',
                ];
 
                if ( isset( $compatibility[$func] ) ) {
@@ -1309,12 +1309,20 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
        }
 
        /**
-        * Used as a compatibility method for phpunit < 3.7.32
-        * @param string $value
-        * @param string $msg
+        * Return a test double for the specified class.
+        *
+        * @param string $originalClassName
+        * @return PHPUnit_Framework_MockObject_MockObject
+        * @throws Exception
         */
-       private function assertEmpty2( $value, $msg ) {
-               $this->assertTrue( $value == '', $msg );
+       private function createMock2( $originalClassName ) {
+               return $this->getMockBuilder( $originalClassName )
+                       ->disableOriginalConstructor()
+                       ->disableOriginalClone()
+                       ->disableArgumentCloning()
+                       // New in phpunit-mock-objects 3.2 (phpunit 5.4.0)
+                       // ->disallowMockingUnknownTypes()
+                       ->getMock();
        }
 
        private static function unprefixTable( &$tableName, $ind, $prefix ) {
@@ -1768,51 +1776,6 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                $this->assertEmpty( $errors, implode( "\n", $errors ) );
        }
 
-       /**
-        * @param array $matcher
-        * @param string $actual
-        * @param bool $isHtml
-        *
-        * @return bool
-        */
-       private static function tagMatch( $matcher, $actual, $isHtml = true ) {
-               $dom = PHPUnit_Util_XML::load( $actual, $isHtml );
-               $tags = PHPUnit_Util_XML::findNodes( $dom, $matcher, $isHtml );
-               return count( $tags ) > 0 && $tags[0] instanceof DOMNode;
-       }
-
-       /**
-        * Note: we are overriding this method to remove the deprecated error
-        * @see https://phabricator.wikimedia.org/T71505
-        * @see https://github.com/sebastianbergmann/phpunit/issues/1292
-        * @deprecated
-        *
-        * @param array $matcher
-        * @param string $actual
-        * @param string $message
-        * @param bool $isHtml
-        */
-       public static function assertTag( $matcher, $actual, $message = '', $isHtml = true ) {
-               // trigger_error(__METHOD__ . ' is deprecated', E_USER_DEPRECATED);
-
-               self::assertTrue( self::tagMatch( $matcher, $actual, $isHtml ), $message );
-       }
-
-       /**
-        * @see MediaWikiTestCase::assertTag
-        * @deprecated
-        *
-        * @param array $matcher
-        * @param string $actual
-        * @param string $message
-        * @param bool $isHtml
-        */
-       public static function assertNotTag( $matcher, $actual, $message = '', $isHtml = true ) {
-               // trigger_error(__METHOD__ . ' is deprecated', E_USER_DEPRECATED);
-
-               self::assertFalse( self::tagMatch( $matcher, $actual, $isHtml ), $message );
-       }
-
        /**
         * Used as a marker to prevent wfResetOutputBuffers from breaking PHPUnit.
         * @return string
index e3713ab..9fe694d 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use MediaWiki\Session\SessionManager;
+
 class FauxRequestTest extends PHPUnit_Framework_TestCase {
        /**
         * @covers FauxRequest::__construct
@@ -17,6 +19,17 @@ class FauxRequestTest extends PHPUnit_Framework_TestCase {
                $req = new FauxRequest( [], false, 'x' );
        }
 
+       /**
+        * @covers FauxRequest::__construct
+        */
+       public function testConstructWithSession() {
+               $session = SessionManager::singleton()->getEmptySession( new FauxRequest( [] ) );
+               $this->assertInstanceOf(
+                       FauxRequest::class,
+                       new FauxRequest( [], false, $session )
+               );
+       }
+
        /**
         * @covers FauxRequest::getText
         */
index 1d48d08..2206fbd 100644 (file)
@@ -1,6 +1,7 @@
 <?php
 
 /**
+ * @group Database
  * @group GlobalFunctions
  */
 class GlobalTest extends MediaWikiTestCase {
index b7249e5..115a8cf 100644 (file)
@@ -41,6 +41,9 @@ class HtmlTest extends MediaWikiTestCase {
 
        /**
         * @covers Html::element
+        * @covers Html::rawElement
+        * @covers Html::openElement
+        * @covers Html::closeElement
         */
        public function testElementBasics() {
                $this->assertEquals(
@@ -302,6 +305,7 @@ class HtmlTest extends MediaWikiTestCase {
 
        /**
         * @covers Html::namespaceSelector
+        * @covers Html::namespaceSelectorOptions
         */
        public function testNamespaceSelector() {
                $this->assertEquals(
index 4bca478..c1a46fe 100644 (file)
@@ -23,7 +23,7 @@ class MWTimestampTest extends MediaWikiLangTestCase {
                $expectedOutput, // The expected output
                $desc // Description
        ) {
-               $user = $this->getMock( 'User' );
+               $user = $this->createMock( 'User' );
                $user->expects( $this->any() )
                        ->method( 'getOption' )
                        ->with( 'timecorrection' )
@@ -156,7 +156,7 @@ class MWTimestampTest extends MediaWikiLangTestCase {
                $expectedOutput, // The expected output
                $desc // Description
        ) {
-               $user = $this->getMock( 'User' );
+               $user = $this->createMock( 'User' );
                $user->expects( $this->any() )
                        ->method( 'getOption' )
                        ->with( 'timecorrection' )
index cc95e38..a72662f 100644 (file)
@@ -71,7 +71,7 @@ class MediaWikiServicesTest extends MediaWikiTestCase {
                $newServices = $this->newMediaWikiServices();
                $oldServices = MediaWikiServices::forceGlobalInstance( $newServices );
 
-               $service1 = $this->getMock( SalvageableService::class );
+               $service1 = $this->createMock( SalvageableService::class );
                $service1->expects( $this->never() )
                        ->method( 'salvage' );
 
@@ -104,11 +104,11 @@ class MediaWikiServicesTest extends MediaWikiTestCase {
                $newServices = $this->newMediaWikiServices();
                $oldServices = MediaWikiServices::forceGlobalInstance( $newServices );
 
-               $service1 = $this->getMock( SalvageableService::class );
+               $service1 = $this->createMock( SalvageableService::class );
                $service1->expects( $this->never() )
                        ->method( 'salvage' );
 
-               $service2 = $this->getMock( SalvageableService::class );
+               $service2 = $this->createMock( SalvageableService::class );
                $service2->expects( $this->once() )
                        ->method( 'salvage' )
                        ->with( $service1 );
@@ -178,11 +178,11 @@ class MediaWikiServicesTest extends MediaWikiTestCase {
                $newServices = $this->newMediaWikiServices();
                $oldServices = MediaWikiServices::forceGlobalInstance( $newServices );
 
-               $service1 = $this->getMock( DestructibleService::class );
+               $service1 = $this->createMock( DestructibleService::class );
                $service1->expects( $this->once() )
                        ->method( 'destroy' );
 
-               $service2 = $this->getMock( DestructibleService::class );
+               $service2 = $this->createMock( DestructibleService::class );
                $service2->expects( $this->never() )
                        ->method( 'destroy' );
 
@@ -219,7 +219,7 @@ class MediaWikiServicesTest extends MediaWikiTestCase {
                        'Test',
                        function() use ( &$serviceCounter ) {
                                $serviceCounter++;
-                               $service = $this->getMock( 'MediaWiki\Services\DestructibleService' );
+                               $service = $this->createMock( 'MediaWiki\Services\DestructibleService' );
                                $service->expects( $this->once() )->method( 'destroy' );
                                return $service;
                        }
@@ -248,7 +248,7 @@ class MediaWikiServicesTest extends MediaWikiTestCase {
                $services->defineService(
                        'Test',
                        function() {
-                               $service = $this->getMock( 'MediaWiki\Services\DestructibleService' );
+                               $service = $this->createMock( 'MediaWiki\Services\DestructibleService' );
                                $service->expects( $this->never() )->method( 'destroy' );
                                return $service;
                        }
index 424218e..58087c1 100644 (file)
@@ -1,4 +1,5 @@
 <?php
+use MediaWiki\MediaWikiServices;
 
 class MessageTest extends MediaWikiLangTestCase {
 
@@ -394,6 +395,22 @@ class MessageTest extends MediaWikiLangTestCase {
                $this->assertSame( 'example &amp;', $msg->escaped() );
        }
 
+       public function testRawHtmlInMsg() {
+               global $wgParserConf;
+               $this->setMwGlobals( 'wgRawHtml', true );
+               // We have to reset the core hook registration.
+               // to register the html hook
+               MessageCache::destroyInstance();
+               $this->setMwGlobals( 'wgParser',
+                       ObjectFactory::constructClassInstance( $wgParserConf['class'], [ $wgParserConf ] )
+               );
+
+               $msg = new RawMessage( '<html><script>alert("xss")</script></html>' );
+               $txt = '<span class="error">&lt;html&gt; tags cannot be' .
+                       ' used outside of normal pages.</span>';
+               $this->assertSame( $txt, $msg->parse() );
+       }
+
        /**
         * @covers Message::params
         * @covers Message::toString
index 50f851c..59441ce 100644 (file)
@@ -4,6 +4,7 @@
  *
  * @author Matthew Flaschen
  *
+ * @group Database
  * @group Output
  *
  * @todo factor tests in this class into providers and test methods
index f22e123..617e39c 100644 (file)
@@ -326,7 +326,8 @@ class ServiceContainerTest extends PHPUnit_Framework_TestCase {
        public function testDisableService() {
                $services = $this->newServiceContainer( [ 'Foo' ] );
 
-               $destructible = $this->getMock( 'MediaWiki\Services\DestructibleService' );
+               $destructible = $this->getMockBuilder( 'MediaWiki\Services\DestructibleService' )
+                       ->getMock();
                $destructible->expects( $this->once() )
                        ->method( 'destroy' );
 
@@ -384,7 +385,8 @@ class ServiceContainerTest extends PHPUnit_Framework_TestCase {
        public function testDestroy() {
                $services = $this->newServiceContainer();
 
-               $destructible = $this->getMock( 'MediaWiki\Services\DestructibleService' );
+               $destructible = $this->getMockBuilder( 'MediaWiki\Services\DestructibleService' )
+                       ->getMock();
                $destructible->expects( $this->once() )
                        ->method( 'destroy' );
 
index bdec0a5..76d1cb9 100644 (file)
@@ -66,7 +66,7 @@ class WatchedItemQueryServiceUnitTest extends PHPUnit_Framework_TestCase {
         * @return PHPUnit_Framework_MockObject_MockObject|User
         */
        private function getMockNonAnonUserWithId( $id ) {
-               $mock = $this->getMock( User::class );
+               $mock = $this->getMockBuilder( User::class )->getMock();
                $mock->expects( $this->any() )
                        ->method( 'isAnon' )
                        ->will( $this->returnValue( false ) );
@@ -142,7 +142,7 @@ class WatchedItemQueryServiceUnitTest extends PHPUnit_Framework_TestCase {
        }
 
        private function getMockAnonUser() {
-               $mock = $this->getMock( User::class );
+               $mock = $this->getMockBuilder( User::class )->getMock();
                $mock->expects( $this->any() )
                        ->method( 'isAnon' )
                        ->will( $this->returnValue( true ) );
index 0bd0bcc..b71e8f4 100644 (file)
@@ -13,7 +13,7 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
         * @return PHPUnit_Framework_MockObject_MockObject|IDatabase
         */
        private function getMockDb() {
-               return $this->getMock( IDatabase::class );
+               return $this->createMock( IDatabase::class );
        }
 
        /**
@@ -63,7 +63,7 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
         * @return PHPUnit_Framework_MockObject_MockObject|User
         */
        private function getMockNonAnonUserWithId( $id ) {
-               $mock = $this->getMock( User::class );
+               $mock = $this->createMock( User::class );
                $mock->expects( $this->any() )
                        ->method( 'isAnon' )
                        ->will( $this->returnValue( false ) );
@@ -1978,7 +1978,7 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
         * @return PHPUnit_Framework_MockObject_MockObject|Title
         */
        private function getMockTitle( $text, $ns = 0 ) {
-               $title = $this->getMock( Title::class );
+               $title = $this->createMock( Title::class );
                $title->expects( $this->any() )
                        ->method( 'getText' )
                        ->will( $this->returnValue( str_replace( '_', ' ', $text ) ) );
index 7e1ff3d..8897645 100644 (file)
@@ -14,7 +14,7 @@ class WatchedItemUnitTest extends MediaWikiTestCase {
         * @return PHPUnit_Framework_MockObject_MockObject|User
         */
        private function getMockUser( $id ) {
-               $user = $this->getMock( User::class );
+               $user = $this->createMock( User::class );
                $user->expects( $this->any() )
                        ->method( 'getId' )
                        ->will( $this->returnValue( $id ) );
@@ -84,7 +84,7 @@ class WatchedItemUnitTest extends MediaWikiTestCase {
                $checkRights = 0;
 
                /** @var User|PHPUnit_Framework_MockObject_MockObject $user */
-               $user = $this->getMock( User::class );
+               $user = $this->createMock( User::class );
                $user->expects( $this->once() )
                        ->method( 'addWatch' )
                        ->with( $title, $checkRights );
@@ -99,7 +99,7 @@ class WatchedItemUnitTest extends MediaWikiTestCase {
                $checkRights = 0;
 
                /** @var User|PHPUnit_Framework_MockObject_MockObject $user */
-               $user = $this->getMock( User::class );
+               $user = $this->createMock( User::class );
                $user->expects( $this->once() )
                        ->method( 'removeWatch' )
                        ->with( $title, $checkRights );
@@ -124,7 +124,7 @@ class WatchedItemUnitTest extends MediaWikiTestCase {
                $checkRights = 0;
 
                /** @var User|PHPUnit_Framework_MockObject_MockObject $user */
-               $user = $this->getMock( User::class );
+               $user = $this->createMock( User::class );
                $user->expects( $this->once() )
                        ->method( 'isWatched' )
                        ->with( $title, $checkRights )
index 184dd43..6c059ec 100644 (file)
@@ -397,4 +397,33 @@ class XmlTest extends MediaWikiTestCase {
                        'encodeJsVar() with float-like string'
                );
        }
+
+       /**
+        * @covers Xml::listDropDown
+        */
+       public function testListDropDown() {
+               $this->assertEquals(
+                       '<select id="test-name" name="test-name" class="test-css" tabindex="2">' . "\n" .
+                               '<option value="other">other reasons</option>' .
+                               '<optgroup label="Foo"><option value="Foo 1">Foo 1</option>' .
+                               '<option value="Example" selected="">Example</option>' .
+                               '</optgroup><optgroup label="Bar">' .
+                               '<option value="Bar 1">Bar 1</option></optgroup>' . "\n" .
+                               '</select>',
+                       Xml::listDropDown(
+                               // name
+                               'test-name',
+                               // source list
+                               "* Foo\n** Foo 1\n** Example\n* Bar\n** Bar 1",
+                               // other
+                               'other reasons',
+                               // selected
+                               'Example',
+                               // class
+                               'test-css',
+                               // tabindex
+                               2
+                       )
+               );
+       }
 }
index 9060dfb..a1b7a87 100644 (file)
@@ -2,6 +2,7 @@
 
 /**
  * @group API
+ * @group Database
  * @group medium
  *
  * @covers ApiMain
@@ -330,8 +331,6 @@ class ApiMainTest extends ApiTestCase {
        }
 
        public static function provideApiErrorFormatterCreation() {
-               global $wgContLang;
-
                return [
                        'Default (BC)' => [ [], [
                                'uselang' => 'ru',
@@ -381,9 +380,9 @@ class ApiMainTest extends ApiTestCase {
                        'uselang=content' => [
                                [ 'uselang' => 'content', 'errorformat' => 'plaintext' ],
                                [
-                                       'uselang' => $wgContLang->getCode(),
+                                       'uselang' => 'en',
                                        'class' => ApiErrorFormatter::class,
-                                       'lang' => $wgContLang->getCode(),
+                                       'lang' => 'en',
                                        'format' => 'plaintext',
                                        'usedb' => false,
                                ]
@@ -393,7 +392,7 @@ class ApiMainTest extends ApiTestCase {
                                [
                                        'uselang' => 'ru',
                                        'class' => ApiErrorFormatter::class,
-                                       'lang' => $wgContLang->getCode(),
+                                       'lang' => 'en',
                                        'format' => 'plaintext',
                                        'usedb' => false,
                                ]
@@ -473,7 +472,7 @@ class ApiMainTest extends ApiTestCase {
                );
        }
 
-       // Not static so $this->getMock() can be used
+       // Not static so $this can be used
        public function provideExceptionErrors() {
                $reqId = WebRequest::getRequestId();
                $doclink = wfExpandUrl( wfScript( 'api' ) );
@@ -486,7 +485,9 @@ class ApiMainTest extends ApiTestCase {
                        MWExceptionHandler::getRedactedTraceAsString( $ex )
                )->inLanguage( 'en' )->useDatabase( false )->text();
 
-               $dbex = new DBQueryError( $this->getMock( 'IDatabase' ), 'error', 1234, 'SELECT 1', __METHOD__ );
+               $dbex = new DBQueryError(
+                       $this->createMock( 'IDatabase' ),
+                       'error', 1234, 'SELECT 1', __METHOD__ );
                $dbtrace = wfMessage( 'api-exception-trace',
                        get_class( $dbex ),
                        $dbex->getFile(),
index ad1deee..8a2146a 100644 (file)
@@ -96,4 +96,83 @@ class ApiPageSetTest extends ApiTestCase {
                        $pageSet->getNormalizedTitlesAsResult()
                );
        }
+
+       public function testSpecialRedirects() {
+               $id1 = self::editPage( 'UTApiPageSet', 'UTApiPageSet in the default language' )
+                       ->value['revision']->getTitle()->getArticleID();
+               $id2 = self::editPage( 'UTApiPageSet/de', 'UTApiPageSet in German' )
+                       ->value['revision']->getTitle()->getArticleID();
+
+               $user = $this->getTestUser()->getUser();
+               $userName = $user->getName();
+               $userDbkey = str_replace( ' ', '_', $userName );
+               $request = new FauxRequest( [
+                       'titles' => join( '|', [
+                               'Special:MyContributions',
+                               'Special:MyPage',
+                               'Special:MyTalk/subpage',
+                               'Special:MyLanguage/UTApiPageSet',
+                       ] ),
+               ] );
+               $context = new RequestContext();
+               $context->setRequest( $request );
+               $context->setUser( $user );
+
+               $main = new ApiMain( $context );
+               $pageSet = new ApiPageSet( $main );
+               $pageSet->execute();
+
+               $this->assertEquals( [
+               ], $pageSet->getRedirectTitlesAsResult() );
+               $this->assertEquals( [
+                       [ 'ns' => -1, 'title' => 'Special:MyContributions', 'special' => true ],
+                       [ 'ns' => -1, 'title' => 'Special:MyPage', 'special' => true ],
+                       [ 'ns' => -1, 'title' => 'Special:MyTalk/subpage', 'special' => true ],
+                       [ 'ns' => -1, 'title' => 'Special:MyLanguage/UTApiPageSet', 'special' => true ],
+               ], $pageSet->getInvalidTitlesAndRevisions() );
+               $this->assertEquals( [
+               ], $pageSet->getAllTitlesByNamespace() );
+
+               $request->setVal( 'redirects', 1 );
+               $main = new ApiMain( $context );
+               $pageSet = new ApiPageSet( $main );
+               $pageSet->execute();
+
+               $this->assertEquals( [
+                       [ 'from' => 'Special:MyPage', 'to' => "User:$userName" ],
+                       [ 'from' => 'Special:MyTalk/subpage', 'to' => "User talk:$userName/subpage" ],
+                       [ 'from' => 'Special:MyLanguage/UTApiPageSet', 'to' => 'UTApiPageSet' ],
+               ], $pageSet->getRedirectTitlesAsResult() );
+               $this->assertEquals( [
+                       [ 'ns' => -1, 'title' => 'Special:MyContributions', 'special' => true ],
+                       [ 'ns' => 2, 'title' => "User:$userName", 'missing' => true ],
+                       [ 'ns' => 3, 'title' => "User talk:$userName/subpage", 'missing' => true ],
+               ], $pageSet->getInvalidTitlesAndRevisions() );
+               $this->assertEquals( [
+                       0 => [ 'UTApiPageSet' => $id1 ],
+                       2 => [ $userDbkey => -2 ],
+                       3 => [ "$userDbkey/subpage" => -3 ],
+               ], $pageSet->getAllTitlesByNamespace() );
+
+               $context->setLanguage( 'de' );
+               $main = new ApiMain( $context );
+               $pageSet = new ApiPageSet( $main );
+               $pageSet->execute();
+
+               $this->assertEquals( [
+                       [ 'from' => 'Special:MyPage', 'to' => "User:$userName" ],
+                       [ 'from' => 'Special:MyTalk/subpage', 'to' => "User talk:$userName/subpage" ],
+                       [ 'from' => 'Special:MyLanguage/UTApiPageSet', 'to' => 'UTApiPageSet/de' ],
+               ], $pageSet->getRedirectTitlesAsResult() );
+               $this->assertEquals( [
+                       [ 'ns' => -1, 'title' => 'Special:MyContributions', 'special' => true ],
+                       [ 'ns' => 2, 'title' => "User:$userName", 'missing' => true ],
+                       [ 'ns' => 3, 'title' => "User talk:$userName/subpage", 'missing' => true ],
+               ], $pageSet->getInvalidTitlesAndRevisions() );
+               $this->assertEquals( [
+                       0 => [ 'UTApiPageSet/de' => $id2 ],
+                       2 => [ $userDbkey => -2 ],
+                       3 => [ "$userDbkey/subpage" => -3 ],
+               ], $pageSet->getAllTitlesByNamespace() );
+       }
 }
index d8588d5..8d84f4c 100644 (file)
@@ -60,7 +60,7 @@ class AbstractPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
        public function testProviderRevokeAccessForUser() {
                $reqs = [];
                for ( $i = 0; $i < 3; $i++ ) {
-                       $reqs[$i] = $this->getMock( AuthenticationRequest::class );
+                       $reqs[$i] = $this->createMock( AuthenticationRequest::class );
                        $reqs[$i]->done = false;
                }
 
index bb90dd9..41cf62e 100644 (file)
@@ -55,7 +55,7 @@ class AbstractSecondaryAuthenticationProviderTest extends \MediaWikiTestCase {
        public function testProviderRevokeAccessForUser() {
                $reqs = [];
                for ( $i = 0; $i < 3; $i++ ) {
-                       $reqs[$i] = $this->getMock( AuthenticationRequest::class );
+                       $reqs[$i] = $this->createMock( AuthenticationRequest::class );
                        $reqs[$i]->done = false;
                }
 
index f57db11..5c268f8 100644 (file)
@@ -45,7 +45,9 @@ class AuthManagerTest extends \MediaWikiTestCase {
         */
        protected function hook( $hook, $expect ) {
                global $wgHooks;
-               $mock = $this->getMock( __CLASS__, [ "on$hook" ] );
+               $mock = $this->getMockBuilder( __CLASS__ )
+                       ->setMethods( [ "on$hook" ] )
+                       ->getMock();
                $wgHooks[$hook] = [ $mock ];
                return $mock->expects( $expect )->method( "on$hook" );
        }
@@ -762,9 +764,9 @@ class AuthManagerTest extends \MediaWikiTestCase {
 
        public function testCreateFromLogin() {
                $user = \User::newFromName( 'UTSysop' );
-               $req1 = $this->getMock( AuthenticationRequest::class );
-               $req2 = $this->getMock( AuthenticationRequest::class );
-               $req3 = $this->getMock( AuthenticationRequest::class );
+               $req1 = $this->createMock( AuthenticationRequest::class );
+               $req2 = $this->createMock( AuthenticationRequest::class );
+               $req3 = $this->createMock( AuthenticationRequest::class );
                $userReq = new UsernameAuthenticationRequest;
                $userReq->username = 'UTDummy';
 
@@ -1083,10 +1085,6 @@ class AuthManagerTest extends \MediaWikiTestCase {
        }
 
        public function provideAuthentication() {
-               $user = \User::newFromName( 'UTSysop' );
-               $id = $user->getId();
-               $name = $user->getName();
-
                $rememberReq = new RememberMeAuthenticationRequest;
                $rememberReq->action = AuthManager::ACTION_LOGIN;
 
@@ -1108,6 +1106,8 @@ class AuthManagerTest extends \MediaWikiTestCase {
                $restartResponse2->createRequest->action = AuthManager::ACTION_LOGIN;
                $restartResponse2->neededRequests = [ $rememberReq, $restartResponse2->createRequest ];
 
+               $userName = 'UTSysop';
+
                return [
                        'Failure in pre-auth' => [
                                StatusValue::newFatal( 'fail-from-pre' ),
@@ -1202,7 +1202,7 @@ class AuthManagerTest extends \MediaWikiTestCase {
                        'Secondary fail' => [
                                StatusValue::newGood(),
                                [
-                                       AuthenticationResponse::newPass( $name ),
+                                       AuthenticationResponse::newPass( $userName ),
                                ],
                                $tmp = [
                                        AuthenticationResponse::newFail( $this->message( 'fail-in-secondary' ) ),
@@ -1212,7 +1212,7 @@ class AuthManagerTest extends \MediaWikiTestCase {
                        'Secondary UI, then abstain' => [
                                StatusValue::newGood(),
                                [
-                                       AuthenticationResponse::newPass( $name ),
+                                       AuthenticationResponse::newPass( $userName ),
                                ],
                                [
                                        $tmp = AuthenticationResponse::newUI( [ $req ], $this->message( '...' ) ),
@@ -1220,19 +1220,19 @@ class AuthManagerTest extends \MediaWikiTestCase {
                                ],
                                [
                                        $tmp,
-                                       AuthenticationResponse::newPass( $name ),
+                                       AuthenticationResponse::newPass( $userName ),
                                ]
                        ],
                        'Secondary pass' => [
                                StatusValue::newGood(),
                                [
-                                       AuthenticationResponse::newPass( $name ),
+                                       AuthenticationResponse::newPass( $userName ),
                                ],
                                [
                                        AuthenticationResponse::newPass()
                                ],
                                [
-                                       AuthenticationResponse::newPass( $name ),
+                                       AuthenticationResponse::newPass( $userName ),
                                ]
                        ],
                ];
@@ -2663,7 +2663,8 @@ class AuthManagerTest extends \MediaWikiTestCase {
 
                // Test addToDatabase fails
                $session->clear();
-               $user = $this->getMock( 'User', [ 'addToDatabase' ] );
+               $user = $this->getMockBuilder( 'User' )
+                       ->setMethods( [ 'addToDatabase' ] )->getMock();
                $user->expects( $this->once() )->method( 'addToDatabase' )
                        ->will( $this->returnValue( \Status::newFatal( 'because' ) ) );
                $user->setName( $username );
@@ -2684,7 +2685,8 @@ class AuthManagerTest extends \MediaWikiTestCase {
                $backoffKey = wfMemcKey( 'AuthManager', 'autocreate-failed', md5( $username ) );
                $this->assertFalse( $cache->get( $backoffKey ), 'sanity check' );
                $session->clear();
-               $user = $this->getMock( 'User', [ 'addToDatabase' ] );
+               $user = $this->getMockBuilder( 'User' )
+                       ->setMethods( [ 'addToDatabase' ] )->getMock();
                $user->expects( $this->once() )->method( 'addToDatabase' )
                        ->will( $this->throwException( new \Exception( 'Excepted' ) ) );
                $user->setName( $username );
@@ -2707,7 +2709,8 @@ class AuthManagerTest extends \MediaWikiTestCase {
 
                // Test addToDatabase fails because the user already exists.
                $session->clear();
-               $user = $this->getMock( 'User', [ 'addToDatabase' ] );
+               $user = $this->getMockBuilder( 'User' )
+                       ->setMethods( [ 'addToDatabase' ] )->getMock();
                $user->expects( $this->once() )->method( 'addToDatabase' )
                        ->will( $this->returnCallback( function () use ( $username, &$user ) {
                                $oldUser = \User::newFromName( $username );
@@ -2815,7 +2818,7 @@ class AuthManagerTest extends \MediaWikiTestCase {
         */
        public function testGetAuthenticationRequests( $action, $expect, $state = [] ) {
                $makeReq = function ( $key ) use ( $action ) {
-                       $req = $this->getMock( AuthenticationRequest::class );
+                       $req = $this->createMock( AuthenticationRequest::class );
                        $req->expects( $this->any() )->method( 'getUniqueId' )
                                ->will( $this->returnValue( $key ) );
                        $req->action = $action === AuthManager::ACTION_UNLINK ? AuthManager::ACTION_REMOVE : $action;
@@ -3018,7 +3021,7 @@ class AuthManagerTest extends \MediaWikiTestCase {
 
        public function testGetAuthenticationRequestsRequired() {
                $makeReq = function ( $key, $required ) {
-                       $req = $this->getMock( AuthenticationRequest::class );
+                       $req = $this->createMock( AuthenticationRequest::class );
                        $req->expects( $this->any() )->method( 'getUniqueId' )
                                ->will( $this->returnValue( $key ) );
                        $req->action = AuthManager::ACTION_LOGIN;
@@ -3148,7 +3151,7 @@ class AuthManagerTest extends \MediaWikiTestCase {
        public function testAutoCreateOnLogin() {
                $username = self::usernameForCreation();
 
-               $req = $this->getMock( AuthenticationRequest::class );
+               $req = $this->createMock( AuthenticationRequest::class );
 
                $mock = $this->getMockForAbstractClass( PrimaryAuthenticationProvider::class );
                $mock->expects( $this->any() )->method( 'getUniqueId' )->will( $this->returnValue( 'primary' ) );
index 96e50e0..6970313 100644 (file)
@@ -20,7 +20,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
                        );
                }
 
-               $plugin = $this->getMock( 'AuthPlugin' );
+               $plugin = $this->createMock( 'AuthPlugin' );
                $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
 
                $provider = new AuthPluginPrimaryAuthenticationProvider( $plugin );
@@ -29,14 +29,14 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
                        $provider->getAuthenticationRequests( AuthManager::ACTION_LOGIN, [] )
                );
 
-               $req = $this->getMock( PasswordAuthenticationRequest::class );
+               $req = $this->createMock( PasswordAuthenticationRequest::class );
                $provider = new AuthPluginPrimaryAuthenticationProvider( $plugin, get_class( $req ) );
                $this->assertEquals(
                        [ $req ],
                        $provider->getAuthenticationRequests( AuthManager::ACTION_LOGIN, [] )
                );
 
-               $reqType = get_class( $this->getMock( AuthenticationRequest::class ) );
+               $reqType = get_class( $this->createMock( AuthenticationRequest::class ) );
                try {
                        $provider = new AuthPluginPrimaryAuthenticationProvider( $plugin, $reqType );
                        $this->fail( 'Expected exception not thrown' );
@@ -51,7 +51,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
        public function testOnUserSaveSettings() {
                $user = \User::newFromName( 'UTSysop' );
 
-               $plugin = $this->getMock( 'AuthPlugin' );
+               $plugin = $this->createMock( 'AuthPlugin' );
                $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
                $plugin->expects( $this->once() )->method( 'updateExternalDB' )
                        ->with( $this->identicalTo( $user ) );
@@ -63,7 +63,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
        public function testOnUserGroupsChanged() {
                $user = \User::newFromName( 'UTSysop' );
 
-               $plugin = $this->getMock( 'AuthPlugin' );
+               $plugin = $this->createMock( 'AuthPlugin' );
                $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
                $plugin->expects( $this->once() )->method( 'updateExternalDBGroups' )
                        ->with(
@@ -79,14 +79,14 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
        public function testOnUserLoggedIn() {
                $user = \User::newFromName( 'UTSysop' );
 
-               $plugin = $this->getMock( 'AuthPlugin' );
+               $plugin = $this->createMock( 'AuthPlugin' );
                $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
                $plugin->expects( $this->exactly( 2 ) )->method( 'updateUser' )
                        ->with( $this->identicalTo( $user ) );
                $provider = new AuthPluginPrimaryAuthenticationProvider( $plugin );
                \Hooks::run( 'UserLoggedIn', [ $user ] );
 
-               $plugin = $this->getMock( 'AuthPlugin' );
+               $plugin = $this->createMock( 'AuthPlugin' );
                $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
                $plugin->expects( $this->once() )->method( 'updateUser' )
                        ->will( $this->returnCallback( function ( &$user ) {
@@ -107,14 +107,14 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
        public function testOnLocalUserCreated() {
                $user = \User::newFromName( 'UTSysop' );
 
-               $plugin = $this->getMock( 'AuthPlugin' );
+               $plugin = $this->createMock( 'AuthPlugin' );
                $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
                $plugin->expects( $this->exactly( 2 ) )->method( 'initUser' )
                        ->with( $this->identicalTo( $user ), $this->identicalTo( false ) );
                $provider = new AuthPluginPrimaryAuthenticationProvider( $plugin );
                \Hooks::run( 'LocalUserCreated', [ $user, false ] );
 
-               $plugin = $this->getMock( 'AuthPlugin' );
+               $plugin = $this->createMock( 'AuthPlugin' );
                $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
                $plugin->expects( $this->once() )->method( 'initUser' )
                        ->will( $this->returnCallback( function ( &$user ) {
@@ -133,7 +133,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
        }
 
        public function testGetUniqueId() {
-               $plugin = $this->getMock( 'AuthPlugin' );
+               $plugin = $this->createMock( 'AuthPlugin' );
                $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
                $provider = new AuthPluginPrimaryAuthenticationProvider( $plugin );
                $this->assertSame(
@@ -149,7 +149,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
         * @param bool $allowPasswordChange
         */
        public function testGetAuthenticationRequests( $action, $response, $allowPasswordChange ) {
-               $plugin = $this->getMock( 'AuthPlugin' );
+               $plugin = $this->createMock( 'AuthPlugin' );
                $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
                $plugin->expects( $this->any() )->method( 'allowPasswordChange' )
                        ->will( $this->returnValue( $allowPasswordChange ) );
@@ -321,7 +321,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
        }
 
        public function testTestUserExists() {
-               $plugin = $this->getMock( 'AuthPlugin' );
+               $plugin = $this->createMock( 'AuthPlugin' );
                $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
                $plugin->expects( $this->once() )->method( 'userExists' )
                        ->with( $this->equalTo( 'Foo' ) )
@@ -330,7 +330,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
 
                $this->assertTrue( $provider->testUserExists( 'foo' ) );
 
-               $plugin = $this->getMock( 'AuthPlugin' );
+               $plugin = $this->createMock( 'AuthPlugin' );
                $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
                $plugin->expects( $this->once() )->method( 'userExists' )
                        ->with( $this->equalTo( 'Foo' ) )
@@ -341,7 +341,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
        }
 
        public function testTestUserCanAuthenticate() {
-               $plugin = $this->getMock( 'AuthPlugin' );
+               $plugin = $this->createMock( 'AuthPlugin' );
                $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
                $plugin->expects( $this->once() )->method( 'userExists' )
                        ->with( $this->equalTo( 'Foo' ) )
@@ -355,7 +355,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
                        ->getMock();
                $pluginUser->expects( $this->once() )->method( 'isLocked' )
                        ->will( $this->returnValue( true ) );
-               $plugin = $this->getMock( 'AuthPlugin' );
+               $plugin = $this->createMock( 'AuthPlugin' );
                $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
                $plugin->expects( $this->once() )->method( 'userExists' )
                        ->with( $this->equalTo( 'Foo' ) )
@@ -375,7 +375,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
                        ->getMock();
                $pluginUser->expects( $this->once() )->method( 'isLocked' )
                        ->will( $this->returnValue( false ) );
-               $plugin = $this->getMock( 'AuthPlugin' );
+               $plugin = $this->createMock( 'AuthPlugin' );
                $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
                $plugin->expects( $this->once() )->method( 'userExists' )
                        ->with( $this->equalTo( 'Foo' ) )
@@ -433,7 +433,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
        }
 
        public function testProviderAllowsPropertyChange() {
-               $plugin = $this->getMock( 'AuthPlugin' );
+               $plugin = $this->createMock( 'AuthPlugin' );
                $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
                $plugin->expects( $this->any() )->method( 'allowPropChange' )
                        ->will( $this->returnCallback( function ( $prop ) {
@@ -453,7 +453,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
         */
        public function testProviderAllowsAuthenticationDataChange( $type, $allow, $expect ) {
                $domains = $type instanceof PasswordDomainAuthenticationRequest ? [ 'foo', 'bar' ] : [];
-               $plugin = $this->getMock( 'AuthPlugin' );
+               $plugin = $this->createMock( 'AuthPlugin' );
                $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( $domains );
                $plugin->expects( $allow === null ? $this->never() : $this->once() )
                        ->method( 'allowPasswordChange' )->will( $this->returnValue( $allow ) );
@@ -466,7 +466,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
                if ( is_object( $type ) ) {
                        $req = $type;
                } else {
-                       $req = $this->getMock( $type );
+                       $req = $this->createMock( $type );
                }
                $req->action = AuthManager::ACTION_CHANGE;
                $req->username = 'UTSysop';
@@ -502,12 +502,12 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
        }
 
        public function testProviderChangeAuthenticationData() {
-               $plugin = $this->getMock( 'AuthPlugin' );
+               $plugin = $this->createMock( 'AuthPlugin' );
                $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
                $plugin->expects( $this->never() )->method( 'setPassword' );
                $provider = new AuthPluginPrimaryAuthenticationProvider( $plugin );
                $provider->providerChangeAuthenticationData(
-                       $this->getMock( AuthenticationRequest::class )
+                       $this->createMock( AuthenticationRequest::class )
                );
 
                $req = new PasswordAuthenticationRequest();
@@ -515,7 +515,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
                $req->username = 'foo';
                $req->password = 'bar';
 
-               $plugin = $this->getMock( 'AuthPlugin' );
+               $plugin = $this->createMock( 'AuthPlugin' );
                $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
                $plugin->expects( $this->once() )->method( 'setPassword' )
                        ->with( $this->callback( function ( $u ) {
@@ -525,7 +525,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
                $provider = new AuthPluginPrimaryAuthenticationProvider( $plugin );
                $provider->providerChangeAuthenticationData( $req );
 
-               $plugin = $this->getMock( 'AuthPlugin' );
+               $plugin = $this->createMock( 'AuthPlugin' );
                $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
                $plugin->expects( $this->once() )->method( 'setPassword' )
                        ->with( $this->callback( function ( $u ) {
@@ -541,7 +541,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
                        $this->assertSame( 'authmanager-authplugin-setpass-failed-message', $e->msg );
                }
 
-               $plugin = $this->getMock( 'AuthPlugin' );
+               $plugin = $this->createMock( 'AuthPlugin' );
                $plugin->expects( $this->any() )->method( 'domainList' )
                        ->will( $this->returnValue( [ 'Domain1', 'Domain2' ] ) );
                $plugin->expects( $this->any() )->method( 'validDomain' )
@@ -569,7 +569,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
         * @param string $expect
         */
        public function testAccountCreationType( $can, $expect ) {
-               $plugin = $this->getMock( 'AuthPlugin' );
+               $plugin = $this->createMock( 'AuthPlugin' );
                $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
                $plugin->expects( $this->once() )
                        ->method( 'canCreateAccounts' )->will( $this->returnValue( $can ) );
@@ -588,7 +588,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
        public function testTestForAccountCreation() {
                $user = \User::newFromName( 'foo' );
 
-               $plugin = $this->getMock( 'AuthPlugin' );
+               $plugin = $this->createMock( 'AuthPlugin' );
                $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
                $provider = new AuthPluginPrimaryAuthenticationProvider( $plugin );
                $this->assertEquals(
@@ -606,7 +606,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
                $req->action = AuthManager::ACTION_CREATE;
                $reqs = [ PasswordAuthenticationRequest::class => $req ];
 
-               $plugin = $this->getMock( 'AuthPlugin' );
+               $plugin = $this->createMock( 'AuthPlugin' );
                $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
                $plugin->expects( $this->any() )->method( 'canCreateAccounts' )
                        ->will( $this->returnValue( false ) );
@@ -621,7 +621,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
                        );
                }
 
-               $plugin = $this->getMock( 'AuthPlugin' );
+               $plugin = $this->createMock( 'AuthPlugin' );
                $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
                $plugin->expects( $this->any() )->method( 'canCreateAccounts' )
                        ->will( $this->returnValue( true ) );
@@ -650,7 +650,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
                $req->username = 'foo';
                $req->password = 'bar';
 
-               $plugin = $this->getMock( 'AuthPlugin' );
+               $plugin = $this->createMock( 'AuthPlugin' );
                $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
                $plugin->expects( $this->any() )->method( 'canCreateAccounts' )
                        ->will( $this->returnValue( true ) );
@@ -670,7 +670,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
                        $provider->beginPrimaryAccountCreation( $user, $user, $reqs )
                );
 
-               $plugin = $this->getMock( 'AuthPlugin' );
+               $plugin = $this->createMock( 'AuthPlugin' );
                $plugin->expects( $this->any() )->method( 'domainList' )->willReturn( [] );
                $plugin->expects( $this->any() )->method( 'canCreateAccounts' )
                        ->will( $this->returnValue( true ) );
@@ -689,7 +689,7 @@ class AuthPluginPrimaryAuthenticationProviderTest extends \MediaWikiTestCase {
                $this->assertSame( AuthenticationResponse::FAIL, $ret->status );
                $this->assertSame( 'authmanager-authplugin-create-fail', $ret->message->getKey() );
 
-               $plugin = $this->getMock( 'AuthPlugin' );
+               $plugin = $this->createMock( 'AuthPlugin' );
                $plugin->expects( $this->any() )->method( 'canCreateAccounts' )
                        ->will( $this->returnValue( true ) );
                $plugin->expects( $this->any() )->method( 'domainList' )
index 7d2ba8d..0e549a5 100644 (file)
@@ -138,7 +138,7 @@ class AuthenticationRequestTest extends \MediaWikiTestCase {
        public function testMergeFieldInfo() {
                $msg = wfMessage( 'foo' );
 
-               $req1 = $this->getMock( AuthenticationRequest::class );
+               $req1 = $this->createMock( AuthenticationRequest::class );
                $req1->required = AuthenticationRequest::REQUIRED;
                $req1->expects( $this->any() )->method( 'getFieldInfo' )->will( $this->returnValue( [
                        'string1' => [
@@ -165,7 +165,7 @@ class AuthenticationRequestTest extends \MediaWikiTestCase {
                        ],
                ] ) );
 
-               $req2 = $this->getMock( AuthenticationRequest::class );
+               $req2 = $this->createMock( AuthenticationRequest::class );
                $req2->required = AuthenticationRequest::REQUIRED;
                $req2->expects( $this->any() )->method( 'getFieldInfo' )->will( $this->returnValue( [
                        'string1' => [
@@ -187,7 +187,7 @@ class AuthenticationRequestTest extends \MediaWikiTestCase {
                        ],
                ] ) );
 
-               $req3 = $this->getMock( AuthenticationRequest::class );
+               $req3 = $this->createMock( AuthenticationRequest::class );
                $req3->required = AuthenticationRequest::REQUIRED;
                $req3->expects( $this->any() )->method( 'getFieldInfo' )->will( $this->returnValue( [
                        'string1' => [
@@ -197,7 +197,7 @@ class AuthenticationRequestTest extends \MediaWikiTestCase {
                        ],
                ] ) );
 
-               $req4 = $this->getMock( AuthenticationRequest::class );
+               $req4 = $this->createMock( AuthenticationRequest::class );
                $req4->required = AuthenticationRequest::REQUIRED;
                $req4->expects( $this->any() )->method( 'getFieldInfo' )->will( $this->returnValue( [] ) );
 
index ec4bea1..ca6689a 100644 (file)
@@ -57,24 +57,24 @@ class EmailNotificationSecondaryAuthenticationProviderTest extends \PHPUnit_Fram
        public function testBeginSecondaryAccountCreation() {
                $authManager = new AuthManager( new \FauxRequest(), new \HashConfig() );
 
-               $creator = $this->getMock( 'User' );
-               $userWithoutEmail = $this->getMock( 'User' );
+               $creator = $this->getMockBuilder( 'User' )->getMock();
+               $userWithoutEmail = $this->getMockBuilder( 'User' )->getMock();
                $userWithoutEmail->expects( $this->any() )->method( 'getEmail' )->willReturn( '' );
                $userWithoutEmail->expects( $this->any() )->method( 'getInstanceForUpdate' )->willReturnSelf();
                $userWithoutEmail->expects( $this->never() )->method( 'sendConfirmationMail' );
-               $userWithEmailError = $this->getMock( 'User' );
+               $userWithEmailError = $this->getMockBuilder( 'User' )->getMock();
                $userWithEmailError->expects( $this->any() )->method( 'getEmail' )->willReturn( 'foo@bar.baz' );
                $userWithEmailError->expects( $this->any() )->method( 'getInstanceForUpdate' )->willReturnSelf();
                $userWithEmailError->expects( $this->any() )->method( 'sendConfirmationMail' )
                        ->willReturn( \Status::newFatal( 'fail' ) );
-               $userExpectsConfirmation = $this->getMock( 'User' );
+               $userExpectsConfirmation = $this->getMockBuilder( 'User' )->getMock();
                $userExpectsConfirmation->expects( $this->any() )->method( 'getEmail' )
                        ->willReturn( 'foo@bar.baz' );
                $userExpectsConfirmation->expects( $this->any() )->method( 'getInstanceForUpdate' )
                        ->willReturnSelf();
                $userExpectsConfirmation->expects( $this->once() )->method( 'sendConfirmationMail' )
                        ->willReturn( \Status::newGood() );
-               $userNotExpectsConfirmation = $this->getMock( 'User' );
+               $userNotExpectsConfirmation = $this->getMockBuilder( 'User' )->getMock();
                $userNotExpectsConfirmation->expects( $this->any() )->method( 'getEmail' )
                        ->willReturn( 'foo@bar.baz' );
                $userNotExpectsConfirmation->expects( $this->any() )->method( 'getInstanceForUpdate' )
index b96455e..3b00194 100644 (file)
@@ -15,7 +15,8 @@ class LegacyHookPreAuthenticationProviderTest extends \MediaWikiTestCase {
         * @return LegacyHookPreAuthenticationProvider
         */
        protected function getProvider() {
-               $request = $this->getMock( 'FauxRequest', [ 'getIP' ] );
+               $request = $this->getMockBuilder( 'FauxRequest' )
+                       ->setMethods( [ 'getIP' ] )->getMock();
                $request->expects( $this->any() )->method( 'getIP' )->will( $this->returnValue( '127.0.0.42' ) );
 
                $manager = new AuthManager(
@@ -39,7 +40,7 @@ class LegacyHookPreAuthenticationProviderTest extends \MediaWikiTestCase {
         * @return object $mock->expects( $expect )->method( ... ).
         */
        protected function hook( $hook, $expect ) {
-               $mock = $this->getMock( __CLASS__, [ "on$hook" ] );
+               $mock = $this->getMockBuilder( __CLASS__ )->setMethods( [ "on$hook" ] )->getMock();
                $this->mergeMwGlobalArrayValue( 'wgHooks', [
                        $hook => [ $mock ],
                ] );
index 72a03c3..6e2058c 100644 (file)
@@ -38,11 +38,10 @@ class LocalPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestCase
                }
                $this->validity = \Status::newGood();
 
-               $provider = $this->getMock(
-                       LocalPasswordPrimaryAuthenticationProvider::class,
-                       [ 'checkPasswordValidity' ],
-                       [ [ 'loginOnly' => $loginOnly ] ]
-               );
+               $provider = $this->getMockBuilder( LocalPasswordPrimaryAuthenticationProvider::class )
+                       ->setMethods( [ 'checkPasswordValidity' ] )
+                       ->setConstructorArgs( [ [ 'loginOnly' => $loginOnly ] ] )
+                       ->getMock();
                $provider->expects( $this->any() )->method( 'checkPasswordValidity' )
                        ->will( $this->returnCallback( function () {
                                return $this->validity;
@@ -348,7 +347,7 @@ class LocalPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestCase
                } elseif ( $type === PasswordDomainAuthenticationRequest::class ) {
                        $req = new $type( [] );
                } else {
-                       $req = $this->getMock( $type );
+                       $req = $this->createMock( $type );
                }
                $req->action = AuthManager::ACTION_CHANGE;
                $req->username = $user;
@@ -444,7 +443,7 @@ class LocalPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestCase
                if ( $type === PasswordAuthenticationRequest::class ) {
                        $changeReq = new $type();
                } else {
-                       $changeReq = $this->getMock( $type );
+                       $changeReq = $this->createMock( $type );
                }
                $changeReq->action = AuthManager::ACTION_CHANGE;
                $changeReq->username = $user;
index bc7d65e..8d9509e 100644 (file)
@@ -42,11 +42,10 @@ class TemporaryPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestC
                $this->validity = \Status::newGood();
 
                $mockedMethods[] = 'checkPasswordValidity';
-               $provider = $this->getMock(
-                       TemporaryPasswordPrimaryAuthenticationProvider::class,
-                       $mockedMethods,
-                       [ $params ]
-               );
+               $provider = $this->getMockBuilder( TemporaryPasswordPrimaryAuthenticationProvider::class )
+                       ->setMethods( $mockedMethods )
+                       ->setConstructorArgs( [ $params ] )
+                       ->getMock();
                $provider->expects( $this->any() )->method( 'checkPasswordValidity' )
                        ->will( $this->returnCallback( function () {
                                return $this->validity;
@@ -366,7 +365,7 @@ class TemporaryPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestC
                ) {
                        $req = new $type();
                } else {
-                       $req = $this->getMock( $type );
+                       $req = $this->createMock( $type );
                }
                $req->action = AuthManager::ACTION_CHANGE;
                $req->username = $user;
@@ -446,7 +445,7 @@ class TemporaryPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestC
                ) {
                        $changeReq = new $type();
                } else {
-                       $changeReq = $this->getMock( $type );
+                       $changeReq = $this->createMock( $type );
                }
                $changeReq->action = AuthManager::ACTION_CHANGE;
                $changeReq->username = $user;
index 2f3e27c..ee82832 100644 (file)
@@ -119,7 +119,9 @@ class ThrottlePreAuthenticationProviderTest extends \MediaWikiTestCase {
                $user = \User::newFromName( 'RandomUser' );
                $creator = \User::newFromName( $creatorname );
                if ( $hook ) {
-                       $mock = $this->getMock( 'stdClass', [ 'onExemptFromAccountCreationThrottle' ] );
+                       $mock = $this->getMockBuilder( 'stdClass' )
+                               ->setMethods( [ 'onExemptFromAccountCreationThrottle' ] )
+                               ->getMock();
                        $mock->expects( $this->any() )->method( 'onExemptFromAccountCreationThrottle' )
                                ->will( $this->returnValue( false ) );
                        $this->mergeMwGlobalArrayValue( 'wgHooks', [
index c945885..33c8ce6 100644 (file)
@@ -163,7 +163,8 @@ class ThrottlerTest extends \MediaWikiTestCase {
        }
 
        public function testExpiration() {
-               $cache = $this->getMock( HashBagOStuff::class, [ 'add' ] );
+               $cache = $this->getMockBuilder( HashBagOStuff::class )
+                       ->setMethods( [ 'add' ] )->getMock();
                $throttler = new Throttler( [ [ 'count' => 3, 'seconds' => 10 ] ], [ 'cache' => $cache ] );
                $throttler->setLogger( new NullLogger() );
 
index d98311f..a30702f 100644 (file)
@@ -45,13 +45,6 @@ class ChangesListBooleanFilterGroupTest extends MediaWikiTestCase {
 
                $group = new ChangesListBooleanFilterGroup( $definition );
 
-               $specialPage = $this->getMockBuilder( 'ChangesListSpecialPage' )
-                       ->setConstructorArgs( [
-                               'ChangesListSpecialPage',
-                               '',
-                       ] )
-                       ->getMockForAbstractClass();
-
                $this->assertArrayEquals(
                        [
                                'name' => 'some-group',
@@ -91,7 +84,7 @@ class ChangesListBooleanFilterGroupTest extends MediaWikiTestCase {
                                ],
                        ],
 
-                       $group->getJsData( $specialPage ),
+                       $group->getJsData(),
                        /** ordered= */ false,
                        /** named= */ true
                );
index 2c0c22d..000f017 100644 (file)
@@ -108,13 +108,6 @@ class ChangesListBooleanFilterTest extends MediaWikiTestCase {
        }
 
        public function testIsFeatureAvailableOnStructuredUi() {
-               $specialPage = $this->getMockBuilder( 'ChangesListSpecialPage' )
-                       ->setConstructorArgs( [
-                                       'ChangesListSpecialPage',
-                                       '',
-                               ] )
-                       ->getMockForAbstractClass();
-
                $groupA = new ChangesListBooleanFilterGroup( [
                        'name' => 'groupA',
                        'priority' => 1,
@@ -133,7 +126,7 @@ class ChangesListBooleanFilterTest extends MediaWikiTestCase {
 
                $this->assertEquals(
                        true,
-                       $foo->isFeatureAvailableOnStructuredUi( $specialPage ),
+                       $foo->isFeatureAvailableOnStructuredUi(),
                        'Same filter appears on both'
                );
 
@@ -148,7 +141,7 @@ class ChangesListBooleanFilterTest extends MediaWikiTestCase {
 
                $this->assertEquals(
                        false,
-                       $bar->isFeatureAvailableOnStructuredUi( $specialPage ),
+                       $bar->isFeatureAvailableOnStructuredUi(),
                        'Only on unstructured UI'
                );
 
@@ -163,7 +156,7 @@ class ChangesListBooleanFilterTest extends MediaWikiTestCase {
 
                $this->assertEquals(
                        true,
-                       $baz->isFeatureAvailableOnStructuredUi( $specialPage ),
+                       $baz->isFeatureAvailableOnStructuredUi(),
                        'Legacy filter does not appear directly in new UI, but equivalent ' .
                                'does and is marked with isReplacedInStructuredUi'
                );
index 019e257..0f556b8 100644 (file)
@@ -73,12 +73,6 @@ class ChangesListStringOptionsFilterGroupTest extends MediaWikiTestCase {
                        [
                                'name' => 'foo',
                        ],
-                       [
-                               'name' => 'bar',
-                               'isAllowedCallable' => function () {
-                                       return false;
-                               },
-                       ],
                        [
                                'name' => 'baz',
                        ],
@@ -141,25 +135,7 @@ class ChangesListStringOptionsFilterGroupTest extends MediaWikiTestCase {
        }
 
        public function provideNoOpModifyQuery() {
-               $isAllowedFalse = [
-                       'isAllowedCallable' => function () {
-                               return false;
-                       },
-               ];
-
-               $allDisallowedFilters = [
-                       [
-                               'name' => 'disallowed1',
-                       ] + $isAllowedFalse,
-
-                       [
-                               'name' => 'disallowed2',
-                       ] + $isAllowedFalse,
-
-                       [
-                               'name' => 'disallowed3',
-                       ] + $isAllowedFalse,
-               ];
+               $noFilters = [];
 
                $normalFilters = [
                        [
@@ -172,9 +148,9 @@ class ChangesListStringOptionsFilterGroupTest extends MediaWikiTestCase {
 
                return [
                        [
-                               $allDisallowedFilters,
+                               $noFilters,
                                'disallowed1;disallowed3',
-                               'The queryCallable should not be called if no filters are allowed',
+                               'The queryCallable should not be called if there are no filters',
                        ],
 
                        [
@@ -207,8 +183,8 @@ class ChangesListStringOptionsFilterGroupTest extends MediaWikiTestCase {
         * @dataProvider provideModifyQuery
         */
        protected function modifyQueryHelper( $groupDefinition, $input ) {
-               $ctx = $this->getMock( 'IContextSource' );
-               $dbr = $this->getMock( 'IDatabase' );
+               $ctx = $this->createMock( 'IContextSource' );
+               $dbr = $this->createMock( 'IDatabase' );
                $tables = $fields = $conds = $query_options = $join_conds = [];
 
                $group = new ChangesListStringOptionsFilterGroup( $groupDefinition );
@@ -254,8 +230,6 @@ class ChangesListStringOptionsFilterGroupTest extends MediaWikiTestCase {
 
                $group = new ChangesListStringOptionsFilterGroup( $definition );
 
-               $specialPage = $this->getSpecialPage();
-
                $this->assertArrayEquals(
                        [
                                'name' => 'some-group',
@@ -294,7 +268,7 @@ class ChangesListStringOptionsFilterGroupTest extends MediaWikiTestCase {
                                        'foo-description',
                                ],
                        ],
-                       $group->getJsData( $specialPage ),
+                       $group->getJsData(),
                        /** ordered= */ false,
                        /** named= */ true
                );
index 4ff1eb8..97b4c08 100644 (file)
@@ -141,103 +141,69 @@ class RCCacheEntryFactoryTest extends MediaWikiLangTestCase {
                $this->assertEquals( 'prev', $cacheEntry->lastlink, 'pref link for delete log or rev' );
        }
 
+       private function assertValidHTML( $actual ) {
+               // Throws if invalid
+               $doc = PHPUnit_Util_XML::load( $actual, /* isHtml */ true );
+       }
+
        private function assertUserLinks( $user, $cacheEntry ) {
-               $this->assertTag(
-                       [
-                               'tag' => 'a',
-                               'attributes' => [
-                                       'class' => 'new mw-userlink'
-                               ],
-                               'content' => $user
-                       ],
+               $this->assertValidHTML( $cacheEntry->userlink );
+               $this->assertRegExp(
+                       '#^<a .*class="new mw-userlink".*><bdi>' . $user . '</bdi></a>#',
                        $cacheEntry->userlink,
                        'verify user link'
                );
 
-               $this->assertTag(
-                       [
-                               'tag' => 'span',
-                               'attributes' => [
-                                       'class' => 'mw-usertoollinks'
-                               ],
-                               'child' => [
-                                       'tag' => 'a',
-                                       'content' => 'talk',
-                               ]
-                       ],
+               $this->assertValidHTML( $cacheEntry->usertalklink );
+               $this->assertRegExp(
+                       '#^ <span class="mw-usertoollinks">\(.*<a .+>talk</a>.*\)</span>#',
                        $cacheEntry->usertalklink,
                        'verify user talk link'
                );
 
-               $this->assertTag(
-                       [
-                               'tag' => 'span',
-                               'attributes' => [
-                                       'class' => 'mw-usertoollinks'
-                               ],
-                               'child' => [
-                                       'tag' => 'a',
-                                       'content' => 'contribs',
-                               ]
-                       ],
+               $this->assertValidHTML( $cacheEntry->usertalklink );
+               $this->assertRegExp(
+                       '#^ <span class="mw-usertoollinks">\(.*<a .+>contribs</a>.*\)</span>$#',
                        $cacheEntry->usertalklink,
                        'verify user tool links'
                );
        }
 
        private function assertDeleteLogLink( $cacheEntry ) {
-               $this->assertTag(
-                       [
-                               'tag' => 'a',
-                               'attributes' => [
-                                       'href' => '/wiki/Special:Log/delete',
-                                       'title' => 'Special:Log/delete'
-                               ],
-                               'content' => 'Deletion log'
-                       ],
+               $this->assertEquals(
+                       '(<a href="/wiki/Special:Log/delete" title="Special:Log/delete">Deletion log</a>)',
                        $cacheEntry->link,
                        'verify deletion log link'
                );
+
+               $this->assertValidHTML( $cacheEntry->link );
        }
 
        private function assertRevDel( $cacheEntry ) {
-               $this->assertTag(
-                       [
-                               'tag' => 'span',
-                               'attributes' => [
-                                       'class' => 'history-deleted'
-                               ],
-                               'content' => '(username removed)'
-                       ],
+               $this->assertEquals(
+                       ' <span class="history-deleted">(username removed)</span>',
                        $cacheEntry->userlink,
                        'verify user link for change with deleted revision and user'
                );
+               $this->assertValidHTML( $cacheEntry->userlink );
        }
 
        private function assertTitleLink( $title, $cacheEntry ) {
-               $this->assertTag(
-                       [
-                               'tag' => 'a',
-                               'attributes' => [
-                                       'href' => '/wiki/' . $title,
-                                       'title' => $title
-                               ],
-                               'content' => $title
-                       ],
+               $this->assertEquals(
+                       '<a href="/wiki/' . $title . '" title="' . $title . '">' . $title . '</a>',
                        $cacheEntry->link,
                        'verify title link'
                );
+               $this->assertValidHTML( $cacheEntry->link );
        }
 
        private function assertQueryLink( $content, $params, $link ) {
-               $this->assertTag(
-                       [
-                               'tag' => 'a',
-                               'content' => $content
-                       ],
+               $this->assertRegExp(
+                       "#^<a .+>$content</a>$#",
                        $link,
-                       'assert query link element'
+                       'verify query link element'
                );
+               $this->assertValidHTML( $link );
 
                foreach ( $params as $key => $value ) {
                        $this->assertRegExp( '/' . $key . '=' . $value . '/', $link, "verify $key link params" );
index 995c4be..68f9079 100644 (file)
@@ -88,15 +88,14 @@ class RecentChangeTest extends MediaWikiTestCase {
        }
 
        /**
-        * 50 mins and 100 mins are used here as the tests never take that long!
         * @return array
         */
        public function provideIsInRCLifespan() {
                return [
-                       [ 6000, time() - 3000, 0, true ],
-                       [ 3000, time() - 6000, 0, false ],
-                       [ 6000, time() - 3000, 6000, true ],
-                       [ 3000, time() - 6000, 6000, true ],
+                       [ 6000, -3000, 0, true ],
+                       [ 3000, -6000, 0, false ],
+                       [ 6000, -3000, 6000, true ],
+                       [ 3000, -6000, 6000, true ],
                ];
        }
 
@@ -104,8 +103,12 @@ class RecentChangeTest extends MediaWikiTestCase {
         * @covers RecentChange::isInRCLifespan
         * @dataProvider provideIsInRCLifespan
         */
-       public function testIsInRCLifespan( $maxAge, $timestamp, $tolerance, $expected ) {
+       public function testIsInRCLifespan( $maxAge, $offset, $tolerance, $expected ) {
                $this->setMwGlobals( 'wgRCMaxAge', $maxAge );
+               // Calculate this here instead of the data provider because the provider
+               // is expanded early on and the full test suite may take longer than 100 minutes
+               // when coverage is enabled.
+               $timestamp = time() + $offset;
                $this->assertEquals( $expected, RecentChange::isInRCLifespan( $timestamp, $tolerance ) );
        }
 
index a3d1dda..403bee1 100644 (file)
@@ -429,7 +429,7 @@ class ContentHandlerTest extends MediaWikiTestCase {
         * @covers ContentHandler::getDataForSearchIndex
         */
        public function testDataIndexFields() {
-               $mockEngine = $this->getMock( 'SearchEngine' );
+               $mockEngine = $this->createMock( 'SearchEngine' );
                $title = Title::newFromText( 'Not_Main_Page', NS_MAIN );
                $page = new WikiPage( $title );
 
index 276a86e..65efcc9 100644 (file)
@@ -16,7 +16,7 @@ class FileContentHandlerTest extends MediaWikiLangTestCase {
        }
 
        public function testIndexMapping() {
-               $mockEngine = $this->getMock( 'SearchEngine' );
+               $mockEngine = $this->createMock( 'SearchEngine' );
 
                $mockEngine->expects( $this->atLeastOnce() )
                        ->method( 'makeSearchFieldMapping' )
index 918815c..7d9f74e 100644 (file)
@@ -16,7 +16,7 @@ class TextContentHandlerTest extends MediaWikiLangTestCase {
        public function testFieldsForIndex() {
                $handler = new TextContentHandler();
 
-               $mockEngine = $this->getMock( 'SearchEngine' );
+               $mockEngine = $this->createMock( 'SearchEngine' );
 
                $mockEngine->expects( $this->atLeastOnce() )
                        ->method( 'makeSearchFieldMapping' )
index ec97d76..290b11a 100644 (file)
@@ -245,7 +245,7 @@ class WikitextContentHandlerTest extends MediaWikiLangTestCase {
        */
 
        public function testDataIndexFieldsFile() {
-               $mockEngine = $this->getMock( 'SearchEngine' );
+               $mockEngine = $this->createMock( 'SearchEngine' );
                $title = Title::newFromText( 'Somefile.jpg', NS_FILE );
                $page = new WikiPage( $title );
 
index 606a209..45791e2 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * @group Database
  * @group Database
index d6249bb..ce21412 100644 (file)
@@ -160,7 +160,7 @@ class KafkaHandlerTest extends MediaWikiTestCase {
                                [ $this->anything(), $this->anything(), [ 'lines' ] ]
                        ] );
 
-               $formatter = $this->getMock( 'Monolog\Formatter\FormatterInterface' );
+               $formatter = $this->createMock( 'Monolog\Formatter\FormatterInterface' );
                $formatter->expects( $this->any() )
                        ->method( 'format' )
                        ->will( $this->onConsecutiveCalls( 'words', null, 'lines' ) );
@@ -191,7 +191,7 @@ class KafkaHandlerTest extends MediaWikiTestCase {
                        ->method( 'send' )
                        ->will( $this->returnValue( true ) );
 
-               $formatter = $this->getMock( 'Monolog\Formatter\FormatterInterface' );
+               $formatter = $this->createMock( 'Monolog\Formatter\FormatterInterface' );
                $formatter->expects( $this->any() )
                        ->method( 'format' )
                        ->will( $this->onConsecutiveCalls( 'words', null, 'lines' ) );
index 6c93c79..0d00fbc 100644 (file)
@@ -117,20 +117,21 @@ class FileBackendDBRepoWrapperTest extends MediaWikiTestCase {
                        ->disableOriginalConstructor()
                        ->getMock();
 
-               $backendMock = $this->getMock( 'FSFileBackend',
-                       [],
-                       [ [
-                               'name' => $this->backendName,
-                               'wikiId' => wfWikiID()
-                       ] ] );
-
-               $wrapperMock = $this->getMock( 'FileBackendDBRepoWrapper',
-                       [ 'getDB' ],
-                       [ [
-                               'backend' => $backendMock,
-                               'repoName' => $this->repoName,
-                               'dbHandleFactory' => null
-                       ] ] );
+               $backendMock = $this->getMockBuilder( 'FSFileBackend' )
+                       ->setConstructorArgs( [ [
+                                       'name' => $this->backendName,
+                                       'wikiId' => wfWikiID()
+                               ] ] )
+                       ->getMock();
+
+               $wrapperMock = $this->getMockBuilder( 'FileBackendDBRepoWrapper' )
+                       ->setMethods( [ 'getDB' ] )
+                       ->setConstructorArgs( [ [
+                                       'backend' => $backendMock,
+                                       'repoName' => $this->repoName,
+                                       'dbHandleFactory' => null
+                               ] ] )
+                       ->getMock();
 
                $wrapperMock->expects( $this->any() )->method( 'getDB' )->will( $this->returnValue( $dbMock ) );
 
index d3f9374..800c2fc 100644 (file)
@@ -41,19 +41,21 @@ class MigrateFileRepoLayoutTest extends MediaWikiTestCase {
                                new FakeResultWrapper( [] ) // filearchive
                        ) );
 
-               $repoMock = $this->getMock( 'LocalRepo',
-                       [ 'getMasterDB' ],
-                       [ [
-                               'name' => 'migratefilerepolayouttest',
-                               'backend' => $backend
-                       ] ] );
+               $repoMock = $this->getMockBuilder( 'LocalRepo' )
+                       ->setMethods( [ 'getMasterDB' ] )
+                       ->setConstructorArgs( [ [
+                                       'name' => 'migratefilerepolayouttest',
+                                       'backend' => $backend
+                               ] ] )
+                       ->getMock();
 
                $repoMock
                        ->expects( $this->any() )
                        ->method( 'getMasterDB' )
                        ->will( $this->returnValue( $dbMock ) );
 
-               $this->migratorMock = $this->getMock( 'MigrateFileRepoLayout', [ 'getRepo' ] );
+               $this->migratorMock = $this->getMockBuilder( 'MigrateFileRepoLayout' )
+                       ->setMethods( [ 'getRepo' ] )->getMock();
                $this->migratorMock
                        ->expects( $this->any() )
                        ->method( 'getRepo' )
index 25c6e95..82ff12e 100644 (file)
@@ -15,7 +15,7 @@ class RepoGroupTest extends MediaWikiTestCase {
 
        function testForEachForeignRepo() {
                $this->setUpForeignRepo();
-               $fakeCallback = $this->getMock( 'RepoGroupTestHelper' );
+               $fakeCallback = $this->createMock( 'RepoGroupTestHelper' );
                $fakeCallback->expects( $this->once() )->method( 'callback' );
                RepoGroup::singleton()->forEachForeignRepo(
                        [ $fakeCallback, 'callback' ], [ [] ] );
@@ -25,7 +25,7 @@ class RepoGroupTest extends MediaWikiTestCase {
                $this->setMwGlobals( 'wgForeignFileRepos', [] );
                RepoGroup::destroySingleton();
                FileBackendGroup::destroySingleton();
-               $fakeCallback = $this->getMock( 'RepoGroupTestHelper' );
+               $fakeCallback = $this->createMock( 'RepoGroupTestHelper' );
                $fakeCallback->expects( $this->never() )->method( 'callback' );
                RepoGroup::singleton()->forEachForeignRepo(
                        [ $fakeCallback, 'callback' ], [ [] ] );
index 6520610..5b5f1b0 100644 (file)
@@ -155,7 +155,8 @@ class FileTest extends MediaWikiMediaTestCase {
                        ->method( 'getLocalReference' )
                        ->will( $this->returnValue( $fsFile ) );
 
-               $handlerMock = $this->getMock( 'BitmapHandler', [ 'supportsBucketing' ] );
+               $handlerMock = $this->getMockBuilder( 'BitmapHandler' )
+                       ->setMethods( [ 'supportsBucketing' ] )->getMock();
                $handlerMock->expects( $this->any() )
                        ->method( 'supportsBucketing' )
                        ->will( $this->returnValue( $data['supportsBucketing'] ) );
@@ -261,7 +262,8 @@ class FileTest extends MediaWikiMediaTestCase {
                                'generateAndSaveThumb', 'getHandler' ] )
                        ->getMockForAbstractClass();
 
-               $handlerMock = $this->getMock( 'JpegHandler', [ 'supportsBucketing' ] );
+               $handlerMock = $this->getMockBuilder( 'JpegHandler' )
+                       ->setMethods( [ 'supportsBucketing' ] )->getMock();
                $handlerMock->expects( $this->any() )
                        ->method( 'supportsBucketing' )
                        ->will( $this->returnValue( true ) );
index 036baa8..3693a27 100644 (file)
@@ -66,6 +66,13 @@ class HttpTest extends MediaWikiTestCase {
         * @covers Http::getProxy
         */
        public function testGetProxy() {
+               $this->setMwGlobals( 'wgHTTPProxy', false );
+               $this->assertEquals(
+                       '',
+                       Http::getProxy(),
+                       'default setting'
+               );
+
                $this->setMwGlobals( 'wgHTTPProxy', 'proxy.domain.tld' );
                $this->assertEquals(
                        'proxy.domain.tld',
@@ -140,50 +147,56 @@ class HttpTest extends MediaWikiTestCase {
                ];
        }
 
+       public static function provideRelativeRedirects() {
+               return [
+                       [
+                               'location' => [ 'http://newsite/file.ext', '/newfile.ext' ],
+                               'final' => 'http://newsite/newfile.ext',
+                               'Relative file path Location: interpreted as full URL'
+                       ],
+                       [
+                               'location' => [ 'https://oldsite/file.ext' ],
+                               'final' => 'https://oldsite/file.ext',
+                               'Location to the HTTPS version of the site'
+                       ],
+                       [
+                               'location' => [
+                                       '/anotherfile.ext',
+                                       'http://anotherfile/hoster.ext',
+                                       'https://anotherfile/hoster.ext'
+                               ],
+                               'final' => 'https://anotherfile/hoster.ext',
+                               'Relative file path Location: should keep the latest host and scheme!'
+                       ],
+                       [
+                               'location' => [ '/anotherfile.ext' ],
+                               'final' => 'http://oldsite/anotherfile.ext',
+                               'Relative Location without domain '
+                       ],
+                       [
+                               'location' => null,
+                               'final' => 'http://oldsite/file.ext',
+                               'No Location (no redirect) '
+                       ],
+               ];
+       }
+
        /**
         * Warning:
         *
         * These tests are for code that makes use of an artifact of how CURL
         * handles header reporting on redirect pages, and will need to be
-        * rewritten when T31232 is taken care of (high-level handling of
-        * HTTP redirects).
+        * rewritten when T31232 is taken care of (high-level handling of HTTP redirects).
+        *
+        * @dataProvider provideRelativeRedirects
+        * @covers MWHttpRequest::getFinalUrl
         */
-       public function testRelativeRedirections() {
+       public function testRelativeRedirections( $location, $final, $message = null ) {
                $h = MWHttpRequestTester::factory( 'http://oldsite/file.ext', [], __METHOD__ );
-
-               # Forge a Location header
-               $h->setRespHeaders( 'location', [
-                               'http://newsite/file.ext',
-                               '/newfile.ext',
-                       ]
-               );
-               # Verify we correctly fix the Location
-               $this->assertEquals(
-                       'http://newsite/newfile.ext',
-                       $h->getFinalUrl(),
-                       "Relative file path Location: interpreted as full URL"
-               );
-
-               $h->setRespHeaders( 'location', [
-                               'https://oldsite/file.ext'
-                       ]
-               );
-               $this->assertEquals(
-                       'https://oldsite/file.ext',
-                       $h->getFinalUrl(),
-                       "Location to the HTTPS version of the site"
-               );
-
-               $h->setRespHeaders( 'location', [
-                               '/anotherfile.ext',
-                               'http://anotherfile/hoster.ext',
-                               'https://anotherfile/hoster.ext'
-                       ]
-               );
-               $this->assertEquals(
-                       'https://anotherfile/hoster.ext',
-                       $h->getFinalUrl( "Relative file path Location: should keep the latest host and scheme!" )
-               );
+               // Forge a Location header
+               $h->setRespHeaders( 'location', $location );
+               // Verify it correctly fixes the Location
+               $this->assertEquals( $final, $h->getFinalUrl(), $message );
        }
 
        /**
@@ -201,8 +214,6 @@ class HttpTest extends MediaWikiTestCase {
         * Extension API: 20140829
         *
         * Commented out constants that were removed in PHP 5.6.0
-        *
-        * @covers CurlHttpRequest::execute
         */
        public function provideCurlConstants() {
                return [
@@ -481,9 +492,8 @@ class HttpTest extends MediaWikiTestCase {
 
        /**
         * Added this test based on an issue experienced with HHVM 3.3.0-dev
-        * where it did not define a cURL constant.
+        * where it did not define a cURL constant. T72570
         *
-        * T72570
         * @dataProvider provideCurlConstants
         */
        public function testCurlConstants( $value ) {
index 600a36f..1deb7aa 100644 (file)
@@ -18,7 +18,8 @@ class JobTest extends MediaWikiTestCase {
        }
 
        public function provideTestToString() {
-               $mockToStringObj = $this->getMock( 'stdClass', [ '__toString' ] );
+               $mockToStringObj = $this->getMockBuilder( 'stdClass' )
+                       ->setMethods( [ '__toString' ] )->getMock();
                $mockToStringObj->expects( $this->any() )
                        ->method( '__toString' )
                        ->will( $this->returnValue( '{STRING_OBJ_VAL}' ) );
index 2e5c0bb..42f08cc 100644 (file)
@@ -18,6 +18,81 @@ class CSSMinTest extends MediaWikiTestCase {
                ] );
        }
 
+       /**
+        * @dataProvider mimeTypeProvider
+        */
+       public function testGetMimeType( $fileContents, $fileExtension, $expected ) {
+               $fileName = wfTempDir() . DIRECTORY_SEPARATOR . uniqid( 'MW_PHPUnit_CSSMinTest_' ) . '.'
+                       . $fileExtension;
+               $this->addTmpFiles( $fileName );
+               file_put_contents( $fileName, $fileContents );
+               $this->assertSame( $expected, CSSMin::getMimeType( $fileName ) );
+       }
+
+       public function mimeTypeProvider() {
+               return [
+                       'JPEG with short extension' => [
+                               "\xFF\xD8\xFF",
+                               'jpg',
+                               'image/jpeg'
+                       ],
+                       'JPEG with long extension' => [
+                               "\xFF\xD8\xFF",
+                               'jpeg',
+                               'image/jpeg'
+                       ],
+                       'PNG' => [
+                               "\x89\x50\x4E\x47\x0D\x0A\x1A\x0A",
+                               'png',
+                               'image/png'
+                       ],
+
+                       'PNG extension but JPEG content' => [
+                               "\xFF\xD8\xFF",
+                               'png',
+                               'image/png'
+                       ],
+                       'JPEG extension but PNG content' => [
+                               "\x89\x50\x4E\x47\x0D\x0A\x1A\x0A",
+                               'jpg',
+                               'image/jpeg'
+                       ],
+                       'PNG extension but SVG content' => [
+                               '<?xml version="1.0"?><svg></svg>',
+                               'png',
+                               'image/png'
+                       ],
+                       'SVG extension but PNG content' => [
+                               "\x89\x50\x4E\x47\x0D\x0A\x1A\x0A",
+                               'svg',
+                               'image/svg+xml'
+                       ],
+
+                       'SVG with all headers' => [
+                               '<?xml version="1.0"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" '
+                               . '"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg></svg>',
+                               'svg',
+                               'image/svg+xml'
+                       ],
+                       'SVG with XML header only' => [
+                               '<?xml version="1.0"?><svg></svg>',
+                               'svg',
+                               'image/svg+xml'
+                       ],
+                       'SVG with DOCTYPE only' => [
+                               '<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" '
+                               . '"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg></svg>',
+                               'svg',
+                               'image/svg+xml'
+                       ],
+                       'SVG without any header' => [
+                               '<svg></svg>',
+                               'svg',
+                               'image/svg+xml'
+                       ],
+               ];
+       }
+
        /**
         * @dataProvider provideMinifyCases
         * @covers CSSMin::minify
diff --git a/tests/phpunit/includes/libs/DnsSrvDiscovererTest.php b/tests/phpunit/includes/libs/DnsSrvDiscovererTest.php
new file mode 100644 (file)
index 0000000..cfd4d76
--- /dev/null
@@ -0,0 +1,140 @@
+<?php
+
+class DnsSrvDiscovererTest extends PHPUnit_Framework_TestCase {
+       /**
+        * @covers DnsSrvDiscoverer
+        * @dataProvider provideRecords
+        */
+       public function testPickServer( $params, $expected ) {
+               $discoverer = new DnsSrvDiscoverer( '_etcd._tcp.eqiad.wmnet' );
+               $record = $discoverer->pickServer( $params );
+
+               $this->assertEquals( $expected, $record );
+
+       }
+
+       public static function provideRecords() {
+               return [
+                       [
+                               [ // record list
+                                       [
+                                               'target' => 'conf1003.eqiad.wmnet',
+                                               'port' => 'SRV',
+                                               'pri' => 0,
+                                               'weight' => 1,
+                                       ],
+                                       [
+                                               'target' => 'conf1002.eqiad.wmnet',
+                                               'port' => 'SRV',
+                                               'pri' => 1,
+                                               'weight' => 1,
+                                       ],
+                                       [
+                                               'target' => 'conf1001.eqiad.wmnet',
+                                               'port' => 'SRV',
+                                               'pri' => 2,
+                                               'weight' => 1,
+                                       ],
+                               ], // selected record
+                               [
+                                       'target' => 'conf1003.eqiad.wmnet',
+                                       'port' => 'SRV',
+                                       'pri' => 0,
+                                       'weight' => 1,
+                               ]
+                       ],
+                       [
+                               [ // record list
+                                       [
+                                               'target' => 'conf1003or2.eqiad.wmnet',
+                                               'port' => 'SRV',
+                                               'pri' => 0,
+                                               'weight' => 1,
+                                       ],
+                                       [
+                                               'target' => 'conf1003or2.eqiad.wmnet',
+                                               'port' => 'SRV',
+                                               'pri' => 0,
+                                               'weight' => 1,
+                                       ],
+                                       [
+                                               'target' => 'conf1001.eqiad.wmnet',
+                                               'port' => 'SRV',
+                                               'pri' => 2,
+                                               'weight' => 1,
+                                       ],
+                                       [
+                                               'target' => 'conf1004.eqiad.wmnet',
+                                               'port' => 'SRV',
+                                               'pri' => 2,
+                                               'weight' => 1,
+                                       ],
+                                       [
+                                               'target' => 'conf1005.eqiad.wmnet',
+                                               'port' => 'SRV',
+                                               'pri' => 3,
+                                               'weight' => 1,
+                                       ],
+                               ], // selected record
+                               [
+                                       'target' => 'conf1003or2.eqiad.wmnet',
+                                       'port' => 'SRV',
+                                       'pri' => 0,
+                                       'weight' => 1,
+                               ]
+                       ],
+               ];
+       }
+
+       public function testRemoveServer() {
+               $dsd = new DnsSrvDiscoverer( 'localhost' );
+
+               $servers = [
+                       [
+                               'target' => 'conf1001.eqiad.wmnet',
+                               'port' => 35,
+                               'pri' => 2,
+                               'weight' => 1,
+                       ],
+                       [
+                               'target' => 'conf1004.eqiad.wmnet',
+                               'port' => 74,
+                               'pri' => 2,
+                               'weight' => 1,
+                       ],
+                       [
+                               'target' => 'conf1005.eqiad.wmnet',
+                               'port' => 77,
+                               'pri' => 3,
+                               'weight' => 1,
+                       ],
+               ];
+               $server = $servers[1];
+
+               $expected = [
+                       [
+                               'target' => 'conf1001.eqiad.wmnet',
+                               'port' => 35,
+                               'pri' => 2,
+                               'weight' => 1,
+                       ],
+                       [
+                               'target' => 'conf1005.eqiad.wmnet',
+                               'port' => 77,
+                               'pri' => 3,
+                               'weight' => 1,
+                       ],
+               ];
+
+               $this->assertEquals(
+                       $expected,
+                       $dsd->removeServer( $server, $servers ),
+                       "Correct server removed"
+               );
+               $this->assertEquals(
+                       $expected,
+                       $dsd->removeServer( $server, $servers ),
+                       "Nothing to remove"
+               );
+       }
+}
index 881f5e1..d99c587 100644 (file)
@@ -31,7 +31,8 @@ class MemoizedCallableTest extends PHPUnit_Framework_TestCase {
         * way as the original underlying callable.
         */
        public function testReturnValuePassedThrough() {
-               $mock = $this->getMock( 'stdClass', [ 'reverse' ] );
+               $mock = $this->getMockBuilder( 'stdClass' )
+                       ->setMethods( [ 'reverse' ] )->getMock();
                $mock->expects( $this->any() )
                        ->method( 'reverse' )
                        ->will( $this->returnCallback( 'strrev' ) );
@@ -47,7 +48,8 @@ class MemoizedCallableTest extends PHPUnit_Framework_TestCase {
         * @requires function apc_store/apcu_store
         */
        public function testCallableMemoized() {
-               $observer = $this->getMock( 'stdClass', [ 'computeSomething' ] );
+               $observer = $this->getMockBuilder( 'stdClass' )
+                       ->setMethods( [ 'computeSomething' ] )->getMock();
                $observer->expects( $this->once() )
                        ->method( 'computeSomething' )
                        ->will( $this->returnValue( 'ok' ) );
index f8dda6f..3e0a61e 100644 (file)
@@ -26,20 +26,24 @@ class ObjectFactoryTest extends PHPUnit_Framework_TestCase {
        public function testClosureExpansionDisabled() {
                $obj = ObjectFactory::getObjectFromSpec( [
                        'class' => 'ObjectFactoryTestFixture',
-                       'args' => [ function() {
-                               return 'unwrapped';
-                       }, ],
+                       'args' => [
+                               function() {
+                                       return 'wrapped';
+                               },
+                               'unwrapped',
+                       ],
                        'calls' => [
                                'setter' => [ function() {
-                                       return 'unwrapped';
+                                       return 'wrapped';
                                }, ],
                        ],
                        'closure_expansion' => false,
                ] );
                $this->assertInstanceOf( 'Closure', $obj->args[0] );
-               $this->assertSame( 'unwrapped', $obj->args[0]() );
+               $this->assertSame( 'wrapped', $obj->args[0]() );
+               $this->assertSame( 'unwrapped', $obj->args[1] );
                $this->assertInstanceOf( 'Closure', $obj->setterArgs[0] );
-               $this->assertSame( 'unwrapped', $obj->setterArgs[0]() );
+               $this->assertSame( 'wrapped', $obj->setterArgs[0]() );
        }
 
        /**
@@ -49,20 +53,24 @@ class ObjectFactoryTest extends PHPUnit_Framework_TestCase {
        public function testClosureExpansionEnabled() {
                $obj = ObjectFactory::getObjectFromSpec( [
                        'class' => 'ObjectFactoryTestFixture',
-                       'args' => [ function() {
-                               return 'unwrapped';
-                       }, ],
+                       'args' => [
+                               function() {
+                                       return 'wrapped';
+                               },
+                               'unwrapped',
+                       ],
                        'calls' => [
                                'setter' => [ function() {
-                                       return 'unwrapped';
+                                       return 'wrapped';
                                }, ],
                        ],
                        'closure_expansion' => true,
                ] );
                $this->assertInternalType( 'string', $obj->args[0] );
-               $this->assertSame( 'unwrapped', $obj->args[0] );
+               $this->assertSame( 'wrapped', $obj->args[0] );
+               $this->assertSame( 'unwrapped', $obj->args[1] );
                $this->assertInternalType( 'string', $obj->setterArgs[0] );
-               $this->assertSame( 'unwrapped', $obj->setterArgs[0] );
+               $this->assertSame( 'wrapped', $obj->setterArgs[0] );
 
                $obj = ObjectFactory::getObjectFromSpec( [
                        'class' => 'ObjectFactoryTestFixture',
index 9a48930..c5bc03e 100644 (file)
@@ -1,13 +1,14 @@
 <?php
 
 use Liuggio\StatsdClient\Entity\StatsdData;
+use Liuggio\StatsdClient\Sender\SenderInterface;
 
 class SamplingStatsdClientTest extends PHPUnit_Framework_TestCase {
        /**
         * @dataProvider samplingDataProvider
         */
        public function testSampling( $data, $sampleRate, $seed, $expectWrite ) {
-               $sender = $this->getMock( 'Liuggio\StatsdClient\Sender\SenderInterface' );
+               $sender = $this->getMockBuilder( SenderInterface::class )->getMock();
                $sender->expects( $this->any() )->method( 'open' )->will( $this->returnValue( true ) );
                if ( $expectWrite ) {
                        $sender->expects( $this->once() )->method( 'write' )
@@ -50,7 +51,7 @@ class SamplingStatsdClientTest extends PHPUnit_Framework_TestCase {
                $nonMatching->setKey( 'oof.bar' );
                $nonMatching->setValue( 1 );
 
-               $sender = $this->getMock( 'Liuggio\StatsdClient\Sender\SenderInterface' );
+               $sender = $this->getMockBuilder( SenderInterface::class )->getMock();
                $sender->expects( $this->any() )->method( 'open' )->will( $this->returnValue( true ) );
                $sender->expects( $this->once() )->method( 'write' )->with( $this->anything(),
                        $this->equalTo( $nonMatching ) );
index a1afa77..f2fe07d 100644 (file)
@@ -275,7 +275,7 @@ class BagOStuffTest extends MediaWikiTestCase {
         * @covers BagOStuff::trackDuplicateKeys
         */
        public function testReportDupes() {
-               $logger = $this->getMock( 'Psr\Log\NullLogger' );
+               $logger = $this->createMock( Psr\Log\NullLogger::class );
                $logger->expects( $this->once() )
                        ->method( 'warning' )
                        ->with( 'Duplicate get(): "{key}" fetched {count} times', [
index a01cc6b..5fbbdec 100644 (file)
@@ -82,4 +82,73 @@ class CachedBagOStuffTest extends PHPUnit_Framework_TestCase {
                $backend->set( 'bar', true );
                $this->assertEquals( true, $cache->get( 'bar' ) );
        }
+
+       /**
+        * @covers CachedBagOStuff::setDebug
+        */
+       public function testSetDebug() {
+               $backend = new HashBagOStuff();
+               $cache = new CachedBagOStuff( $backend );
+               // Access private property 'debugMode'
+               $backend = TestingAccessWrapper::newFromObject( $backend );
+               $cache = TestingAccessWrapper::newFromObject( $cache );
+               $this->assertFalse( $backend->debugMode );
+               $this->assertFalse( $cache->debugMode );
+
+               $cache->setDebug( true );
+               // Should have set both
+               $this->assertTrue( $backend->debugMode, 'sets backend' );
+               $this->assertTrue( $cache->debugMode, 'sets self' );
+       }
+
+       /**
+        * @covers CachedBagOStuff::deleteObjectsExpiringBefore
+        */
+       public function testExpire() {
+               $backend = $this->getMockBuilder( HashBagOStuff::class )
+                       ->setMethods( [ 'deleteObjectsExpiringBefore' ] )
+                       ->getMock();
+               $backend->expects( $this->once() )
+                       ->method( 'deleteObjectsExpiringBefore' )
+                       ->willReturn( false );
+
+               $cache = new CachedBagOStuff( $backend );
+               $cache->deleteObjectsExpiringBefore( '20110401000000' );
+       }
+
+       /**
+        * @covers CachedBagOStuff::makeKey
+        */
+       public function testMakeKey() {
+               $backend = $this->getMockBuilder( HashBagOStuff::class )
+                       ->setMethods( [ 'makeKey' ] )
+                       ->getMock();
+               $backend->method( 'makeKey' )
+                       ->willReturn( 'special/logic' );
+
+               // CachedBagOStuff wraps any backend with a process cache
+               // using HashBagOStuff. Hash has no special key limitations,
+               // but backends often do. Make sure it uses the backend's
+               // makeKey() logic, not the one inherited from HashBagOStuff
+               $cache = new CachedBagOStuff( $backend );
+
+               $this->assertEquals( 'special/logic', $backend->makeKey( 'special', 'logic' ) );
+               $this->assertEquals( 'special/logic', $cache->makeKey( 'special', 'logic' ) );
+       }
+
+       /**
+        * @covers CachedBagOStuff::makeGlobalKey
+        */
+       public function testMakeGlobalKey() {
+               $backend = $this->getMockBuilder( HashBagOStuff::class )
+                       ->setMethods( [ 'makeGlobalKey' ] )
+                       ->getMock();
+               $backend->method( 'makeGlobalKey' )
+                       ->willReturn( 'special/logic' );
+
+               $cache = new CachedBagOStuff( $backend );
+
+               $this->assertEquals( 'special/logic', $backend->makeGlobalKey( 'special', 'logic' ) );
+               $this->assertEquals( 'special/logic', $cache->makeGlobalKey( 'special', 'logic' ) );
+       }
 }
index c4db0cf..f44baeb 100644 (file)
@@ -5,6 +5,40 @@
  */
 class HashBagOStuffTest extends PHPUnit_Framework_TestCase {
 
+       /**
+        * @covers HashBagOStuff::__construct
+        */
+       public function testConstruct() {
+               $this->assertInstanceOf(
+                       HashBagOStuff::class,
+                       new HashBagOStuff()
+               );
+       }
+
+       /**
+        * @covers HashBagOStuff::__construct
+        * @expectedException InvalidArgumentException
+        */
+       public function testConstructBadZero() {
+               $cache = new HashBagOStuff( [ 'maxKeys' => 0 ] );
+       }
+
+       /**
+        * @covers HashBagOStuff::__construct
+        * @expectedException InvalidArgumentException
+        */
+       public function testConstructBadNeg() {
+               $cache = new HashBagOStuff( [ 'maxKeys' => -1 ] );
+       }
+
+       /**
+        * @covers HashBagOStuff::__construct
+        * @expectedException InvalidArgumentException
+        */
+       public function testConstructBadType() {
+               $cache = new HashBagOStuff( [ 'maxKeys' => 'x' ] );
+       }
+
        /**
         * @covers HashBagOStuff::delete
         */
@@ -56,7 +90,6 @@ class HashBagOStuffTest extends PHPUnit_Framework_TestCase {
        /**
         * Ensure maxKeys eviction prefers keeping new keys.
         *
-        * @covers HashBagOStuff::__construct
         * @covers HashBagOStuff::set
         */
        public function testEvictionAdd() {
@@ -76,7 +109,6 @@ class HashBagOStuffTest extends PHPUnit_Framework_TestCase {
         * Ensure maxKeys eviction prefers recently set keys
         * even if the keys pre-exist.
         *
-        * @covers HashBagOStuff::__construct
         * @covers HashBagOStuff::set
         */
        public function testEvictionSet() {
@@ -102,7 +134,6 @@ class HashBagOStuffTest extends PHPUnit_Framework_TestCase {
        /**
         * Ensure maxKeys eviction prefers recently retrieved keys (LRU).
         *
-        * @covers HashBagOStuff::__construct
         * @covers HashBagOStuff::doGet
         * @covers HashBagOStuff::hasKey
         */
index d7ed4bd..18729f0 100644 (file)
@@ -963,7 +963,8 @@ class WANObjectCacheTest extends PHPUnit_Framework_TestCase  {
        }
 
        public function testMcRouterSupport() {
-               $localBag = $this->getMock( 'EmptyBagOStuff', [ 'set', 'delete' ] );
+               $localBag = $this->getMockBuilder( 'EmptyBagOStuff' )
+                       ->setMethods( [ 'set', 'delete' ] )->getMock();
                $localBag->expects( $this->never() )->method( 'set' );
                $localBag->expects( $this->never() )->method( 'delete' );
                $wanCache = new WANObjectCache( [
index cd350e5..a3f3981 100644 (file)
@@ -19,7 +19,8 @@ class ConnectionManagerTest extends \PHPUnit_Framework_TestCase {
         * @return IDatabase|PHPUnit_Framework_MockObject_MockObject
         */
        private function getIDatabaseMock() {
-               return $this->getMock( IDatabase::class );
+               return $this->getMockBuilder( IDatabase::class )
+                       ->getMock();
        }
 
        /**
index 3b26d6f..4e76f2a 100644 (file)
@@ -19,7 +19,8 @@ class SessionConsistentConnectionManagerTest extends \PHPUnit_Framework_TestCase
         * @return IDatabase|PHPUnit_Framework_MockObject_MockObject
         */
        private function getIDatabaseMock() {
-               return $this->getMock( IDatabase::class );
+               return $this->getMockBuilder( IDatabase::class )
+                       ->getMock();
        }
 
        /**
index bf12f80..27e5a65 100644 (file)
@@ -69,7 +69,8 @@ class LinkRendererFactoryTest extends MediaWikiLangTestCase {
 
        public function testCreateForUser() {
                /** @var PHPUnit_Framework_MockObject_MockObject|User $user */
-               $user = $this->getMock( User::class, [ 'getStubThreshold' ] );
+               $user = $this->getMockBuilder( User::class )
+                       ->setMethods( [ 'getStubThreshold' ] )->getMock();
                $user->expects( $this->once() )
                        ->method( 'getStubThreshold' )
                        ->willReturn( 15 );
index 3fb4eab..2337899 100644 (file)
@@ -59,6 +59,32 @@ class DeleteLogFormatterTest extends LogFormatterTestCase {
        public static function provideRestoreLogDatabaseRows() {
                return [
                        // Current format
+                       [
+                               [
+                                       'type' => 'delete',
+                                       'action' => 'restore',
+                                       'comment' => 'delete comment',
+                                       'namespace' => NS_MAIN,
+                                       'title' => 'Page',
+                                       'params' => [
+                                               ':assoc:count' => [
+                                                       'revisions' => 2,
+                                                       'files' => 1,
+                                               ],
+                                       ],
+                               ],
+                               [
+                                       'text' => 'User restored page Page (2 revisions and 1 file)',
+                                       'api' => [
+                                               'count' => [
+                                                       'revisions' => 2,
+                                                       'files' => 1,
+                                               ],
+                                       ],
+                               ],
+                       ],
+
+                       // Legacy format without counts
                        [
                                [
                                        'type' => 'delete',
index 39b6f9f..c837d26 100644 (file)
@@ -17,7 +17,7 @@ class MailAddressTest extends MediaWikiTestCase {
                if ( wfIsWindows() ) {
                        $this->markTestSkipped( 'This test only works on non-Windows platforms' );
                }
-               $user = $this->getMock( 'User' );
+               $user = $this->createMock( 'User' );
                $user->expects( $this->any() )->method( 'getName' )->will(
                        $this->returnValue( 'UserName' )
                );
diff --git a/tests/phpunit/includes/objectcache/ObjectCacheTest.php b/tests/phpunit/includes/objectcache/ObjectCacheTest.php
new file mode 100644 (file)
index 0000000..d132183
--- /dev/null
@@ -0,0 +1,82 @@
+<?php
+
+class ObjectCacheTest extends MediaWikiTestCase {
+
+       protected function setUp() {
+               // Parent calls ObjectCache::clear() among other things
+               parent::setUp();
+
+               $this->setCacheConfig();
+               $this->setMwGlobals( [
+                       'wgMainCacheType' => CACHE_NONE,
+                       'wgMessageCacheType' => CACHE_NONE,
+                       'wgParserCacheType' => CACHE_NONE,
+               ] );
+       }
+
+       private function setCacheConfig( $arr = [] ) {
+               $defaults = [
+                       CACHE_NONE => [ 'class' => 'EmptyBagOStuff' ],
+                       CACHE_DB => [ 'class' => 'SqlBagOStuff' ],
+                       CACHE_ANYTHING => [ 'factory' => 'ObjectCache::newAnything' ],
+                       // Mock ACCEL with 'hash' as being installed.
+                       // This makes tests deterministic regardless of APC.
+                       CACHE_ACCEL => [ 'class' => 'HashBagOStuff' ],
+                       'hash' => [ 'class' => 'HashBagOStuff' ],
+               ];
+               $this->setMwGlobals( 'wgObjectCaches', $arr + $defaults );
+       }
+
+       /** @covers ObjectCache::newAnything */
+       public function testNewAnythingNothing() {
+               $this->assertInstanceOf(
+                       SqlBagOStuff::class,
+                       ObjectCache::newAnything( [] ),
+                       'No available types. Fallback to DB'
+               );
+       }
+
+       /** @covers ObjectCache::newAnything */
+       public function testNewAnythingHash() {
+               $this->setMwGlobals( [
+                       'wgMainCacheType' => 'hash'
+               ] );
+
+               $this->assertInstanceOf(
+                       HashBagOStuff::class,
+                       ObjectCache::newAnything( [] ),
+                       'Use an available type (hash)'
+               );
+       }
+
+       /** @covers ObjectCache::newAnything */
+       public function testNewAnythingAccel() {
+               $this->setMwGlobals( [
+                       'wgMainCacheType' => CACHE_ACCEL
+               ] );
+
+               $this->assertInstanceOf(
+                       HashBagOStuff::class,
+                       ObjectCache::newAnything( [] ),
+                       'Use an available type (CACHE_ACCEL)'
+               );
+       }
+
+       /** @covers ObjectCache::newAnything */
+       public function txestNewAnythingNoAccel() {
+               $this->setMwGlobals( [
+                       'wgMainCacheType' => CACHE_ACCEL
+               ] );
+
+               $this->setCacheConfig( [
+                       // Mock APC not being installed (T160519, T147161)
+                       CACHE_ACCEL => [ 'class' => 'EmptyBagOStuff' ]
+               ] );
+
+               $this->assertInstanceOf(
+                       SqlBagOStuff::class,
+                       ObjectCache::newAnything( [] ),
+                       'Fallback to DB if available types fall back to Empty'
+               );
+       }
+}
index 5ea7b1d..8a69b5c 100644 (file)
@@ -20,6 +20,9 @@
  * @file
  */
 
+/**
+ * @group Database
+ */
 class UserPasswordPolicyTest extends MediaWikiTestCase {
 
        protected $policies = [
index e3ea139..3e9c567 100644 (file)
@@ -1,5 +1,8 @@
 <?php
 
+/**
+ * @group Database
+ */
 class RCFeedIntegrationTest extends MediaWikiTestCase {
        protected function setUp() {
                parent::setUp();
index bf80845..29e1863 100644 (file)
@@ -44,6 +44,46 @@ class MessageBlobStoreTest extends PHPUnit_Framework_TestCase {
                return $module;
        }
 
+       /** @covers MessageBlobStore::setLogger */
+       public function testSetLogger() {
+               $blobStore = $this->makeBlobStore();
+               $this->assertSame( null, $blobStore->setLogger( new Psr\Log\NullLogger() ) );
+       }
+
+       /** @covers MessageBlobStore::getResourceLoader */
+       public function testGetResourceLoader() {
+               // Call protected method
+               $blobStore = TestingAccessWrapper::newFromObject( $this->makeBlobStore() );
+               $this->assertInstanceOf(
+                       ResourceLoader::class,
+                       $blobStore->getResourceLoader()
+               );
+       }
+
+       /** @covers MessageBlobStore::fetchMessage */
+       public function testFetchMessage() {
+               $module = $this->makeModule( [ 'mainpage' ] );
+               $rl = new ResourceLoader();
+               $rl->register( $module->getName(), $module );
+
+               $blobStore = $this->makeBlobStore( null, $rl );
+               $blob = $blobStore->getBlob( $module, 'en' );
+
+               $this->assertEquals( '{"mainpage":"Main Page"}', $blob, 'Generated blob' );
+       }
+
+       /** @covers MessageBlobStore::fetchMessage */
+       public function testFetchMessageFail() {
+               $module = $this->makeModule( [ 'i-dont-exist' ] );
+               $rl = new ResourceLoader();
+               $rl->register( $module->getName(), $module );
+
+               $blobStore = $this->makeBlobStore( null, $rl );
+               $blob = $blobStore->getBlob( $module, 'en' );
+
+               $this->assertEquals( '{"i-dont-exist":"\u29fci-dont-exist\u29fd"}', $blob, 'Generated blob' );
+       }
+
        public function testGetBlob() {
                $module = $this->makeModule( [ 'foo' ] );
                $rl = new ResourceLoader();
index 4a3b90a..7d12e59 100644 (file)
@@ -31,9 +31,7 @@ class ResourceLoaderFileModuleTest extends ResourceLoaderTestCase {
                                'deprecated' => true,
                        ],
                        'deprecatedTomorrow' => $base + [
-                               'deprecated' => [
-                                       'message' => 'Will be removed tomorrow.'
-                               ],
+                               'deprecated' => 'Will be removed tomorrow.'
                        ],
 
                        'htmlTemplateModule' => $base + [
index aeb82d1..3877288 100644 (file)
@@ -197,6 +197,62 @@ class ResourceLoaderImageModuleTest extends ResourceLoaderTestCase {
                ] ) );
                $this->assertInstanceOf( ResourceLoaderImage::class, $context->getImageObj() );
        }
+
+       public static function providerGetStyleDeclarations() {
+               return [
+                       [
+                               false,
+<<<TEXT
+background-image: url(rasterized.png);
+       background-image: linear-gradient(transparent, transparent), url(original.svg);
+       background-image: -o-linear-gradient(transparent, transparent), url(rasterized.png);
+TEXT
+                       ],
+                       [
+                               'data:image/svg+xml',
+<<<TEXT
+background-image: url(rasterized.png);
+       background-image: linear-gradient(transparent, transparent), url(data:image/svg+xml);
+       background-image: -o-linear-gradient(transparent, transparent), url(rasterized.png);
+TEXT
+                       ],
+
+               ];
+       }
+
+       /**
+        * @dataProvider providerGetStyleDeclarations
+        * @covers ResourceLoaderImageModule::getStyleDeclarations
+        */
+       public function testGetStyleDeclarations( $dataUriReturnValue, $expected ) {
+               $module = TestingAccessWrapper::newFromObject( new ResourceLoaderImageModule() );
+               $context = $this->getResourceLoaderContext();
+               $image = $this->getImageMock( $context, $dataUriReturnValue );
+
+               $styles = $module->getStyleDeclarations(
+                       $context,
+                       $image,
+                       'load.php'
+               );
+
+               $this->assertEquals( $expected, $styles );
+       }
+
+       private function getImageMock( ResourceLoaderContext $context, $dataUriReturnValue ) {
+               $image = $this->getMockBuilder( 'ResourceLoaderImage' )
+                       ->disableOriginalConstructor()
+                       ->getMock();
+               $image->method( 'getDataUri' )
+                       ->will( $this->returnValue( $dataUriReturnValue ) );
+               $image->expects( $this->any() )
+                       ->method( 'getUrl' )
+                       ->will( $this->returnValueMap( [
+                               [ $context, 'load.php', null, 'original', 'original.svg' ],
+                               [ $context, 'load.php', null, 'rasterized', 'rasterized.png' ],
+                       ] ) );
+
+               return $image;
+       }
 }
 
 class ResourceLoaderImageModuleTestable extends ResourceLoaderImageModule {
index 6751f4d..17861d8 100644 (file)
@@ -76,11 +76,11 @@ class ResourceLoaderModuleTest extends ResourceLoaderTestCase {
                        'script' => "var a = 'this is';\n {\ninvalid"
                ] );
                $this->assertEquals(
-                       $module->getScript( $context ),
                        'mw.log.error(' .
                                '"JavaScript parse error: Parse error: Unexpected token; ' .
                                'token } expected in file \'input\' on line 3"' .
                        ');',
+                       $module->getScript( $context ),
                        'Replace invalid syntax with error logging'
                );
 
@@ -88,8 +88,8 @@ class ResourceLoaderModuleTest extends ResourceLoaderTestCase {
                        'script' => "\n'valid';"
                ] );
                $this->assertEquals(
-                       $module->getScript( $context ),
                        "\n'valid';",
+                       $module->getScript( $context ),
                        'Leave valid scripts as-is'
                );
        }
@@ -120,13 +120,13 @@ class ResourceLoaderModuleTest extends ResourceLoaderTestCase {
                                '../skins/Example/images/quux.png',
                ];
                $this->assertEquals(
-                       $getRelativePaths->invoke( null, $raw ),
                        $canonical,
+                       $getRelativePaths->invoke( null, $raw ),
                        'Insert placeholders'
                );
                $this->assertEquals(
-                       $expandRelativePaths->invoke( null, $canonical ),
                        $raw,
+                       $expandRelativePaths->invoke( null, $canonical ),
                        'Substitute placeholders'
                );
        }
index 1b756be..1e09e92 100644 (file)
@@ -8,7 +8,7 @@ class ResourceLoaderStartUpModuleTest extends ResourceLoaderTestCase {
                ] );
        }
 
-       public static function provideGetModuleRegistrations() {
+       public function provideGetModuleRegistrations() {
                return [
                        [ [
                                'msg' => 'Empty registry',
@@ -33,6 +33,88 @@ mw.loader.register( [
         "test.blank",
         "{blankVer}"
     ]
+] );',
+                       ] ],
+                       [ [
+                               'msg' => 'Omit raw modules from registry',
+                               'modules' => [
+                                       'test.raw' => new ResourceLoaderTestModule( [ 'isRaw' => true ] ),
+                                       'test.blank' => new ResourceLoaderTestModule(),
+                               ],
+                               'out' => '
+mw.loader.addSource( {
+    "local": "/w/load.php"
+} );
+mw.loader.register( [
+    [
+        "test.blank",
+        "{blankVer}"
+    ]
+] );',
+                       ] ],
+                       [ [
+                               'msg' => 'Version falls back gracefully if getVersionHash throws',
+                               'modules' => [
+                                       'test.fail' => (
+                                               ( $mock = $this->getMockBuilder( 'ResourceLoaderTestModule' )
+                                                       ->setMethods( [ 'getVersionHash' ] )->getMock() )
+                                               && $mock->method( 'getVersionHash' )->will(
+                                                       $this->throwException( new Exception )
+                                               )
+                                       ) ? $mock : $mock
+                               ],
+                               'out' => '
+mw.loader.addSource( {
+    "local": "/w/load.php"
+} );
+mw.loader.register( [
+    [
+        "test.fail",
+        ""
+    ]
+] );
+mw.loader.state( {
+    "test.fail": "error"
+} );',
+                       ] ],
+                       [ [
+                               'msg' => 'Use version from getVersionHash',
+                               'modules' => [
+                                       'test.version' => (
+                                               ( $mock = $this->getMockBuilder( 'ResourceLoaderTestModule' )
+                                                       ->setMethods( [ 'getVersionHash' ] )->getMock() )
+                                               && $mock->method( 'getVersionHash' )->willReturn( '1234567' )
+                                       ) ? $mock : $mock
+                               ],
+                               'out' => '
+mw.loader.addSource( {
+    "local": "/w/load.php"
+} );
+mw.loader.register( [
+    [
+        "test.version",
+        "1234567"
+    ]
+] );',
+                       ] ],
+                       [ [
+                               'msg' => 'Re-hash version from getVersionHash if too long',
+                               'modules' => [
+                                       'test.version' => (
+                                               ( $mock = $this->getMockBuilder( 'ResourceLoaderTestModule' )
+                                                       ->setMethods( [ 'getVersionHash' ] )->getMock() )
+                                               && $mock->method( 'getVersionHash' )->willReturn( '12345678' )
+                                       ) ? $mock : $mock
+                               ],
+                               'out' => '
+mw.loader.addSource( {
+    "local": "/w/load.php"
+} );
+mw.loader.register( [
+    [
+        "test.version",
+        "016es8l"
+    ]
 ] );',
                        ] ],
                        [ [
@@ -303,8 +385,8 @@ mw.loader.register( [
 
        /**
         * @dataProvider provideGetModuleRegistrations
-        * @covers ResourceLoaderStartUpModule::compileUnresolvedDependencies
         * @covers ResourceLoaderStartUpModule::getModuleRegistrations
+        * @covers ResourceLoaderStartUpModule::compileUnresolvedDependencies
         * @covers ResourceLoader::makeLoaderRegisterScript
         */
        public function testGetModuleRegistrations( $case ) {
@@ -344,6 +426,7 @@ mw.loader.register( [
                ];
        }
        /**
+        * @covers ResourceLoaderStartUpModule::getModuleRegistrations
         * @dataProvider provideRegistrations
         */
        public function testRegistrationsMinified( $modules ) {
@@ -368,6 +451,7 @@ mw.loader.register( [
        }
 
        /**
+        * @covers ResourceLoaderStartUpModule::getModuleRegistrations
         * @dataProvider provideRegistrations
         */
        public function testRegistrationsUnminified( $modules ) {
index e0a82d0..2618e78 100644 (file)
@@ -49,13 +49,26 @@ class ResourceLoaderTest extends ResourceLoaderTestCase {
         * @covers ResourceLoader::register
         * @covers ResourceLoader::getModule
         */
-       public function testRegisterValid() {
+       public function testRegisterValidObject() {
                $module = new ResourceLoaderTestModule();
                $resourceLoader = new EmptyResourceLoader();
                $resourceLoader->register( 'test', $module );
                $this->assertEquals( $module, $resourceLoader->getModule( 'test' ) );
        }
 
+       /**
+        * @covers ResourceLoader::register
+        * @covers ResourceLoader::getModule
+        */
+       public function testRegisterValidArray() {
+               $module = new ResourceLoaderTestModule();
+               $resourceLoader = new EmptyResourceLoader();
+               // Covers case of register() setting $rl->moduleInfos,
+               // but $rl->modules lazy-populated by getModule()
+               $resourceLoader->register( 'test', [ 'object' => $module ] );
+               $this->assertEquals( $module, $resourceLoader->getModule( 'test' ) );
+       }
+
        /**
         * @covers ResourceLoader::register
         */
@@ -384,6 +397,33 @@ mw.example();
                );
        }
 
+       /**
+        * @covers ResourceLoader::makeLoaderRegisterScript
+        */
+       public function testMakeLoaderRegisterScript() {
+               $this->assertEquals(
+                       'mw.loader.register( [
+    [
+        "test.name",
+        "1234567"
+    ]
+] );',
+                       ResourceLoader::makeLoaderRegisterScript( [
+                               [ 'test.name', '1234567' ],
+                       ] ),
+                       'Nested array parameter'
+               );
+
+               $this->assertEquals(
+                       'mw.loader.register( "test.name", "1234567" );',
+                       ResourceLoader::makeLoaderRegisterScript(
+                               'test.name',
+                               '1234567'
+                       ),
+                       'Variadic parameters'
+               );
+       }
+
        /**
         * @covers ResourceLoader::makeLoaderSourcesScript
         */
index a332528..2d0d958 100644 (file)
@@ -1,5 +1,8 @@
 <?php
 
+use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\IDatabase;
+
 class ResourceLoaderWikiModuleTest extends ResourceLoaderTestCase {
 
        /**
@@ -214,6 +217,157 @@ class ResourceLoaderWikiModuleTest extends ResourceLoaderTestCase {
                $module = TestingAccessWrapper::newFromObject( $module );
                $this->assertEquals( $expected, $module->getTitleInfo( $context ), 'Title info' );
        }
+
+       /**
+        * @covers ResourceLoaderWikiModule::preloadTitleInfo
+        */
+       public function testGetPreloadedBadTitle() {
+               // Mock values
+               $pages = [
+                       // Covers else branch for invalid page name
+                       '[x]' => [ 'type' => 'styles' ],
+               ];
+               $titleInfo = [];
+
+               // Set up objects
+               $module = $this->getMockBuilder( 'TestResourceLoaderWikiModule' )
+                       ->setMethods( [ 'getPages' ] ) ->getMock();
+               $module->method( 'getPages' )->willReturn( $pages );
+               $module::$returnFetchTitleInfo = $titleInfo;
+               $rl = new EmptyResourceLoader();
+               $rl->register( 'testmodule', $module );
+               $context = new ResourceLoaderContext( $rl, new FauxRequest() );
+
+               // Act
+               TestResourceLoaderWikiModule::preloadTitleInfo(
+                       $context,
+                       wfGetDB( DB_REPLICA ),
+                       [ 'testmodule' ]
+               );
+
+               // Assert
+               $module = TestingAccessWrapper::newFromObject( $module );
+               $this->assertEquals( $titleInfo, $module->getTitleInfo( $context ), 'Title info' );
+       }
+
+       /**
+        * @covers ResourceLoaderWikiModule::preloadTitleInfo
+        */
+       public function testGetPreloadedTitleInfoEmpty() {
+               $context = new ResourceLoaderContext( new EmptyResourceLoader(), new FauxRequest() );
+               // Covers early return
+               $this->assertSame(
+                       null,
+                       ResourceLoaderWikiModule::preloadTitleInfo(
+                               $context,
+                               wfGetDB( DB_REPLICA ),
+                               []
+                       )
+               );
+       }
+
+       public static function provideGetContent() {
+               return [
+                       'Bad title' => [ null, '[x]' ],
+                       'Dead redirect' => [ null, [
+                               'text' => 'Dead redirect',
+                               'title' => 'Dead_redirect',
+                               'redirect' => 1,
+                       ] ],
+                       'Bad content model' => [ null, [
+                               'text' => 'MediaWiki:Wikitext',
+                               'ns' => NS_MEDIAWIKI,
+                               'title' => 'Wikitext',
+                       ] ],
+                       'No JS content found' => [ null, [
+                               'text' => 'MediaWiki:Script.js',
+                               'ns' => NS_MEDIAWIKI,
+                               'title' => 'Script.js',
+                       ] ],
+                       'No CSS content found' => [ null, [
+                               'text' => 'MediaWiki:Styles.css',
+                               'ns' => NS_MEDIAWIKI,
+                               'title' => 'Script.css',
+                       ] ],
+               ];
+       }
+
+       /**
+        * @covers ResourceLoaderWikiModule::getContent
+        * @dataProvider provideGetContent
+        */
+       public function testGetContent( $expected, $title ) {
+               $context = $this->getResourceLoaderContext( [], new EmptyResourceLoader );
+               $module = $this->getMockBuilder( 'ResourceLoaderWikiModule' )
+                       ->setMethods( [ 'getContentObj' ] ) ->getMock();
+               $module->expects( $this->any() )
+                       ->method( 'getContentObj' )->willReturn( null );
+
+               if ( is_array( $title ) ) {
+                       $title += [ 'ns' => NS_MAIN, 'id' => 1, 'len' => 1, 'redirect' => 0 ];
+                       $titleText = $title['text'];
+                       // Mock Title db access via LinkCache
+                       MediaWikiServices::getInstance()->getLinkCache()->addGoodLinkObj(
+                               $title['id'],
+                               new TitleValue( $title['ns'], $title['title'] ),
+                               $title['len'],
+                               $title['redirect']
+                       );
+               } else {
+                       $titleText = $title;
+               }
+
+               $module = TestingAccessWrapper::newFromObject( $module );
+               $this->assertEquals(
+                       $expected,
+                       $module->getContent( $titleText )
+               );
+
+       }
+
+       /**
+        * @covers ResourceLoaderWikiModule::getContent
+        */
+       public function testGetContentForRedirects() {
+               // Set up context and module object
+               $context = $this->getResourceLoaderContext( [], new EmptyResourceLoader );
+               $module = $this->getMockBuilder( 'ResourceLoaderWikiModule' )
+                       ->setMethods( [ 'getPages', 'getContentObj' ] )
+                       ->getMock();
+               $module->expects( $this->any() )
+                       ->method( 'getPages' )
+                       ->will( $this->returnValue( [
+                               'MediaWiki:Redirect.js' => [ 'type' => 'script' ]
+                       ] ) );
+               $module->expects( $this->any() )
+                       ->method( 'getContentObj' )
+                       ->will( $this->returnCallback( function ( Title $title ) {
+                               if ( $title->getPrefixedText() === 'MediaWiki:Redirect.js' ) {
+                                       $handler = new JavaScriptContentHandler();
+                                       return $handler->makeRedirectContent(
+                                               Title::makeTitle( NS_MEDIAWIKI, 'Target.js' )
+                                       );
+                               } elseif ( $title->getPrefixedText() === 'MediaWiki:Target.js' ) {
+                                       return new JavaScriptContent( 'target;' );
+                               } else {
+                                       return null;
+                               }
+                       } ) );
+
+               // Mock away Title's db queries with LinkCache
+               MediaWikiServices::getInstance()->getLinkCache()->addGoodLinkObj(
+                       1, // id
+                       new TitleValue( NS_MEDIAWIKI, 'Redirect.js' ),
+                       1, // len
+                       1 // redirect
+               );
+
+               $this->assertEquals(
+                       "/*\nMediaWiki:Redirect.js\n*/\ntarget;\n",
+                       $module->getScript( $context ),
+                       'Redirect resolved by getContent'
+               );
+       }
 }
 
 class TestResourceLoaderWikiModule extends ResourceLoaderWikiModule {
index 3fb4bbb..c74c893 100644 (file)
@@ -164,7 +164,8 @@ class SearchEngineTest extends MediaWikiLangTestCase {
                /**
                 * @var $mockEngine SearchEngine
                 */
-               $mockEngine = $this->getMock( 'SearchEngine', [ 'makeSearchFieldMapping' ] );
+               $mockEngine = $this->getMockBuilder( 'SearchEngine' )
+                       ->setMethods( [ 'makeSearchFieldMapping' ] )->getMock();
 
                $mockFieldBuilder = function ( $name, $type ) {
                        $mockField =
@@ -230,7 +231,7 @@ class SearchEngineTest extends MediaWikiLangTestCase {
        }
 
        public function addAugmentors( &$setAugmentors, &$rowAugmentors ) {
-               $setAugmentor = $this->getMock( 'ResultSetAugmentor' );
+               $setAugmentor = $this->createMock( 'ResultSetAugmentor' );
                $setAugmentor->expects( $this->once() )
                        ->method( 'augmentAll' )
                        ->willReturnCallback( function ( SearchResultSet $resultSet ) {
@@ -244,7 +245,7 @@ class SearchEngineTest extends MediaWikiLangTestCase {
                        } );
                $setAugmentors['testSet'] = $setAugmentor;
 
-               $rowAugmentor = $this->getMock( 'ResultAugmentor' );
+               $rowAugmentor = $this->createMock( 'ResultAugmentor' );
                $rowAugmentor->expects( $this->exactly( 2 ) )
                        ->method( 'augment' )
                        ->willReturnCallback( function ( SearchResult $result ) {
index c1eef2e..1ea27f3 100644 (file)
@@ -183,7 +183,8 @@ class BotPasswordSessionProviderTest extends MediaWikiTestCase {
        public function testNewSessionInfoForRequest() {
                $provider = $this->getProvider();
                $user = static::getTestSysop()->getUser();
-               $request = $this->getMock( 'FauxRequest', [ 'getIP' ] );
+               $request = $this->getMockBuilder( 'FauxRequest' )
+                       ->setMethods( [ 'getIP' ] )->getMock();
                $request->expects( $this->any() )->method( 'getIP' )
                        ->will( $this->returnValue( '127.0.0.1' ) );
                $bp = \BotPassword::newFromUser( $user, 'BotPasswordSessionProvider' );
@@ -210,7 +211,8 @@ class BotPasswordSessionProviderTest extends MediaWikiTestCase {
                $provider->setLogger( $logger );
 
                $user = static::getTestSysop()->getUser();
-               $request = $this->getMock( 'FauxRequest', [ 'getIP' ] );
+               $request = $this->getMockBuilder( 'FauxRequest' )
+                       ->setMethods( [ 'getIP' ] )->getMock();
                $request->expects( $this->any() )->method( 'getIP' )
                        ->will( $this->returnValue( '127.0.0.1' ) );
                $bp = \BotPassword::newFromUser( $user, 'BotPasswordSessionProvider' );
@@ -261,7 +263,8 @@ class BotPasswordSessionProviderTest extends MediaWikiTestCase {
                ], $logger->getBuffer() );
                $logger->clearBuffer();
 
-               $request2 = $this->getMock( 'FauxRequest', [ 'getIP' ] );
+               $request2 = $this->getMockBuilder( 'FauxRequest' )
+                       ->setMethods( [ 'getIP' ] )->getMock();
                $request2->expects( $this->any() )->method( 'getIP' )
                        ->will( $this->returnValue( '10.0.0.1' ) );
                $data['metadata'] = $dataMD;
index da4b06e..73485c8 100644 (file)
@@ -414,7 +414,9 @@ class CookieSessionProviderTest extends MediaWikiTestCase {
                );
                \TestingAccessWrapper::newFromObject( $backend )->usePhpSessionHandling = false;
 
-               $mock = $this->getMock( 'stdClass', [ 'onUserSetCookies' ] );
+               $mock = $this->getMockBuilder( 'stdClass' )
+                       ->setMethods( [ 'onUserSetCookies' ] )
+                       ->getMock();
                $mock->expects( $this->never() )->method( 'onUserSetCookies' );
                $this->mergeMwGlobalArrayValue( 'wgHooks', [ 'UserSetCookies' => [ $mock ] ] );
 
@@ -560,13 +562,15 @@ class CookieSessionProviderTest extends MediaWikiTestCase {
        }
 
        protected function getSentRequest() {
-               $sentResponse = $this->getMock( 'FauxResponse', [ 'headersSent', 'setCookie', 'header' ] );
+               $sentResponse = $this->getMockBuilder( 'FauxResponse' )
+                       ->setMethods( [ 'headersSent', 'setCookie', 'header' ] )->getMock();
                $sentResponse->expects( $this->any() )->method( 'headersSent' )
                        ->will( $this->returnValue( true ) );
                $sentResponse->expects( $this->never() )->method( 'setCookie' );
                $sentResponse->expects( $this->never() )->method( 'header' );
 
-               $sentRequest = $this->getMock( 'FauxRequest', [ 'response' ] );
+               $sentRequest = $this->getMockBuilder( 'FauxRequest' )
+                       ->setMethods( [ 'response' ] )->getMock();
                $sentRequest->expects( $this->any() )->method( 'response' )
                        ->will( $this->returnValue( $sentResponse ) );
                return $sentRequest;
@@ -603,7 +607,8 @@ class CookieSessionProviderTest extends MediaWikiTestCase {
                \TestingAccessWrapper::newFromObject( $backend )->usePhpSessionHandling = false;
 
                // Anonymous user
-               $mock = $this->getMock( 'stdClass', [ 'onUserSetCookies' ] );
+               $mock = $this->getMockBuilder( 'stdClass' )
+                       ->setMethods( [ 'onUserSetCookies' ] )->getMock();
                $mock->expects( $this->never() )->method( 'onUserSetCookies' );
                $this->mergeMwGlobalArrayValue( 'wgHooks', [ 'UserSetCookies' => [ $mock ] ] );
                $backend->setUser( $anon );
@@ -621,7 +626,8 @@ class CookieSessionProviderTest extends MediaWikiTestCase {
                $provider->persistSession( $backend, $this->getSentRequest() );
 
                // Logged-in user, no remember
-               $mock = $this->getMock( __CLASS__, [ 'onUserSetCookies' ] );
+               $mock = $this->getMockBuilder( __CLASS__ )
+                       ->setMethods( [ 'onUserSetCookies' ] )->getMock();
                $mock->expects( $this->once() )->method( 'onUserSetCookies' )
                        ->will( $this->returnCallback( function ( $u, &$sessionData, &$cookies ) use ( $user ) {
                                $this->assertSame( $user, $u );
@@ -664,7 +670,8 @@ class CookieSessionProviderTest extends MediaWikiTestCase {
                $provider->persistSession( $backend, $this->getSentRequest() );
 
                // Logged-in user, remember
-               $mock = $this->getMock( __CLASS__, [ 'onUserSetCookies' ] );
+               $mock = $this->getMockBuilder( __CLASS__ )
+                       ->setMethods( [ 'onUserSetCookies' ] )->getMock();
                $mock->expects( $this->once() )->method( 'onUserSetCookies' )
                        ->will( $this->returnCallback( function ( $u, &$sessionData, &$cookies ) use ( $user ) {
                                $this->assertSame( $user, $u );
index 78edb76..7ef230e 100644 (file)
@@ -157,13 +157,16 @@ class ImmutableSessionProviderWithCookieTest extends MediaWikiTestCase {
        }
 
        protected function getSentRequest() {
-               $sentResponse = $this->getMock( 'FauxResponse', [ 'headersSent', 'setCookie', 'header' ] );
+               $sentResponse = $this->getMockBuilder( 'FauxResponse' )
+                       ->setMethods( [ 'headersSent', 'setCookie', 'header' ] )
+                       ->getMock();
                $sentResponse->expects( $this->any() )->method( 'headersSent' )
                        ->will( $this->returnValue( true ) );
                $sentResponse->expects( $this->never() )->method( 'setCookie' );
                $sentResponse->expects( $this->never() )->method( 'header' );
 
-               $sentRequest = $this->getMock( 'FauxRequest', [ 'response' ] );
+               $sentRequest = $this->getMockBuilder( 'FauxRequest' )
+                       ->setMethods( [ 'response' ] )->getMock();
                $sentRequest->expects( $this->any() )->method( 'response' )
                        ->will( $this->returnValue( $sentResponse ) );
                return $sentRequest;
index 8a0adba..4a28f7a 100644 (file)
@@ -293,7 +293,8 @@ class SessionBackendTest extends MediaWikiTestCase {
        }
 
        public function testPersist() {
-               $this->provider = $this->getMock( 'DummySessionProvider', [ 'persistSession' ] );
+               $this->provider = $this->getMockBuilder( 'DummySessionProvider' )
+                       ->setMethods( [ 'persistSession' ] )->getMock();
                $this->provider->expects( $this->once() )->method( 'persistSession' );
                $backend = $this->getBackend();
                $this->assertFalse( $backend->isPersistent(), 'sanity check' );
@@ -312,7 +313,8 @@ class SessionBackendTest extends MediaWikiTestCase {
        }
 
        public function testUnpersist() {
-               $this->provider = $this->getMock( 'DummySessionProvider', [ 'unpersistSession' ] );
+               $this->provider = $this->getMockBuilder( 'DummySessionProvider' )
+                       ->setMethods( [ 'unpersistSession' ] )->getMock();
                $this->provider->expects( $this->once() )->method( 'unpersistSession' );
                $backend = $this->getBackend();
                $wrap = \TestingAccessWrapper::newFromObject( $backend );
@@ -362,7 +364,8 @@ class SessionBackendTest extends MediaWikiTestCase {
        public function testSetUser() {
                $user = static::getTestSysop()->getUser();
 
-               $this->provider = $this->getMock( 'DummySessionProvider', [ 'canChangeUser' ] );
+               $this->provider = $this->getMockBuilder( 'DummySessionProvider' )
+                       ->setMethods( [ 'canChangeUser' ] )->getMock();
                $this->provider->expects( $this->any() )->method( 'canChangeUser' )
                        ->will( $this->returnValue( false ) );
                $backend = $this->getBackend();
@@ -488,7 +491,8 @@ class SessionBackendTest extends MediaWikiTestCase {
                $this->store = new TestBagOStuff();
                $testData = [ 'foo' => 'foo!', 'bar', [ 'baz', null ] ];
 
-               $neverHook = $this->getMock( __CLASS__, [ 'onSessionMetadata' ] );
+               $neverHook = $this->getMockBuilder( __CLASS__ )
+                       ->setMethods( [ 'onSessionMetadata' ] )->getMock();
                $neverHook->expects( $this->never() )->method( 'onSessionMetadata' );
 
                $builder = $this->getMockBuilder( 'DummySessionProvider' )
@@ -694,7 +698,8 @@ class SessionBackendTest extends MediaWikiTestCase {
 
                // Bad hook
                $this->provider = null;
-               $mockHook = $this->getMock( __CLASS__, [ 'onSessionMetadata' ] );
+               $mockHook = $this->getMockBuilder( __CLASS__ )
+                       ->setMethods( [ 'onSessionMetadata' ] )->getMock();
                $mockHook->expects( $this->any() )->method( 'onSessionMetadata' )
                        ->will( $this->returnCallback(
                                function ( SessionBackend $backend, array &$metadata, array $requests ) {
@@ -738,7 +743,8 @@ class SessionBackendTest extends MediaWikiTestCase {
                $testData = [ 'foo' => 'foo!', 'bar', [ 'baz', null ] ];
 
                // Not persistent
-               $this->provider = $this->getMock( 'DummySessionProvider', [ 'persistSession' ] );
+               $this->provider = $this->getMockBuilder( 'DummySessionProvider' )
+                       ->setMethods( [ 'persistSession' ] )->getMock();
                $this->provider->expects( $this->never() )->method( 'persistSession' );
                $this->onSessionMetadataCalled = false;
                $this->mergeMwGlobalArrayValue( 'wgHooks', [ 'SessionMetadata' => [ $this ] ] );
@@ -763,7 +769,8 @@ class SessionBackendTest extends MediaWikiTestCase {
                $this->assertNotEquals( 0, $wrap->expires );
 
                // Persistent
-               $this->provider = $this->getMock( 'DummySessionProvider', [ 'persistSession' ] );
+               $this->provider = $this->getMockBuilder( 'DummySessionProvider' )
+                       ->setMethods( [ 'persistSession' ] )->getMock();
                $this->provider->expects( $this->atLeastOnce() )->method( 'persistSession' );
                $this->onSessionMetadataCalled = false;
                $this->mergeMwGlobalArrayValue( 'wgHooks', [ 'SessionMetadata' => [ $this ] ] );
@@ -789,7 +796,8 @@ class SessionBackendTest extends MediaWikiTestCase {
                $this->assertNotEquals( 0, $wrap->expires );
 
                // Not persistent, not expiring
-               $this->provider = $this->getMock( 'DummySessionProvider', [ 'persistSession' ] );
+               $this->provider = $this->getMockBuilder( 'DummySessionProvider' )
+                       ->setMethods( [ 'persistSession' ] )->getMock();
                $this->provider->expects( $this->never() )->method( 'persistSession' );
                $this->onSessionMetadataCalled = false;
                $this->mergeMwGlobalArrayValue( 'wgHooks', [ 'SessionMetadata' => [ $this ] ] );
index 48a72d3..c4b1072 100644 (file)
@@ -779,7 +779,8 @@ class SessionManagerTest extends MediaWikiTestCase {
                $manager = \TestingAccessWrapper::newFromObject( $this->getManager() );
                $manager->setLogger( new \Psr\Log\NullLogger() );
 
-               $mock = $this->getMock( 'stdClass', [ 'shutdown' ] );
+               $mock = $this->getMockBuilder( 'stdClass' )
+                       ->setMethods( [ 'shutdown' ] )->getMock();
                $mock->expects( $this->once() )->method( 'shutdown' );
 
                $manager->allSessionBackends = [ $mock ];
index e6a6ad3..f6c88ec 100644 (file)
@@ -37,8 +37,9 @@ class SessionTest extends MediaWikiTestCase {
         * @param bool $ret Whether the method returns a value
         */
        public function testMethods( $m, $args, $index, $ret ) {
-               $mock = $this->getMock( DummySessionBackend::class,
-                       [ $m, 'deregisterSession' ] );
+               $mock = $this->getMockBuilder( DummySessionBackend::class )
+                       ->setMethods( [ $m, 'deregisterSession' ] )
+                       ->getMock();
                $mock->expects( $this->once() )->method( 'deregisterSession' )
                        ->with( $this->identicalTo( 42 ) );
 
@@ -223,9 +224,9 @@ class SessionTest extends MediaWikiTestCase {
                $session = TestUtils::getDummySession();
                $priv = \TestingAccessWrapper::newFromObject( $session );
 
-               $backend = $this->getMock(
-                       DummySessionBackend::class, [ 'canSetUser', 'setUser', 'save' ]
-               );
+               $backend = $this->getMockBuilder( DummySessionBackend::class )
+                       ->setMethods( [ 'canSetUser', 'setUser', 'save' ] )
+                       ->getMock();
                $backend->expects( $this->once() )->method( 'canSetUser' )
                        ->will( $this->returnValue( true ) );
                $backend->expects( $this->once() )->method( 'setUser' )
@@ -238,9 +239,9 @@ class SessionTest extends MediaWikiTestCase {
                $this->assertSame( [], $backend->data );
                $this->assertTrue( $backend->dirty );
 
-               $backend = $this->getMock(
-                       DummySessionBackend::class, [ 'canSetUser', 'setUser', 'save' ]
-               );
+               $backend = $this->getMockBuilder( DummySessionBackend::class )
+                       ->setMethods( [ 'canSetUser', 'setUser', 'save' ] )
+                       ->getMock();
                $backend->data = [];
                $backend->expects( $this->once() )->method( 'canSetUser' )
                        ->will( $this->returnValue( true ) );
@@ -253,9 +254,9 @@ class SessionTest extends MediaWikiTestCase {
                $session->clear();
                $this->assertFalse( $backend->dirty );
 
-               $backend = $this->getMock(
-                       DummySessionBackend::class, [ 'canSetUser', 'setUser', 'save' ]
-               );
+               $backend = $this->getMockBuilder( DummySessionBackend::class )
+                       ->setMethods( [ 'canSetUser', 'setUser', 'save' ] )
+                       ->getMock();
                $backend->expects( $this->once() )->method( 'canSetUser' )
                        ->will( $this->returnValue( false ) );
                $backend->expects( $this->never() )->method( 'setUser' );
index cb4b697..c0d8c00 100644 (file)
@@ -75,7 +75,7 @@ class SiteExporterTest extends PHPUnit_Framework_TestCase {
        }
 
        private function newSiteStore( SiteList $sites ) {
-               $store = $this->getMock( 'SiteStore' );
+               $store = $this->getMockBuilder( 'SiteStore' )->getMock();
 
                $store->expects( $this->once() )
                        ->method( 'saveSites' )
index 45241c5..ea49429 100644 (file)
@@ -32,7 +32,7 @@
 class SiteImporterTest extends PHPUnit_Framework_TestCase {
 
        private function newSiteImporter( array $expectedSites, $errorCount ) {
-               $store = $this->getMock( 'SiteStore' );
+               $store = $this->getMockBuilder( 'SiteStore' )->getMock();
 
                $store->expects( $this->once() )
                        ->method( 'saveSites' )
@@ -44,7 +44,7 @@ class SiteImporterTest extends PHPUnit_Framework_TestCase {
                        ->method( 'getSites' )
                        ->will( $this->returnValue( new SiteList() ) );
 
-               $errorHandler = $this->getMock( 'Psr\Log\LoggerInterface' );
+               $errorHandler = $this->getMockBuilder( 'Psr\Log\LoggerInterface' )->getMock();
                $errorHandler->expects( $this->exactly( $errorCount ) )
                        ->method( 'error' );
 
@@ -148,7 +148,7 @@ class SiteImporterTest extends PHPUnit_Framework_TestCase {
        public function testImportFromXML_malformed() {
                $this->setExpectedException( 'Exception' );
 
-               $store = $this->getMock( 'SiteStore' );
+               $store = $this->getMockBuilder( 'SiteStore' )->getMock();
                $importer = new SiteImporter( $store );
                $importer->importFromXML( 'THIS IS NOT XML' );
        }
index 621d6a2..03e341a 100644 (file)
@@ -13,15 +13,42 @@ abstract class AbstractChangesListSpecialPageTestCase extends MediaWikiTestCase
         */
        protected $changesListSpecialPage;
 
+       protected $oldPatrollersGroup;
+
        protected function setUp() {
+               global $wgGroupPermissions;
+
                parent::setUp();
                $this->setMwGlobals( 'wgRCWatchCategoryMembership', true );
+
+               if ( isset( $wgGroupPermissions['patrollers'] ) ) {
+                       $this->oldPatrollersGroup = $wgGroupPermissions['patrollers'];
+               }
+
+               $wgGroupPermissions['patrollers'] = [
+                       'patrol' => true,
+               ];
+       }
+
+       protected function tearDown() {
+               global $wgGroupPermissions;
+
+               parent::tearDown();
+
+               if ( $this->oldPatrollersGroup !== null ) {
+                       $wgGroupPermissions['patrollers'] = $this->oldPatrollersGroup;
+               }
        }
 
        /**
         * @dataProvider provideParseParameters
         */
        public function testParseParameters( $params, $expected ) {
+               $context = $this->changesListSpecialPage->getContext();
+               $context = new DerivativeContext( $context );
+               $context->setUser( $this->getTestUser( [ 'patrollers' ] )->getUser() );
+               $this->changesListSpecialPage->setContext( $context );
+
                $this->changesListSpecialPage->registerFilters();
 
                $opts = new FormOptions();
index c292e97..e10a97f 100644 (file)
@@ -173,7 +173,7 @@ class ChangesListSpecialPageTest extends AbstractChangesListSpecialPageTestCase
                $user = $this->getTestUser()->getUser();
                $this->assertConditions(
                        [ # expected
-                               "rc_user != '{$user->getId()}'",
+                               "rc_user_text != '{$user->getName()}'",
                        ],
                        [
                                'hidemyself' => 1,
@@ -199,7 +199,7 @@ class ChangesListSpecialPageTest extends AbstractChangesListSpecialPageTestCase
                $user = $this->getTestUser()->getUser();
                $this->assertConditions(
                        [ # expected
-                               "rc_user = '{$user->getId()}'",
+                               "rc_user_text = '{$user->getName()}'",
                        ],
                        [
                                'hidebyothers' => 1,
@@ -225,8 +225,8 @@ class ChangesListSpecialPageTest extends AbstractChangesListSpecialPageTestCase
                $user = $this->getTestUser()->getUser();
                $this->assertConditions(
                        [ # expected
-                               "rc_user != '{$user->getId()}'",
-                               "rc_user = '{$user->getId()}'",
+                               "rc_user_text != '{$user->getName()}'",
+                               "rc_user_text = '{$user->getName()}'",
                        ],
                        [
                                'hidemyself' => 1,
index 4a46464..fd587bf 100644 (file)
@@ -25,7 +25,7 @@ class SpecialPreferencesTest extends MediaWikiTestCase {
                // Set a low limit
                $this->setMwGlobals( 'wgMaxSigChars', 2 );
 
-               $user = $this->getMock( 'User' );
+               $user = $this->createMock( 'User' );
                $user->expects( $this->any() )
                        ->method( 'isAnon' )
                        ->will( $this->returnValue( false ) );
index 9daae97..4e9d826 100644 (file)
@@ -150,23 +150,25 @@ class SpecialSearchTest extends MediaWikiTestCase {
                        [
                                'With suggestion and no rewritten query shows did you mean',
                                '/Did you mean: <a[^>]+>first suggestion/',
-                               new SpecialSearchTestMockResultSet( 'first suggestion', null, [
-                                       SearchResult::newFromTitle( Title::newMainPage() ),
-                               ] ),
+                               'first suggestion',
+                               null,
+                               [ Title::newMainPage() ]
                        ],
 
                        [
                                'With rewritten query informs user of change',
                                '/Showing results for <a[^>]+>first suggestion/',
-                               new SpecialSearchTestMockResultSet( 'asdf', 'first suggestion', [
-                                       SearchResult::newFromTitle( Title::newMainPage() ),
-                               ] ),
+                               'asdf',
+                               'first suggestion',
+                               [ Title::newMainPage() ]
                        ],
 
                        [
                                'When both queries have no results user gets no results',
                                '/There were no results matching the query/',
-                               new SpecialSearchTestMockResultSet( 'first suggestion', 'first suggestion', [] ),
+                               'first suggestion',
+                               'first suggestion',
+                               []
                        ],
                ];
        }
@@ -174,8 +176,24 @@ class SpecialSearchTest extends MediaWikiTestCase {
        /**
         * @dataProvider provideRewriteQueryWithSuggestion
         */
-       public function testRewriteQueryWithSuggestion( $message, $expectRegex, $results ) {
-               $mockSearchEngine = $this->mockSearchEngine( $results );
+       public function testRewriteQueryWithSuggestion(
+               $message,
+               $expectRegex,
+               $suggestion,
+               $rewrittenQuery,
+               array $resultTitles
+       ) {
+               $results = array_map( function( $title ) {
+                       return SearchResult::newFromTitle( $title );
+               }, $resultTitles );
+
+               $searchResults = new SpecialSearchTestMockResultSet(
+                       $suggestion,
+                       $rewrittenQuery,
+                       $results
+               );
+
+               $mockSearchEngine = $this->mockSearchEngine( $searchResults );
                $search = $this->getMockBuilder( 'SpecialSearch' )
                        ->setMethods( [ 'getSearchEngine' ] )
                        ->getMock();
index 6e702b6..66d35a5 100644 (file)
@@ -8,6 +8,41 @@
  * @covers SpecialWatchlist
  */
 class SpecialWatchlistTest extends SpecialPageTestBase {
+       public function setUp() {
+               parent::setUp();
+
+               $this->setTemporaryHook(
+                       'ChangesListSpecialPageFilters',
+                       null
+               );
+
+               $this->setTemporaryHook(
+                       'SpecialWatchlistQuery',
+                       null
+               );
+
+               $this->setTemporaryHook(
+                       'ChangesListSpecialPageQuery',
+                       null
+               );
+
+               $this->setMwGlobals(
+                       'wgDefaultUserOptions',
+                       [
+                               'extendwatchlist' => 1,
+                               'watchlistdays' => 3.0,
+                               'watchlisthideanons' => 0,
+                               'watchlisthidebots' => 0,
+                               'watchlisthideliu' => 0,
+                               'watchlisthideminor' => 0,
+                               'watchlisthideown' => 0,
+                               'watchlisthidepatrolled' => 0,
+                               'watchlisthidecategorization' => 1,
+                               'watchlistreloadautomatically' => 0,
+                       ]
+               );
+
+       }
 
        /**
         * Returns a new instance of the special page under test.
@@ -29,4 +64,124 @@ class SpecialWatchlistTest extends SpecialPageTestBase {
                $this->assertContains( '(nowatchlist)', $html );
        }
 
+       /**
+        * @dataProvider provideFetchOptionsFromRequest
+        */
+       public function testFetchOptionsFromRequest( $expectedValues, $preferences, $inputParams ) {
+               $page = TestingAccessWrapper::newFromObject(
+                       $this->newSpecialPage()
+               );
+
+               $context = new DerivativeContext( $page->getContext() );
+
+               $fauxRequest = new FauxRequest( $inputParams, /* $wasPosted= */ false );
+               $user = $this->getTestUser()->getUser();
+
+               foreach ( $preferences as $key => $value ) {
+                       $user->setOption( $key, $value );
+               }
+
+               $context->setRequest( $fauxRequest );
+               $context->setUser( $user );
+               $page->setContext( $context );
+
+               $page->registerFilters();
+               $formOptions = $page->getDefaultOptions();
+               $page->fetchOptionsFromRequest( $formOptions );
+
+               $this->assertArrayEquals(
+                       $expectedValues,
+                       $formOptions->getAllValues(),
+                       /* $ordered= */ false,
+                       /* $named= */ true
+               );
+       }
+
+       public function provideFetchOptionsFromRequest() {
+               // $defaults and $allFalse are just to make the expected values below
+               // shorter by hiding the background.
+
+               $page = TestingAccessWrapper::newFromObject(
+                       $this->newSpecialPage()
+               );
+
+               $this->setTemporaryHook(
+                       'ChangesListSpecialPageFilters',
+                       null
+               );
+
+               $page->registerFilters();
+
+               // Does not consider $preferences, just wiki's defaults
+               $wikiDefaults = $page->getDefaultOptions()->getAllValues();
+
+               $allFalse = $wikiDefaults;
+
+               foreach ( $allFalse as $key => &$value ) {
+                       if ( $value === true ) {
+                               $value = false;
+                       }
+               }
+
+               // This is not exposed on the form (only in preferences) so it
+               // respects the preference.
+               $allFalse['extended'] = true;
+
+               return [
+                       [
+                               [
+                                       'hideminor' => true,
+                               ] + $wikiDefaults,
+                               [],
+                               [
+                                       'hideMinor' => 1,
+                               ],
+                       ],
+
+                       [
+                               [
+                                       // First two same as prefs
+                                       'hideminor' => true,
+                                       'hidebots' => false,
+
+                                       // Second two overriden
+                                       'hideanons' => false,
+                                       'hideliu' => true,
+                               ] + $wikiDefaults,
+                               [
+                                       'watchlisthideminor' => 1,
+                                       'watchlisthidebots' => 0,
+
+                                       'watchlisthideanons' => 1,
+                                       'watchlisthideliu' => 0,
+                               ],
+                               [
+                                       'hideanons' => 0,
+                                       'hideliu' => 1,
+                               ],
+                       ],
+
+                       // Defaults/preferences for form elements are entirely ignored for
+                       // action=submit and omitted elements become false
+                       [
+                               [
+                                       'hideminor' => false,
+                                       'hidebots' => true,
+                                       'hideanons' => false,
+                                       'hideliu' => true,
+                               ] + $allFalse,
+                               [
+                                       'watchlisthideminor' => 0,
+                                       'watchlisthidebots' => 1,
+                                       'watchlisthideanons' => 1,
+                                       'watchlisthideliu' => 0,
+                               ],
+                               [
+                                       'hidebots' => 1,
+                                       'hideliu' => 1,
+                                       'action' => 'submit',
+                               ],
+                       ],
+               ];
+       }
 }
index 067d159..d711bac 100644 (file)
@@ -40,39 +40,39 @@ class NaiveImportTitleFactoryTest extends MediaWikiTestCase {
                return [
                        [
                                new ForeignTitle( 0, '', 'MainNamespaceArticle' ),
-                               Title::newFromText( 'MainNamespaceArticle' )
+                               'MainNamespaceArticle'
                        ],
                        [
                                new ForeignTitle( null, '', 'MainNamespaceArticle' ),
-                               Title::newFromText( 'MainNamespaceArticle' )
+                               'MainNamespaceArticle'
                        ],
                        [
                                new ForeignTitle( 1, 'Discussion', 'Nice_talk' ),
-                               Title::newFromText( 'Talk:Nice_talk' )
+                               'Talk:Nice_talk'
                        ],
                        [
                                new ForeignTitle( 0, '', 'Bogus:Nice_talk' ),
-                               Title::newFromText( 'Bogus:Nice_talk' )
+                               'Bogus:Nice_talk'
                        ],
                        [
                                new ForeignTitle( 100, 'Bogus', 'Nice_talk' ),
-                               Title::newFromText( 'Bogus:Nice_talk' ) // not Portal:Nice_talk
+                               'Bogus:Nice_talk' // not Portal:Nice_talk
                        ],
                        [
                                new ForeignTitle( 1, 'Bogus', 'Nice_talk' ),
-                               Title::newFromText( 'Talk:Nice_talk' ) // not Bogus:Nice_talk
+                               'Talk:Nice_talk' // not Bogus:Nice_talk
                        ],
                        [
                                new ForeignTitle( 100, 'Portal', 'Nice_talk' ),
-                               Title::newFromText( 'Portal:Nice_talk' )
+                               'Portal:Nice_talk'
                        ],
                        [
                                new ForeignTitle( 724, 'Portal', 'Nice_talk' ),
-                               Title::newFromText( 'Portal:Nice_talk' )
+                               'Portal:Nice_talk'
                        ],
                        [
                                new ForeignTitle( 2, 'Portal', 'Nice_talk' ),
-                               Title::newFromText( 'User:Nice_talk' )
+                               'User:Nice_talk'
                        ],
                ];
        }
@@ -80,9 +80,10 @@ class NaiveImportTitleFactoryTest extends MediaWikiTestCase {
        /**
         * @dataProvider basicProvider
         */
-       public function testBasic( ForeignTitle $foreignTitle, Title $title ) {
+       public function testBasic( ForeignTitle $foreignTitle, $titleText ) {
                $factory = new NaiveImportTitleFactory();
                $testTitle = $factory->createTitleFromForeignTitle( $foreignTitle );
+               $title = Title::newFromText( $titleText );
 
                $this->assertTrue( $title->equals( $testTitle ) );
        }
index 01c47fd..9b6ac93 100644 (file)
@@ -40,27 +40,27 @@ class NamespaceImportTitleFactoryTest extends MediaWikiTestCase {
                        [
                                new ForeignTitle( 0, '', 'MainNamespaceArticle' ),
                                0,
-                               Title::newFromText( 'MainNamespaceArticle' )
+                               'MainNamespaceArticle'
                        ],
                        [
                                new ForeignTitle( 0, '', 'MainNamespaceArticle' ),
                                2,
-                               Title::newFromText( 'User:MainNamespaceArticle' )
+                               'User:MainNamespaceArticle'
                        ],
                        [
                                new ForeignTitle( 1, 'Discussion', 'Nice_talk' ),
                                0,
-                               Title::newFromText( 'Nice_talk' )
+                               'Nice_talk'
                        ],
                        [
                                new ForeignTitle( 0, '', 'Bogus:Nice_talk' ),
                                0,
-                               Title::newFromText( 'Bogus:Nice_talk' )
+                               'Bogus:Nice_talk'
                        ],
                        [
                                new ForeignTitle( 0, '', 'Bogus:Nice_talk' ),
                                2,
-                               Title::newFromText( 'User:Bogus:Nice_talk' )
+                               'User:Bogus:Nice_talk'
                        ],
                ];
        }
@@ -68,9 +68,10 @@ class NamespaceImportTitleFactoryTest extends MediaWikiTestCase {
        /**
         * @dataProvider basicProvider
         */
-       public function testBasic( ForeignTitle $foreignTitle, $ns, Title $title ) {
+       public function testBasic( ForeignTitle $foreignTitle, $ns, $titleText ) {
                $factory = new NamespaceImportTitleFactory( $ns );
                $testTitle = $factory->createTitleFromForeignTitle( $foreignTitle );
+               $title = Title::newFromText( $titleText );
 
                $this->assertTrue( $title->equals( $testTitle ) );
        }
index a42c86c..dd68cdc 100644 (file)
@@ -130,8 +130,8 @@ class UploadBaseTest extends MediaWikiTestCase {
         */
        public function testCheckSvgScriptCallback( $svg, $wellFormed, $filterMatch, $message ) {
                list( $formed, $match ) = $this->upload->checkSvgString( $svg );
-               $this->assertSame( $wellFormed, $formed, $message );
-               $this->assertSame( $filterMatch, $match, $message );
+               $this->assertSame( $wellFormed, $formed, $message . " (well-formed)" );
+               $this->assertSame( $filterMatch, $match, $message . " (filter match)" );
        }
 
        public static function provideCheckSvgScriptCallback() {
@@ -254,10 +254,16 @@ class UploadBaseTest extends MediaWikiTestCase {
                        ],
                        [
                                '<?xml version="1.0"?> <?xml-stylesheet type="text/xml" href="#stylesheet"?> <!DOCTYPE doc [ <!ATTLIST xsl:stylesheet id ID #REQUIRED>]> <svg xmlns="http://www.w3.org/2000/svg"> <xsl:stylesheet id="stylesheet" version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <iframe xmlns="http://www.w3.org/1999/xhtml" src="javascript:alert(1)"></iframe> </xsl:template> </xsl:stylesheet> <circle fill="red" r="40"></circle> </svg>',
-                               true,
+                               false,
                                true,
                                'SVG with embedded stylesheet (http://html5sec.org/#125)'
                        ],
+                       [
+                               '<?xml version="1.0"?> <?xml-stylesheet type="text/xml" href="#stylesheet"?> <svg xmlns="http://www.w3.org/2000/svg"> <xsl:stylesheet id="stylesheet" version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <iframe xmlns="http://www.w3.org/1999/xhtml" src="javascript:alert(1)"></iframe> </xsl:template> </xsl:stylesheet> <circle fill="red" r="40"></circle> </svg>',
+                               true,
+                               true,
+                               'SVG with embedded stylesheet no doctype'
+                       ],
                        [
                                '<svg xmlns="http://www.w3.org/2000/svg" id="x"> <listener event="load" handler="#y" xmlns="http://www.w3.org/2001/xml-events" observer="x"/> <handler id="y">alert(1)</handler> </svg>',
                                true,
@@ -364,7 +370,7 @@ class UploadBaseTest extends MediaWikiTestCase {
                        ],
                        [
                                '<?xml version="1.0" encoding="UTF-8" standalone="no"?> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [ <!ENTITY lol "lol"> <!ENTITY lol2 "&#x3C;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3E;&#x61;&#x6C;&#x65;&#x72;&#x74;&#x28;&#x27;&#x58;&#x53;&#x53;&#x45;&#x44;&#x20;&#x3D;&#x3E;&#x20;&#x27;&#x2B;&#x64;&#x6F;&#x63;&#x75;&#x6D;&#x65;&#x6E;&#x74;&#x2E;&#x64;&#x6F;&#x6D;&#x61;&#x69;&#x6E;&#x29;&#x3B;&#x3C;&#x2F;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3E;"> ]> <svg xmlns="http://www.w3.org/2000/svg" width="68" height="68" viewBox="-34 -34 68 68" version="1.1"> <circle cx="0" cy="0" r="24" fill="#c8c8c8"/> <text x="0" y="0" fill="black">&lol2;</text> </svg>',
-                               true,
+                               false,
                                true,
                                'SVG with encoded script tag in internal entity (reported by Beyond Security)'
                        ],
@@ -374,6 +380,16 @@ class UploadBaseTest extends MediaWikiTestCase {
                                false,
                                'SVG with external entity'
                        ],
+                       [
+                               // The base64 = <script>alert(1)</script>. If for some reason
+                               // entities actually do get loaded, this should trigger
+                               // filterMatch to be true. So this test verifies that we
+                               // are not loading external entities.
+                               '<?xml version="1.0"?> <!DOCTYPE svg [ <!ENTITY foo SYSTEM "data:text/plain;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pgo="> ]> <svg xmlns="http://www.w3.org/2000/svg" version="1.1"> <desc>&foo;</desc> <rect width="300" height="100" style="fill:rgb(0,0,255);stroke-width:1;stroke:rgb(0,0,2)" /> </svg>',
+                               false,
+                               false, /* False verifies entities aren't getting loaded */
+                               'SVG with data: uri external entity'
+                       ],
                        [
                                "<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"> <g> <a xlink:href=\"javascript:alert('1&#10;https://google.com')\"> <rect width=\"300\" height=\"100\" style=\"fill:rgb(0,0,255);stroke-width:1;stroke:rgb(0,0,2)\" /> </a> </g> </svg>",
                                true,
@@ -393,6 +409,104 @@ class UploadBaseTest extends MediaWikiTestCase {
                                false,
                                'SVG with local urls, including filter: in style'
                        ],
+                       [
+                               '<?xml version="1.0" encoding="UTF-8" standalone="no"?><!DOCTYPE x [<!ATTLIST image x:href CDATA "data:image/png,foo" onerror CDATA "alert(\'XSSED = \'+document.domain)" onload CDATA "alert(\'XSSED = \'+document.domain)"> ]> <svg xmlns:h="http://www.w3.org/1999/xhtml" xmlns:x="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg"> <image /> </svg>',
+                               false,
+                               false,
+                               'SVG with evil default attribute values'
+                       ],
+                       [
+                               '<?xml version="1.0" encoding="UTF-8" standalone="no"?><!DOCTYPE svg SYSTEM "data:application/xml-dtd;base64,PCFET0NUWVBFIHN2ZyBbPCFBVFRMSVNUIGltYWdlIHg6aHJlZiBDREFUQSAiZGF0YTppbWFnZS9wbmcsZm9vIiBvbmVycm9yIENEQVRBICJhbGVydCgnWFNTRUQgPSAnK2RvY3VtZW50LmRvbWFpbikiIG9ubG9hZCBDREFUQSAiYWxlcnQoJ1hTU0VEID0gJytkb2N1bWVudC5kb21haW4pIj4gXT4K"><svg xmlns:x="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg"> <image /> </svg>',
+                               true,
+                               true,
+                               'SVG with an evil external dtd'
+                       ],
+                       [
+                               '<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//FOO/bar" "http://example.com"><svg></svg>',
+                               true,
+                               true,
+                               'SVG with random public doctype'
+                       ],
+                       [
+                               '<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg SYSTEM \'http://example.com/evil.dtd\' ><svg></svg>',
+                               true,
+                               true,
+                               'SVG with random SYSTEM doctype'
+                       ],
+                       [
+                               '<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg [<!ENTITY % foo "bar" >] ><svg></svg>',
+                               false,
+                               false,
+                               'SVG with parameter entity'
+                       ],
+                       [
+                               '<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg [<!ENTITY foo "bar%a;" ] ><svg></svg>',
+                               false,
+                               false,
+                               'SVG with entity referencing parameter entity'
+                       ],
+                       [
+                               '<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg [<!ENTITY foo "bar0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"> ] ><svg></svg>',
+                               false,
+                               false,
+                               'SVG with long entity'
+                       ],
+                       [
+                               '<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg [<!ENTITY  foo \'"Hi", said bob\'> ] ><svg><g>&foo;</g></svg>',
+                               true,
+                               false,
+                               'SVG with apostrophe quote entity'
+                       ],
+                       [
+                               '<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg [<!ENTITY name "Bob"><!ENTITY  foo \'"Hi", said &name;.\'> ] ><svg><g>&foo;</g></svg>',
+                               false,
+                               false,
+                               'SVG with recursive entity',
+                       ],
+                       [
+                               '<?xml version="1.0" encoding="UTF-8" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd" [ <!ATTLIST svg xmlns:xlink CDATA #FIXED "http://www.w3.org/1999/xlink"> ]> <svg width="417pt" height="366pt"
+ viewBox="0.00 0.00 417.00 366.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"></svg>',
+                               true, /* well-formed */
+                               false, /* filter-hit */
+                               'GraphViz-esque svg with #FIXED xlink ns (Should be allowed)'
+                       ],
+                       [
+                               '<?xml version="1.0" encoding="UTF-8" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd" [ <!ATTLIST svg xmlns:xlink CDATA #FIXED "http://www.w3.org/1999/xlink2"> ]> <svg width="417pt" height="366pt"
+ viewBox="0.00 0.00 417.00 366.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"></svg>',
+                               false,
+                               false,
+                               'GraphViz ATLIST exception should match exactly'
+                       ],
+                       [
+                               '<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [ <!-- Comment-here --> <!ENTITY foo "#ff6666">]><svg xmlns="http://www.w3.org/2000/svg"></svg>',
+                               true,
+                               false,
+                               'DTD with comments (Should be allowed)'
+                       ],
+                       [
+                               '<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [ <!-- invalid--comment  --> <!ENTITY foo "#ff6666">]><svg xmlns="http://www.w3.org/2000/svg"></svg>',
+                               false,
+                               false,
+                               'DTD with invalid comment'
+                       ],
+                       [
+                               '<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [ <!-- invalid ---> <!ENTITY foo "#ff6666">]><svg xmlns="http://www.w3.org/2000/svg"></svg>',
+                               false,
+                               false,
+                               'DTD with invalid comment 2'
+                       ],
+                       [
+                               '<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [ <!ENTITY bar "&foo;"> <!ENTITY foo "#ff6666">]><svg xmlns="http://www.w3.org/2000/svg"></svg>',
+                               true,
+                               false,
+                               'DTD with aliased entities (Should be allowed)'
+                       ],
+                       [
+                               '<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [ <!ENTITY bar \'&foo;\'> <!ENTITY foo \'#ff6666\'>]><svg xmlns="http://www.w3.org/2000/svg"></svg>',
+                               true,
+                               false,
+                               'DTD with aliased entities apos (Should be allowed)'
+                       ]
                ];
                // @codingStandardsIgnoreEnd
        }
@@ -478,7 +592,10 @@ class UploadTestHandler extends UploadBase {
                        $svg,
                        [ $this, 'checkSvgScriptCallback' ],
                        false,
-                       [ 'processing_instruction_handler' => 'UploadBase::checkSvgPICallback' ]
+                       [
+                               'processing_instruction_handler' => 'UploadBase::checkSvgPICallback',
+                               'external_dtd_handler' => 'UploadBase::checkSvgExternalDTD'
+                       ]
                );
                return [ $check->wellFormed, $check->filterMatch ];
        }
index 81c84e8..594540f 100644 (file)
@@ -311,7 +311,9 @@ class BotPasswordTest extends MediaWikiTestCase {
                );
 
                // Failed restriction
-               $request = $this->getMock( 'FauxRequest', [ 'getIP' ] );
+               $request = $this->getMockBuilder( 'FauxRequest' )
+                       ->setMethods( [ 'getIP' ] )
+                       ->getMock();
                $request->expects( $this->any() )->method( 'getIP' )
                        ->will( $this->returnValue( '10.0.0.1' ) );
                $status = BotPassword::login( "{$this->testUserName}@BotPassword", 'foobaz', $request );
index 7ff882a..3363bca 100644 (file)
@@ -23,7 +23,7 @@ class PasswordResetTest extends PHPUnit_Framework_TestCase {
                $authManager->expects( $this->any() )->method( 'allowsAuthenticationDataChange' )
                        ->willReturn( $allowsAuthenticationDataChange ? Status::newGood() : Status::newFatal( 'foo' ) );
 
-               $user = $this->getMock( User::class );
+               $user = $this->getMockBuilder( User::class )->getMock();
                $user->expects( $this->any() )->method( 'getName' )->willReturn( 'Foo' );
                $user->expects( $this->any() )->method( 'isBlocked' )->willReturn( $userIsBlocked );
                $user->expects( $this->any() )->method( 'isAllowed' )
@@ -124,12 +124,12 @@ class PasswordResetTest extends PHPUnit_Framework_TestCase {
 
                $request = new FauxRequest();
                $request->setIP( '1.2.3.4' );
-               $performingUser = $this->getMock( User::class );
+               $performingUser = $this->getMockBuilder( User::class )->getMock();
                $performingUser->expects( $this->any() )->method( 'getRequest' )->willReturn( $request );
                $performingUser->expects( $this->any() )->method( 'isAllowed' )->willReturn( true );
 
-               $targetUser1 = $this->getMock( User::class );
-               $targetUser2 = $this->getMock( User::class );
+               $targetUser1 = $this->getMockBuilder( User::class )->getMock();
+               $targetUser2 = $this->getMockBuilder( User::class )->getMock();
                $targetUser1->expects( $this->any() )->method( 'getName' )->willReturn( 'User1' );
                $targetUser2->expects( $this->any() )->method( 'getName' )->willReturn( 'User2' );
                $targetUser1->expects( $this->any() )->method( 'getId' )->willReturn( 1 );
index cb3d227..6b0e344 100644 (file)
@@ -835,7 +835,7 @@ class MaintenanceTest extends MediaWikiTestCase {
         * @covers Maintenance::setConfig
         */
        public function testSetConfig() {
-               $conf = $this->getMock( 'Config' );
+               $conf = $this->createMock( 'Config' );
                $this->m->setConfig( $conf );
                $this->assertSame( $conf, $this->m->getConfig() );
        }
index d7e72bb..d460401 100644 (file)
@@ -169,7 +169,10 @@ class TextPassDumperDatabaseTest extends DumpTestCase {
                ];
 
                // The mock itself
-               $prefetchMock = $this->getMock( 'BaseDump', [ 'prefetch' ], [], '', false );
+               $prefetchMock = $this->getMockBuilder( 'BaseDump' )
+                       ->setMethods( [ 'prefetch' ] )
+                       ->disableOriginalConstructor()
+                       ->getMock();
                $prefetchMock->expects( $this->exactly( 6 ) )
                        ->method( 'prefetch' )
                        ->will( $this->returnValueMap( $prefetchMap ) );
index cbf306e..aeb9f0f 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 
 class MockChangesListFilter extends ChangesListFilter {
-       public function displaysOnUnstructuredUi( ChangesListSpecialPage $specialPage ) {
+       public function displaysOnUnstructuredUi() {
                throw new MWException(
                        'Not implemented: If the test relies on this, put it one of the ' .
                        'subclasses\' tests (e.g. ChangesListBooleanFilterTest) ' .
index edc81ff..7d75ffe 100644 (file)
@@ -142,7 +142,7 @@ class MediaWikiTestCaseTest extends MediaWikiTestCase {
         */
        public function testLoggersAreRestoredOnTearDown_replacingExistingLogger() {
                $logger1 = LoggerFactory::getInstance( 'foo' );
-               $this->setLogger( 'foo', $this->getMock( LoggerInterface::class ) );
+               $this->setLogger( 'foo', $this->createMock( LoggerInterface::class ) );
                $logger2 = LoggerFactory::getInstance( 'foo' );
                $this->tearDown();
                $logger3 = LoggerFactory::getInstance( 'foo' );
@@ -156,7 +156,7 @@ class MediaWikiTestCaseTest extends MediaWikiTestCase {
         * @covers MediaWikiTestCase::restoreLoggers
         */
        public function testLoggersAreRestoredOnTearDown_replacingNonExistingLogger() {
-               $this->setLogger( 'foo', $this->getMock( LoggerInterface::class ) );
+               $this->setLogger( 'foo', $this->createMock( LoggerInterface::class ) );
                $logger1 = LoggerFactory::getInstance( 'foo' );
                $this->tearDown();
                $logger2 = LoggerFactory::getInstance( 'foo' );
@@ -171,8 +171,8 @@ class MediaWikiTestCaseTest extends MediaWikiTestCase {
         */
        public function testLoggersAreRestoredOnTearDown_replacingSameLoggerTwice() {
                $logger1 = LoggerFactory::getInstance( 'baz' );
-               $this->setLogger( 'foo', $this->getMock( LoggerInterface::class ) );
-               $this->setLogger( 'foo', $this->getMock( LoggerInterface::class ) );
+               $this->setLogger( 'foo', $this->createMock( LoggerInterface::class ) );
+               $this->setLogger( 'foo', $this->createMock( LoggerInterface::class ) );
                $this->tearDown();
                $logger2 = LoggerFactory::getInstance( 'baz' );
 
index cef5c15..b0118af 100644 (file)
@@ -1,8 +1,8 @@
-/* global CompletenessTest, sinon */
+/* global sinon */
 ( function ( $, mw, QUnit ) {
        'use strict';
 
-       var mwTestIgnore, addons;
+       var addons;
 
        /**
         * Add bogus to url to prevent IE crazy caching
                value: 'true'
        } );
 
-       /**
-        * CompletenessTest
-        *
-        * Adds toggle checkbox to header
-        */
-       QUnit.config.urlConfig.push( {
-               id: 'completenesstest',
-               label: 'Run CompletenessTest',
-               tooltip: 'Run the completeness test'
-       } );
-
        /**
         * SinonJS
         *
                };
        }() );
 
-       // Initiate when enabled
-       if ( QUnit.urlParams.completenesstest ) {
-
-               // Return true to ignore
-               mwTestIgnore = function ( val, tester ) {
-
-                       // Don't record methods of the properties of constructors,
-                       // to avoid getting into a loop (prototype.constructor.prototype..).
-                       // Since we're therefor skipping any injection for
-                       // "new mw.Foo()", manually set it to true here.
-                       if ( val instanceof mw.Map ) {
-                               tester.methodCallTracker.Map = true;
-                               return true;
-                       }
-                       if ( val instanceof mw.Title ) {
-                               tester.methodCallTracker.Title = true;
-                               return true;
-                       }
-
-                       // Don't record methods of the properties of a jQuery object
-                       if ( val instanceof $ ) {
-                               return true;
-                       }
-
-                       // Don't iterate over the module registry (the 'script' references would
-                       // be listed as untested methods otherwise)
-                       if ( val === mw.loader.moduleRegistry ) {
-                               return true;
-                       }
-
-                       return false;
-               };
-
-               // eslint-disable-next-line no-new
-               new CompletenessTest( mw, mwTestIgnore );
-       }
-
        /**
         * Reset mw.config and others to a fresh copy of the live config for each test(),
         * and restore it back to the live one afterwards.
index dd7666b..ed2fbe6 100644 (file)
@@ -1,146 +1,8 @@
 ( function ( $ ) {
-       var html, testElement;
-
        QUnit.module( 'jquery.placeholder', QUnit.newMwEnvironment() );
 
        QUnit.test( 'caches results of feature tests', function ( assert ) {
                assert.strictEqual( typeof $.fn.placeholder.input, 'boolean', '$.fn.placeholder.input' );
                assert.strictEqual( typeof $.fn.placeholder.textarea, 'boolean', '$.fn.placeholder.textarea' );
        } );
-
-       if ( $.fn.placeholder.input && $.fn.placeholder.textarea ) {
-               return;
-       }
-
-       html = '<form>' +
-               '<input id="input-type-search" type="search" placeholder="Search this site...">' +
-               '<input id="input-type-text" type="text" placeholder="e.g. John Doe">' +
-               '<input id="input-type-email" type="email" placeholder="e.g. address@example.ext">' +
-               '<input id="input-type-url" type="url" placeholder="e.g. http://mathiasbynens.be/">' +
-               '<input id="input-type-tel" type="tel" placeholder="e.g. +32 472 77 69 88">' +
-               '<input id="input-type-password" type="password" placeholder="e.g. hunter2">' +
-               '<textarea id="textarea" name="message" placeholder="Your message goes here"></textarea>' +
-       '</form>';
-       testElement = function ( $el, assert ) {
-               var el = $el[ 0 ],
-                       placeholder = el.getAttribute( 'placeholder' );
-
-               assert.strictEqual( $el.placeholder(), $el, 'should be chainable' );
-
-               assert.strictEqual( el.value, placeholder, 'should set `placeholder` text as `value`' );
-               assert.strictEqual( $el.prop( 'value' ), '', 'propHooks works properly' );
-               assert.strictEqual( $el.val(), '', 'valHooks works properly' );
-               assert.ok( $el.hasClass( 'placeholder' ), 'should have `placeholder` class' );
-
-               // test on focus
-               $el.focus();
-               assert.strictEqual( el.value, '', '`value` should be the empty string on focus' );
-               assert.strictEqual( $el.prop( 'value' ), '', 'propHooks works properly' );
-               assert.strictEqual( $el.val(), '', 'valHooks works properly' );
-               assert.ok( !$el.hasClass( 'placeholder' ), 'should not have `placeholder` class on focus' );
-
-               // and unfocus (blur) again
-               $el.blur();
-
-               assert.strictEqual( el.value, placeholder, 'should set `placeholder` text as `value`' );
-               assert.strictEqual( $el.prop( 'value' ), '', 'propHooks works properly' );
-               assert.strictEqual( $el.val(), '', 'valHooks works properly' );
-               assert.ok( $el.hasClass( 'placeholder' ), 'should have `placeholder` class' );
-
-               // change the value
-               $el.val( 'lorem ipsum' );
-               assert.strictEqual( $el.prop( 'value' ), 'lorem ipsum', '`$el.val(string)` should change the `value` property' );
-               assert.strictEqual( el.value, 'lorem ipsum', '`$el.val(string)` should change the `value` attribute' );
-               assert.ok( !$el.hasClass( 'placeholder' ), '`$el.val(string)` should remove `placeholder` class' );
-
-               // and clear it again
-               $el.val( '' );
-               assert.strictEqual( $el.prop( 'value' ), '', '`$el.val("")` should change the `value` property' );
-               assert.strictEqual( el.value, placeholder, '`$el.val("")` should change the `value` attribute' );
-               assert.ok( $el.hasClass( 'placeholder' ), '`$el.val("")` should re-enable `placeholder` class' );
-
-               // make sure the placeholder property works as expected.
-               assert.strictEqual( $el.prop( 'placeholder' ), placeholder, '$el.prop(`placeholder`) should return the placeholder value' );
-               $el.placeholder( 'new placeholder' );
-               assert.strictEqual( el.getAttribute( 'placeholder' ), 'new placeholder', '$el.placeholder(<string>) should set the placeholder value' );
-               assert.strictEqual( el.value, 'new placeholder', '$el.placeholder(<string>) should update the displayed placeholder value' );
-               $el.placeholder( placeholder );
-       };
-
-       QUnit.test( 'emulates placeholder for <input type=text>', function ( assert ) {
-               $( '<div>' ).html( html ).appendTo( $( '#qunit-fixture' ) );
-               testElement( $( '#input-type-text' ), assert );
-       } );
-
-       QUnit.test( 'emulates placeholder for <input type=search>', function ( assert ) {
-               $( '<div>' ).html( html ).appendTo( $( '#qunit-fixture' ) );
-               testElement( $( '#input-type-search' ), assert );
-       } );
-
-       QUnit.test( 'emulates placeholder for <input type=email>', function ( assert ) {
-               $( '<div>' ).html( html ).appendTo( $( '#qunit-fixture' ) );
-               testElement( $( '#input-type-email' ), assert );
-       } );
-
-       QUnit.test( 'emulates placeholder for <input type=url>', function ( assert ) {
-               $( '<div>' ).html( html ).appendTo( $( '#qunit-fixture' ) );
-               testElement( $( '#input-type-url' ), assert );
-       } );
-
-       QUnit.test( 'emulates placeholder for <input type=tel>', function ( assert ) {
-               $( '<div>' ).html( html ).appendTo( $( '#qunit-fixture' ) );
-               testElement( $( '#input-type-tel' ), assert );
-       } );
-
-       QUnit.test( 'emulates placeholder for <input type=password>', function ( assert ) {
-               var $el, el, placeholder, selector = '#input-type-password';
-
-               $( '<div>' ).html( html ).appendTo( $( '#qunit-fixture' ) );
-
-               $el = $( selector );
-               el = $el[ 0 ];
-               placeholder = el.getAttribute( 'placeholder' );
-
-               assert.strictEqual( $el.placeholder(), $el, 'should be chainable' );
-
-               // Re-select the element, as it gets replaced by another one in some browsers
-               $el = $( selector );
-               el = $el[ 0 ];
-
-               assert.strictEqual( el.value, placeholder, 'should set `placeholder` text as `value`' );
-               assert.strictEqual( $el.prop( 'value' ), '', 'propHooks works properly' );
-               assert.strictEqual( $el.val(), '', 'valHooks works properly' );
-               assert.ok( $el.hasClass( 'placeholder' ), 'should have `placeholder` class' );
-
-               // test on focus
-               $el.focus();
-
-               // Re-select the element, as it gets replaced by another one in some browsers
-               $el = $( selector );
-               el = $el[ 0 ];
-
-               assert.strictEqual( el.value, '', '`value` should be the empty string on focus' );
-               assert.strictEqual( $el.prop( 'value' ), '', 'propHooks works properly' );
-               assert.strictEqual( $el.val(), '', 'valHooks works properly' );
-               assert.ok( !$el.hasClass( 'placeholder' ), 'should not have `placeholder` class on focus' );
-
-               // and unfocus (blur) again
-               $el.blur();
-
-               // Re-select the element, as it gets replaced by another one in some browsers
-               $el = $( selector );
-               el = $el[ 0 ];
-
-               assert.strictEqual( el.value, placeholder, 'should set `placeholder` text as `value`' );
-               assert.strictEqual( $el.prop( 'value' ), '', 'propHooks works properly' );
-               assert.strictEqual( $el.val(), '', 'valHooks works properly' );
-               assert.ok( $el.hasClass( 'placeholder' ), 'should have `placeholder` class' );
-
-       } );
-
-       QUnit.test( 'emulates placeholder for <textarea>', function ( assert ) {
-               $( '<div>' ).html( html ).appendTo( $( '#qunit-fixture' ) );
-               testElement( $( '#textarea' ), assert );
-       } );
-
 }( jQuery ) );
index f958e09..5b3c2ed 100644 (file)
                        }
 
                        function among( actual, expected, message ) {
-                               if ( $.isArray( expected ) ) {
+                               if ( Array.isArray( expected ) ) {
                                        assert.ok( $.inArray( actual, expected ) !== -1, message + ' (got ' + actual + '; expected one of ' + expected.join( ', ' ) + ')' );
                                } else {
                                        assert.equal( actual, expected, message );
index 3232d08..271648f 100644 (file)
@@ -1,3 +1,4 @@
+/* eslint-disable camelcase */
 ( function ( mw ) {
        QUnit.module( 'mediawiki.rcfilters - FilterItem' );
 
@@ -9,7 +10,7 @@
                item = new mw.rcfilters.dm.FilterItem( 'filter1', group1 );
                assert.equal(
                        item.getName(),
-                       'filter1',
+                       'group1__filter1',
                        'Filter name is retained.'
                );
                assert.equal(
                        group1,
                        {
                                conflicts: {
-                                       conflict1: { group: 'group2', filter: 'conflict1' },
-                                       conflict2: { group: 'group2', filter: 'conflict2' },
-                                       conflict3: { group: 'group2', filter: 'conflict3' }
+                                       group2__conflict1: { group: 'group2', filter: 'group2__conflict1' },
+                                       group2__conflict2: { group: 'group2', filter: 'group2__conflict2' },
+                                       group2__conflict3: { group: 'group2', filter: 'group2__conflict3' }
                                }
                        }
                );
                assert.deepEqual(
                        item.getConflicts(),
                        {
-                               conflict1: { group: 'group2', filter: 'conflict1' },
-                               conflict2: { group: 'group2', filter: 'conflict2' },
-                               conflict3: { group: 'group2', filter: 'conflict3' }
+                               group2__conflict1: { group: 'group2', filter: 'group2__conflict1' },
+                               group2__conflict2: { group: 'group2', filter: 'group2__conflict2' },
+                               group2__conflict3: { group: 'group2', filter: 'group2__conflict3' }
                        },
                        'Conflict information is retained.'
                );
                assert.equal(
-                       // TODO: Consider allowing for either a FilterItem or a filter name
-                       // in this method, so it is consistent with the subset one
                        item.existsInConflicts( new mw.rcfilters.dm.FilterItem( 'conflict1', group2 ) ),
                        true,
                        'Specific item exists in conflicts.'
index 60a32c3..27d3825 100644 (file)
@@ -1,3 +1,4 @@
+/* eslint-disable camelcase */
 ( function ( mw, $ ) {
        QUnit.module( 'mediawiki.rcfilters - FiltersViewModel', QUnit.newMwEnvironment( {
                messages: {
                                type: 'send_unselected_if_any',
                                filters: [
                                        {
-                                               name: 'group1filter1',
+                                               name: 'filter1',
                                                label: 'Group 1: Filter 1',
                                                description: 'Description of Filter 1 in Group 1'
                                        },
                                        {
-                                               name: 'group1filter2',
+                                               name: 'filter2',
                                                label: 'Group 1: Filter 2',
                                                description: 'Description of Filter 2 in Group 1'
                                        }
                                type: 'send_unselected_if_any',
                                filters: [
                                        {
-                                               name: 'group2filter1',
+                                               name: 'filter1',
                                                label: 'Group 2: Filter 1',
                                                description: 'Description of Filter 1 in Group 2'
                                        },
                                        {
-                                               name: 'group2filter2',
+                                               name: 'filter2',
                                                label: 'Group 2: Filter 2',
                                                description: 'Description of Filter 2 in Group 2'
                                        }
                                type: 'string_options',
                                filters: [
                                        {
-                                               name: 'group3filter1',
+                                               name: 'filter1',
                                                label: 'Group 3: Filter 1',
                                                description: 'Description of Filter 1 in Group 3'
                                        },
                                        {
-                                               name: 'group3filter2',
+                                               name: 'filter2',
                                                label: 'Group 3: Filter 2',
                                                description: 'Description of Filter 2 in Group 3'
                                        }
                model.initializeFilters( definition );
 
                assert.ok(
-                       model.getItemByName( 'group1filter1' ) instanceof mw.rcfilters.dm.FilterItem &&
-                       model.getItemByName( 'group1filter2' ) instanceof mw.rcfilters.dm.FilterItem &&
-                       model.getItemByName( 'group2filter1' ) instanceof mw.rcfilters.dm.FilterItem &&
-                       model.getItemByName( 'group2filter2' ) instanceof mw.rcfilters.dm.FilterItem &&
-                       model.getItemByName( 'group3filter1' ) instanceof mw.rcfilters.dm.FilterItem &&
-                       model.getItemByName( 'group3filter2' ) instanceof mw.rcfilters.dm.FilterItem,
+                       model.getItemByName( 'group1__filter1' ) instanceof mw.rcfilters.dm.FilterItem &&
+                       model.getItemByName( 'group1__filter2' ) instanceof mw.rcfilters.dm.FilterItem &&
+                       model.getItemByName( 'group2__filter1' ) instanceof mw.rcfilters.dm.FilterItem &&
+                       model.getItemByName( 'group2__filter2' ) instanceof mw.rcfilters.dm.FilterItem &&
+                       model.getItemByName( 'group3__filter1' ) instanceof mw.rcfilters.dm.FilterItem &&
+                       model.getItemByName( 'group3__filter2' ) instanceof mw.rcfilters.dm.FilterItem,
                        'Filters instantiated and stored correctly'
                );
 
                assert.deepEqual(
                        model.getSelectedState(),
                        {
-                               group1filter1: false,
-                               group1filter2: false,
-                               group2filter1: false,
-                               group2filter2: false,
-                               group3filter1: false,
-                               group3filter2: false
+                               group1__filter1: false,
+                               group1__filter2: false,
+                               group2__filter1: false,
+                               group2__filter2: false,
+                               group3__filter1: false,
+                               group3__filter2: false
                        },
                        'Initial state of filters'
                );
 
                model.toggleFiltersSelected( {
-                       group1filter1: true,
-                       group2filter2: true,
-                       group3filter1: true
+                       group1__filter1: true,
+                       group2__filter2: true,
+                       group3__filter1: true
                } );
                assert.deepEqual(
                        model.getSelectedState(),
                        {
-                               group1filter1: true,
-                               group1filter2: false,
-                               group2filter1: false,
-                               group2filter2: true,
-                               group3filter1: true,
-                               group3filter2: false
+                               group1__filter1: true,
+                               group1__filter2: false,
+                               group2__filter1: false,
+                               group2__filter2: true,
+                               group3__filter1: true,
+                               group3__filter2: false
                        },
                        'Updating filter states correctly'
                );
                                type: 'send_unselected_if_any',
                                filters: [
                                        {
-                                               name: 'group1filter1',
+                                               name: 'filter1',
                                                label: 'group1filter1-label',
                                                description: 'group1filter1-desc'
                                        },
                                        {
-                                               name: 'group1filter2',
+                                               name: 'filter2',
                                                label: 'group1filter2-label',
                                                description: 'group1filter2-desc'
                                        }
                                type: 'send_unselected_if_any',
                                filters: [
                                        {
-                                               name: 'group2filter1',
+                                               name: 'filter1',
                                                label: 'group2filter1-label',
                                                description: 'group2filter1-desc'
                                        },
                                        {
-                                               name: 'group2filter2',
+                                               name: 'filter2',
                                                label: 'group2filter2-label',
                                                description: 'group2filter2-desc'
                                        }
                                {
                                        query: 'group',
                                        expectedMatches: {
-                                               group1: [ 'group1filter1', 'group1filter2' ],
-                                               group2: [ 'group2filter1' ]
+                                               group1: [ 'group1__filter1', 'group1__filter2' ],
+                                               group2: [ 'group2__filter1' ]
                                        },
                                        reason: 'Finds filters starting with the query string'
                                },
                                {
                                        query: 'filter 2 in group',
                                        expectedMatches: {
-                                               group1: [ 'group1filter2' ],
-                                               group2: [ 'group2filter2' ]
+                                               group1: [ 'group1__filter2' ],
+                                               group2: [ 'group2__filter2' ]
                                        },
                                        reason: 'Finds filters containing the query string in their description'
                                },
                                {
                                        query: 'title',
                                        expectedMatches: {
-                                               group1: [ 'group1filter1', 'group1filter2' ],
-                                               group2: [ 'group2filter1', 'group2filter2' ]
+                                               group1: [ 'group1__filter1', 'group1__filter2' ],
+                                               group2: [ 'group2__filter1', 'group2__filter2' ]
                                        },
                                        reason: 'Finds filters containing the query string in their group title'
                                }
 
                // Select 1 filter
                model.toggleFiltersSelected( {
-                       hidefilter1: true,
-                       hidefilter2: false,
-                       hidefilter3: false,
-                       hidefilter4: false,
-                       hidefilter5: false,
-                       hidefilter6: false
+                       group1__hidefilter1: true,
+                       group1__hidefilter2: false,
+                       group1__hidefilter3: false,
+                       group2__hidefilter4: false,
+                       group2__hidefilter5: false,
+                       group2__hidefilter6: false
                } );
                // Only one filter in one group
                assert.deepEqual(
 
                // Select 2 filters
                model.toggleFiltersSelected( {
-                       hidefilter1: true,
-                       hidefilter2: true,
-                       hidefilter3: false,
-                       hidefilter4: false,
-                       hidefilter5: false,
-                       hidefilter6: false
+                       group1__hidefilter1: true,
+                       group1__hidefilter2: true,
+                       group1__hidefilter3: false,
+                       group2__hidefilter4: false,
+                       group2__hidefilter5: false,
+                       group2__hidefilter6: false
                } );
                // Two selected filters in one group
                assert.deepEqual(
 
                // Select 3 filters
                model.toggleFiltersSelected( {
-                       hidefilter1: true,
-                       hidefilter2: true,
-                       hidefilter3: true,
-                       hidefilter4: false,
-                       hidefilter5: false,
-                       hidefilter6: false
+                       group1__hidefilter1: true,
+                       group1__hidefilter2: true,
+                       group1__hidefilter3: true,
+                       group2__hidefilter4: false,
+                       group2__hidefilter5: false,
+                       group2__hidefilter6: false
                } );
                // All filters of the group are selected == this is the same as not selecting any
                assert.deepEqual(
 
                // Select 1 filter from string_options
                model.toggleFiltersSelected( {
-                       filter7: true,
-                       filter8: false,
-                       filter9: false
+                       group3__filter7: true,
+                       group3__filter8: false,
+                       group3__filter9: false
                } );
                // All filters of the group are selected == this is the same as not selecting any
                assert.deepEqual(
 
                // Select 2 filters from string_options
                model.toggleFiltersSelected( {
-                       filter7: true,
-                       filter8: true,
-                       filter9: false
+                       group3__filter7: true,
+                       group3__filter8: true,
+                       group3__filter9: false
                } );
                // All filters of the group are selected == this is the same as not selecting any
                assert.deepEqual(
 
                // Select 3 filters from string_options
                model.toggleFiltersSelected( {
-                       filter7: true,
-                       filter8: true,
-                       filter9: true
+                       group3__filter7: true,
+                       group3__filter8: true,
+                       group3__filter9: true
                } );
                // All filters of the group are selected == this is the same as not selecting any
                assert.deepEqual(
                                title: 'Group 3',
                                type: 'string_options',
                                separator: ',',
+                               default: 'filter8',
                                filters: [
                                        {
                                                name: 'filter7',
                                        {
                                                name: 'filter8',
                                                label: 'Group 3: Filter 2',
-                                               description: 'Description of Filter 2 in Group 3',
-                                               default: true
+                                               description: 'Description of Filter 2 in Group 3'
                                        },
                                        {
                                                name: 'filter9',
                        } ],
                        defaultFilterRepresentation = {
                                // Group 1 and 2, "send_unselected_if_any", the values of the filters are "flipped" from the values of the parameters
-                               hidefilter1: false,
-                               hidefilter2: true,
-                               hidefilter3: false,
-                               hidefilter4: true,
-                               hidefilter5: false,
-                               hidefilter6: true,
+                               group1__hidefilter1: false,
+                               group1__hidefilter2: true,
+                               group1__hidefilter3: false,
+                               group2__hidefilter4: true,
+                               group2__hidefilter5: false,
+                               group2__hidefilter6: true,
                                // Group 3, "string_options", default values correspond to parameters and filters
-                               filter7: false,
-                               filter8: true,
-                               filter9: false
+                               group3__filter7: false,
+                               group3__filter8: true,
+                               group3__filter9: false
                        },
                        model = new mw.rcfilters.dm.FiltersViewModel();
 
                                hidefilter2: '1'
                        } ),
                        $.extend( {}, defaultFilterRepresentation, {
-                               hidefilter1: false, // The text is "show filter 1"
-                               hidefilter2: false, // The text is "show filter 2"
-                               hidefilter3: false // The text is "show filter 3"
+                               group1__hidefilter1: false, // The text is "show filter 1"
+                               group1__hidefilter2: false, // The text is "show filter 2"
+                               group1__hidefilter3: false // The text is "show filter 3"
                        } ),
                        'One truthy parameter in a group whose other parameters are true by default makes the rest of the filters in the group false (unchecked)'
                );
                                hidefilter3: '1'
                        } ),
                        $.extend( {}, defaultFilterRepresentation, {
-                               hidefilter1: false, // The text is "show filter 1"
-                               hidefilter2: false, // The text is "show filter 2"
-                               hidefilter3: false // The text is "show filter 3"
+                               group1__hidefilter1: false, // The text is "show filter 1"
+                               group1__hidefilter2: false, // The text is "show filter 2"
+                               group1__hidefilter3: false // The text is "show filter 3"
                        } ),
                        'All paremeters in the same \'send_unselected_if_any\' group false is equivalent to none are truthy (checked) in the interface'
                );
                assert.deepEqual(
                        model.getSelectedState(),
                        $.extend( {}, defaultFilterRepresentation, {
-                               hidefilter5: false,
-                               hidefilter6: false
+                               group2__hidefilter5: false,
+                               group2__hidefilter6: false
                        } ),
                        'getFiltersFromParameters does not care about previous or existing state.'
                );
                assert.deepEqual(
                        model.getSelectedState(),
                        $.extend( {}, defaultFilterRepresentation, {
-                               filter7: true,
-                               filter8: false,
-                               filter9: false
+                               group3__filter7: true,
+                               group3__filter8: false,
+                               group3__filter9: false
                        } ),
                        'A \'string_options\' parameter containing 1 value, results in the corresponding filter as checked'
                );
                assert.deepEqual(
                        model.getSelectedState(),
                        $.extend( {}, defaultFilterRepresentation, {
-                               filter7: true,
-                               filter8: true,
-                               filter9: false
+                               group3__filter7: true,
+                               group3__filter8: true,
+                               group3__filter9: false
                        } ),
                        'A \'string_options\' parameter containing 2 values, results in both corresponding filters as checked'
                );
                assert.deepEqual(
                        model.getSelectedState(),
                        $.extend( {}, defaultFilterRepresentation, {
-                               filter7: false,
-                               filter8: false,
-                               filter9: false
+                               group3__filter7: true,
+                               group3__filter8: true,
+                               group3__filter9: true
                        } ),
-                       'A \'string_options\' parameter containing all values, results in all filters of the group as unchecked.'
+                       'A \'string_options\' parameter containing all values, results in all filters of the group as checked.'
                );
 
                model.toggleFiltersSelected(
                assert.deepEqual(
                        model.getSelectedState(),
                        $.extend( {}, defaultFilterRepresentation, {
-                               filter7: false,
-                               filter8: false,
-                               filter9: false
+                               group3__filter7: true,
+                               group3__filter8: true,
+                               group3__filter9: true
                        } ),
-                       'A \'string_options\' parameter containing the value \'all\', results in all filters of the group as unchecked.'
+                       'A \'string_options\' parameter containing the value \'all\', results in all filters of the group as checked.'
                );
 
                model.toggleFiltersSelected(
                assert.deepEqual(
                        model.getSelectedState(),
                        $.extend( {}, defaultFilterRepresentation, {
-                               filter7: true,
-                               filter8: false,
-                               filter9: true
+                               group3__filter7: true,
+                               group3__filter8: false,
+                               group3__filter9: true
                        } ),
                        'A \'string_options\' parameter containing an invalid value, results in the invalid value ignored and the valid corresponding filters checked.'
                );
                        } ],
                        defaultFilterRepresentation = {
                                // Group 1 and 2, "send_unselected_if_any", the values of the filters are "flipped" from the values of the parameters
-                               hidefilter1: false,
-                               hidefilter2: true,
-                               hidefilter3: false,
-                               hidefilter4: true,
-                               hidefilter5: false,
-                               hidefilter6: true
+                               group1__hidefilter1: false,
+                               group1__hidefilter2: true,
+                               group1__hidefilter3: false,
+                               group2__hidefilter4: true,
+                               group2__hidefilter5: false,
+                               group2__hidefilter6: true
                        },
                        model = new mw.rcfilters.dm.FiltersViewModel();
 
                assert.deepEqual(
                        model.getSelectedState(),
                        {
-                               hidefilter1: false,
-                               hidefilter2: false,
-                               hidefilter3: false,
-                               hidefilter4: false,
-                               hidefilter5: false,
-                               hidefilter6: false
+                               group1__hidefilter1: false,
+                               group1__hidefilter2: false,
+                               group1__hidefilter3: false,
+                               group2__hidefilter4: false,
+                               group2__hidefilter5: false,
+                               group2__hidefilter6: false
                        },
                        'Initial state: default filters are not selected (controller selects defaults explicitly).'
                );
 
                model.toggleFiltersSelected( {
-                       hidefilter1: false,
-                       hidefilter3: false
+                       group1__hidefilter1: false,
+                       group1__hidefilter3: false
                } );
 
                model.setFiltersToDefaults();
                                ]
                        } ],
                        baseFullState = {
-                               filter1: { selected: false, conflicted: false, included: false },
-                               filter2: { selected: false, conflicted: false, included: false },
-                               filter3: { selected: false, conflicted: false, included: false }
+                               group1__filter1: { selected: false, conflicted: false, included: false },
+                               group1__filter2: { selected: false, conflicted: false, included: false },
+                               group1__filter3: { selected: false, conflicted: false, included: false }
                        },
                        model = new mw.rcfilters.dm.FiltersViewModel();
 
                model.initializeFilters( definition );
                // Select a filter that has subset with another filter
                model.toggleFiltersSelected( {
-                       filter1: true
+                       group1__filter1: true
                } );
 
-               model.reassessFilterInteractions( model.getItemByName( 'filter1' ) );
+               model.reassessFilterInteractions( model.getItemByName( 'group1__filter1' ) );
                assert.deepEqual(
                        model.getFullState(),
                        $.extend( true, {}, baseFullState, {
-                               filter1: { selected: true },
-                               filter2: { included: true },
-                               filter3: { included: true }
+                               group1__filter1: { selected: true },
+                               group1__filter2: { included: true },
+                               group1__filter3: { included: true }
                        } ),
                        'Filters with subsets are represented in the model.'
                );
 
                // Select another filter that has a subset with the same previous filter
                model.toggleFiltersSelected( {
-                       filter2: true
+                       group1__filter2: true
                } );
                model.reassessFilterInteractions( model.getItemByName( 'filter2' ) );
                assert.deepEqual(
                        model.getFullState(),
                        $.extend( true, {}, baseFullState, {
-                               filter1: { selected: true },
-                               filter2: { selected: true, included: true },
-                               filter3: { included: true }
+                               group1__filter1: { selected: true },
+                               group1__filter2: { selected: true, included: true },
+                               group1__filter3: { included: true }
                        } ),
                        'Filters that have multiple subsets are represented.'
                );
 
-               // Remove one filter (but leave the other) that affects filter2
+               // Remove one filter (but leave the other) that affects filter3
                model.toggleFiltersSelected( {
-                       filter1: false
+                       group1__filter1: false
                } );
-               model.reassessFilterInteractions( model.getItemByName( 'filter1' ) );
+               model.reassessFilterInteractions( model.getItemByName( 'group1__filter1' ) );
                assert.deepEqual(
                        model.getFullState(),
                        $.extend( true, {}, baseFullState, {
-                               filter2: { selected: true, included: false },
-                               filter3: { included: true }
+                               group1__filter2: { selected: true, included: false },
+                               group1__filter3: { included: true }
                        } ),
                        'Removing a filter only un-includes its subset if there is no other filter affecting.'
                );
 
                model.toggleFiltersSelected( {
-                       filter2: false
+                       group1__filter2: false
                } );
-               model.reassessFilterInteractions( model.getItemByName( 'filter2' ) );
+               model.reassessFilterInteractions( model.getItemByName( 'group1__filter2' ) );
                assert.deepEqual(
                        model.getFullState(),
                        baseFullState,
                        },
                        getCurrentItemsMutedState = function () {
                                return {
-                                       filter1: isCapsuleItemMuted( 'filter1' ),
-                                       filter2: isCapsuleItemMuted( 'filter2' ),
-                                       filter3: isCapsuleItemMuted( 'filter3' ),
-                                       filter4: isCapsuleItemMuted( 'filter4' ),
-                                       filter5: isCapsuleItemMuted( 'filter5' ),
-                                       filter6: isCapsuleItemMuted( 'filter6' )
+                                       group1__filter1: isCapsuleItemMuted( 'group1__filter1' ),
+                                       group1__filter2: isCapsuleItemMuted( 'group1__filter2' ),
+                                       group1__filter3: isCapsuleItemMuted( 'group1__filter3' ),
+                                       group2__filter4: isCapsuleItemMuted( 'group2__filter4' ),
+                                       group2__filter5: isCapsuleItemMuted( 'group2__filter5' ),
+                                       group2__filter6: isCapsuleItemMuted( 'group2__filter6' )
                                };
                        },
                        baseMuteState = {
-                               filter1: false,
-                               filter2: false,
-                               filter3: false,
-                               filter4: false,
-                               filter5: false,
-                               filter6: false
+                               group1__filter1: false,
+                               group1__filter2: false,
+                               group1__filter3: false,
+                               group2__filter4: false,
+                               group2__filter5: false,
+                               group2__filter6: false
                        };
 
                model.initializeFilters( definition );
 
                // Select most (but not all) items in each group
                model.toggleFiltersSelected( {
-                       filter1: true,
-                       filter2: true,
-                       filter4: true,
-                       filter5: true
+                       group1__filter1: true,
+                       group1__filter2: true,
+                       group2__filter4: true,
+                       group2__filter5: true
                } );
 
                // Both groups have multiple (but not all) items selected, all items are non-muted
 
                // Select all items in 'fullCoverage' group (group2)
                model.toggleFiltersSelected( {
-                       filter6: true
+                       group2__filter6: true
                } );
 
                // Group2 (full coverage) has all items selected, all its items are muted
                assert.deepEqual(
                        getCurrentItemsMutedState(),
                        $.extend( {}, baseMuteState, {
-                               filter4: true,
-                               filter5: true,
-                               filter6: true
+                               group2__filter4: true,
+                               group2__filter5: true,
+                               group2__filter6: true
                        } ),
                        'All items in \'full coverage\' group are selected - all items in the group are muted'
                );
 
                // Select all items in non 'fullCoverage' group (group1)
                model.toggleFiltersSelected( {
-                       filter3: true
+                       group1__filter3: true
                } );
 
                // Group1 (full coverage) has all items selected, no items in it are muted (non full coverage)
                assert.deepEqual(
                        getCurrentItemsMutedState(),
                        $.extend( {}, baseMuteState, {
-                               filter4: true,
-                               filter5: true,
-                               filter6: true
+                               group2__filter4: true,
+                               group2__filter5: true,
+                               group2__filter6: true
                        } ),
                        'All items in a non \'full coverage\' group are selected - none of the items in the group are muted'
                );
 
                // Uncheck an item from each group
                model.toggleFiltersSelected( {
-                       filter3: false,
-                       filter5: false
+                       group1__filter3: false,
+                       group2__filter5: false
                } );
                assert.deepEqual(
                        getCurrentItemsMutedState(),
                                ]
                        } ],
                        baseFullState = {
-                               filter1: { selected: false, conflicted: false, included: false },
-                               filter2: { selected: false, conflicted: false, included: false },
-                               filter3: { selected: false, conflicted: false, included: false },
-                               filter4: { selected: false, conflicted: false, included: false },
-                               filter5: { selected: false, conflicted: false, included: false },
-                               filter6: { selected: false, conflicted: false, included: false }
+                               group1__filter1: { selected: false, conflicted: false, included: false },
+                               group1__filter2: { selected: false, conflicted: false, included: false },
+                               group1__filter3: { selected: false, conflicted: false, included: false },
+                               group2__filter4: { selected: false, conflicted: false, included: false },
+                               group2__filter5: { selected: false, conflicted: false, included: false },
+                               group2__filter6: { selected: false, conflicted: false, included: false }
                        },
                        model = new mw.rcfilters.dm.FiltersViewModel();
 
 
                // Select a filter that has a conflict with an entire group
                model.toggleFiltersSelected( {
-                       filter1: true // conflicts: entire of group 2 ( filter4, filter5, filter6)
+                       group1__filter1: true // conflicts: entire of group 2 ( filter4, filter5, filter6)
                } );
 
-               model.reassessFilterInteractions( model.getItemByName( 'filter1' ) );
+               model.reassessFilterInteractions( model.getItemByName( 'group1__filter1' ) );
 
                assert.deepEqual(
                        model.getFullState(),
                        $.extend( true, {}, baseFullState, {
-                               filter1: { selected: true },
-                               filter4: { conflicted: true },
-                               filter5: { conflicted: true },
-                               filter6: { conflicted: true }
+                               group1__filter1: { selected: true },
+                               group2__filter4: { conflicted: true },
+                               group2__filter5: { conflicted: true },
+                               group2__filter6: { conflicted: true }
                        } ),
                        'Selecting a filter that conflicts with a group sets all the conflicted group items as "conflicted".'
                );
 
                // Select one of the conflicts (both filters are now conflicted and selected)
                model.toggleFiltersSelected( {
-                       filter4: true // conflicts: filter 1
+                       group2__filter4: true // conflicts: filter 1
                } );
-               model.reassessFilterInteractions( model.getItemByName( 'filter4' ) );
+               model.reassessFilterInteractions( model.getItemByName( 'group2__filter4' ) );
 
                assert.deepEqual(
                        model.getFullState(),
                        $.extend( true, {}, baseFullState, {
-                               filter1: { selected: true, conflicted: true },
-                               filter4: { selected: true, conflicted: true },
-                               filter5: { conflicted: true },
-                               filter6: { conflicted: true }
+                               group1__filter1: { selected: true, conflicted: true },
+                               group2__filter4: { selected: true, conflicted: true },
+                               group2__filter5: { conflicted: true },
+                               group2__filter6: { conflicted: true }
                        } ),
                        'Selecting a conflicting filter inside a group, sets both sides to conflicted and selected.'
                );
 
                // Select a filter that has a conflict with a specific filter
                model.toggleFiltersSelected( {
-                       filter2: true // conflicts: filter6
+                       group1__filter2: true // conflicts: filter6
                } );
-
-               model.reassessFilterInteractions( model.getItemByName( 'filter2' ) );
+               model.reassessFilterInteractions( model.getItemByName( 'group1__filter2' ) );
 
                assert.deepEqual(
                        model.getFullState(),
                        $.extend( true, {}, baseFullState, {
-                               filter2: { selected: true },
-                               filter6: { conflicted: true }
+                               group1__filter2: { selected: true },
+                               group2__filter6: { conflicted: true }
                        } ),
                        'Selecting a filter that conflicts with another filter sets the other as "conflicted".'
                );
 
                // Select the conflicting filter
                model.toggleFiltersSelected( {
-                       filter6: true // conflicts: filter2
+                       group2__filter6: true // conflicts: filter2
                } );
 
-               model.reassessFilterInteractions( model.getItemByName( 'filter6' ) );
+               model.reassessFilterInteractions( model.getItemByName( 'group2__filter6' ) );
 
                assert.deepEqual(
                        model.getFullState(),
                        $.extend( true, {}, baseFullState, {
-                               filter2: { selected: true, conflicted: true },
-                               filter6: { selected: true, conflicted: true },
+                               group1__filter2: { selected: true, conflicted: true },
+                               group2__filter6: { selected: true, conflicted: true },
                                // This is added to the conflicts because filter6 is part of group2,
                                // who is in conflict with filter1; note that filter2 also conflicts
                                // with filter6 which means that filter1 conflicts with filter6 (because it's in group2)
                                // and also because its **own sibling** (filter2) is **also** in conflict with the
                                // selected items in group2 (filter6)
-                               filter1: { conflicted: true }
+                               group1__filter1: { conflicted: true }
                        } ),
                        'Selecting a conflicting filter with an individual filter, sets both sides to conflicted and selected.'
                );
 
                // Now choose a non-conflicting filter from the group
                model.toggleFiltersSelected( {
-                       filter5: true
+                       group2__filter5: true
                } );
 
-               model.reassessFilterInteractions( model.getItemByName( 'filter5' ) );
+               model.reassessFilterInteractions( model.getItemByName( 'group2__filter5' ) );
 
                assert.deepEqual(
                        model.getFullState(),
                        $.extend( true, {}, baseFullState, {
-                               filter2: { selected: true },
-                               filter6: { selected: true },
-                               filter5: { selected: true }
+                               group1__filter2: { selected: true },
+                               group2__filter6: { selected: true },
+                               group2__filter5: { selected: true }
                                // Filter6 and filter1 are no longer in conflict because
                                // filter5, while it is in conflict with filter1, it is
                                // not in conflict with filter2 - and since filter2 is
                // it is in conflict with the entire of group2, it means
                // filter1 is once again conflicted
                model.toggleFiltersSelected( {
-                       filter2: false
+                       group1__filter2: false
                } );
 
-               model.reassessFilterInteractions( model.getItemByName( 'filter2' ) );
+               model.reassessFilterInteractions( model.getItemByName( 'group1__filter2' ) );
 
                assert.deepEqual(
                        model.getFullState(),
                        $.extend( true, {}, baseFullState, {
-                               filter1: { conflicted: true },
-                               filter6: { selected: true },
-                               filter5: { selected: true }
+                               group1__filter1: { conflicted: true },
+                               group2__filter6: { selected: true },
+                               group2__filter5: { selected: true }
                        } ),
                        'Unselecting an item that did not conflict returns the conflict state.'
                );
 
                // Followup #2: Now actually select filter1, and make everything conflicted
                model.toggleFiltersSelected( {
-                       filter1: true
+                       group1__filter1: true
                } );
 
-               model.reassessFilterInteractions( model.getItemByName( 'filter1' ) );
+               model.reassessFilterInteractions( model.getItemByName( 'group1__filter1' ) );
 
                assert.deepEqual(
                        model.getFullState(),
                        $.extend( true, {}, baseFullState, {
-                               filter1: { selected: true, conflicted: true },
-                               filter6: { selected: true, conflicted: true },
-                               filter5: { selected: true, conflicted: true },
-                               filter4: { conflicted: true } // Not selected but conflicted because it's in group2
+                               group1__filter1: { selected: true, conflicted: true },
+                               group2__filter6: { selected: true, conflicted: true },
+                               group2__filter5: { selected: true, conflicted: true },
+                               group2__filter4: { conflicted: true } // Not selected but conflicted because it's in group2
                        } ),
                        'Selecting an item that conflicts with a whole group makes all selections in that group conflicted.'
                );
 
                // Select a filter that has a conflict with a specific filter
                model.toggleFiltersSelected( {
-                       filter2: true // conflicts: filter6
+                       group1__filter2: true // conflicts: filter6
                } );
 
-               model.reassessFilterInteractions( model.getItemByName( 'filter2' ) );
+               model.reassessFilterInteractions( model.getItemByName( 'group1__filter2' ) );
 
                assert.deepEqual(
                        model.getFullState(),
                        $.extend( true, {}, baseFullState, {
-                               filter2: { selected: true },
-                               filter6: { conflicted: true }
+                               group1__filter2: { selected: true },
+                               group2__filter6: { conflicted: true }
                        } ),
                        'Simple case: Selecting a filter that conflicts with another filter sets the other as "conflicted".'
                );
 
                model.toggleFiltersSelected( {
-                       filter3: true // conflicts: filter6
+                       group1__filter3: true // conflicts: filter6
                } );
 
-               model.reassessFilterInteractions( model.getItemByName( 'filter3' ) );
+               model.reassessFilterInteractions( model.getItemByName( 'group1__filter3' ) );
 
                assert.deepEqual(
                        model.getFullState(),
                        $.extend( true, {}, baseFullState, {
-                               filter2: { selected: true },
-                               filter3: { selected: true }
+                               group1__filter2: { selected: true },
+                               group1__filter3: { selected: true }
                        } ),
                        'Simple case: Selecting a filter that is not in conflict removes the conflict.'
                );
                        'Highlight is enabled on toggle.'
                );
 
-               model.setHighlightColor( 'filter1', 'color1' );
-               model.setHighlightColor( 'filter2', 'color2' );
+               model.setHighlightColor( 'group1__filter1', 'color1' );
+               model.setHighlightColor( 'group1__filter2', 'color2' );
 
                assert.deepEqual(
                        model.getHighlightedItems().map( function ( item ) {
                                return item.getName();
                        } ),
                        [
-                               'filter1',
-                               'filter2'
+                               'group1__filter1',
+                               'group1__filter2'
                        ],
                        'Highlighted items are highlighted.'
                );
 
                assert.equal(
-                       model.getItemByName( 'filter1' ).getHighlightColor(),
+                       model.getItemByName( 'group1__filter1' ).getHighlightColor(),
                        'color1',
                        'Item highlight color is set.'
                );
 
-               model.setHighlightColor( 'filter1', 'color1changed' );
+               model.setHighlightColor( 'group1__filter1', 'color1changed' );
                assert.equal(
-                       model.getItemByName( 'filter1' ).getHighlightColor(),
+                       model.getItemByName( 'group1__filter1' ).getHighlightColor(),
                        'color1changed',
                        'Item highlight color is changed on setHighlightColor.'
                );
 
-               model.clearHighlightColor( 'filter1' );
+               model.clearHighlightColor( 'group1__filter1' );
                assert.deepEqual(
                        model.getHighlightedItems().map( function ( item ) {
                                return item.getName();
                        } ),
                        [
-                               'filter2'
+                               'group1__filter2'
                        ],
                        'Clear highlight from an item results in the item no longer being highlighted.'
                );
                model = new mw.rcfilters.dm.FiltersViewModel();
                model.initializeFilters( definition );
 
-               model.setHighlightColor( 'filter1', 'color1' );
-               model.setHighlightColor( 'filter2', 'color2' );
-               model.setHighlightColor( 'filter3', 'color3' );
+               model.setHighlightColor( 'group1__filter1', 'color1' );
+               model.setHighlightColor( 'group1__filter2', 'color2' );
+               model.setHighlightColor( 'group1__filter3', 'color3' );
 
                assert.deepEqual(
                        model.getHighlightedItems().map( function ( item ) {
                                return item.getName();
                        } ),
                        [
-                               'filter1',
-                               'filter2',
-                               'filter3'
+                               'group1__filter1',
+                               'group1__filter2',
+                               'group1__filter3'
                        ],
                        'Even if highlights are not enabled, the items remember their highlight state'
                        // NOTE: When actually displaying the highlights, the UI checks whether
                model = new mw.rcfilters.dm.FiltersViewModel();
                model.initializeFilters( definition );
 
-               model.setHighlightColor( 'filter1', 'color1' );
-               model.setHighlightColor( 'filter6', 'color6' );
+               model.setHighlightColor( 'group1__filter1', 'color1' );
+               model.setHighlightColor( 'group1__filter6', 'color6' );
 
                assert.deepEqual(
                        model.getHighlightedItems().map( function ( item ) {
                                return item.getName();
                        } ),
                        [
-                               'filter1'
+                               'group1__filter1'
                        ],
                        'Items without a specified class identifier are not highlighted.'
                );
index 3b549bd..3c77a00 100644 (file)
                );
        } );
 
+       QUnit.test( 'setParserDefaults', function ( assert ) {
+               mw.jqueryMsg.setParserDefaults( {
+                       magic: {
+                               FOO: 'foo',
+                               BAR: 'bar'
+                       }
+               } );
+
+               assert.deepEqual(
+                       mw.jqueryMsg.getParserDefaults().magic,
+                       {
+                               FOO: 'foo',
+                               BAR: 'bar'
+                       },
+                       'setParserDefaults is shallow by default'
+               );
+
+               mw.jqueryMsg.setParserDefaults(
+                       {
+                               magic: {
+                                       BAZ: 'baz'
+                               }
+                       },
+                       true
+               );
+
+               assert.deepEqual(
+                       mw.jqueryMsg.getParserDefaults().magic,
+                       {
+                               FOO: 'foo',
+                               BAR: 'bar',
+                               BAZ: 'baz'
+                       },
+                       'setParserDefaults is deep if requested'
+               );
+       } );
 }( mediaWiki, jQuery ) );
index 477b04d..7a0de81 100644 (file)
                                assert.ok( true, 'QUnit expected() count dummy' );
                        },
                        function ( e, dependencies ) {
-                               assert.strictEqual( $.isArray( dependencies ), true, 'Expected array of dependencies' );
+                               assert.strictEqual( Array.isArray( dependencies ), true, 'Expected array of dependencies' );
                                assert.deepEqual( dependencies, [ 'test.module7' ], 'Error callback called with module test.module7' );
                        }
                );
                                assert.ok( true, 'QUnit expected() count dummy' );
                        },
                        function ( e, dependencies ) {
-                               assert.strictEqual( $.isArray( dependencies ), true, 'Expected array of dependencies' );
+                               assert.strictEqual( Array.isArray( dependencies ), true, 'Expected array of dependencies' );
                                dependencies.sort();
                                assert.deepEqual(
                                        dependencies,
index 297f0fd..70a7e35 100644 (file)
@@ -12,7 +12,7 @@
                assert.strictEqual( $( '#toc' ).length, 0, 'There is no table of contents on the page at the beginning' );
 
                tocHtml = '<div id="toc" class="toc">' +
-                       '<div id="toctitle">' +
+                       '<div id="toctitle" class="toctitle">' +
                        '<h2>Contents</h2>' +
                        '</div>' +
                        '<ul><li></li></ul>' +
@@ -21,7 +21,7 @@
                mw.hook( 'wikipage.content' ).fire( $( '#qunit-fixture' ) );
 
                $tocList = $( '#toc ul:first' );
-               $toggleLink = $( '#togglelink' );
+               $toggleLink = $( '#toc .togglelink' );
 
                assert.strictEqual( $toggleLink.length, 1, 'Toggle link is added to the table of contents' );
 
index 01665e5..0e88740 100644 (file)
@@ -1,5 +1,5 @@
 ( function ( mw, $ ) {
-       var
+       var util = require( 'mediawiki.util' ),
                // Based on IPTest.php > testisIPv4
                IPV4_CASES = [
                        [ false, false, 'Boolean false is not an IP' ],
@@ -89,7 +89,7 @@
        } ) );
 
        QUnit.test( 'rawurlencode', function ( assert ) {
-               assert.equal( mw.util.rawurlencode( 'Test:A & B/Here' ), 'Test%3AA%20%26%20B%2FHere' );
+               assert.equal( util.rawurlencode( 'Test:A & B/Here' ), 'Test%3AA%20%26%20B%2FHere' );
        } );
 
        QUnit.test( 'escapeId', function ( assert ) {
                        'Test:A & B/Here': 'Test:A_.26_B.2FHere',
                        'A&B&amp;C&amp;amp;D&amp;amp;amp;E': 'A.26B.26amp.3BC.26amp.3Bamp.3BD.26amp.3Bamp.3Bamp.3BE'
                }, function ( input, output ) {
-                       assert.equal( mw.util.escapeId( input ), output );
+                       assert.equal( util.escapeId( input ), output );
                } );
        } );
 
        QUnit.test( 'wikiUrlencode', function ( assert ) {
-               assert.equal( mw.util.wikiUrlencode( 'Test:A & B/Here' ), 'Test:A_%26_B/Here' );
+               assert.equal( util.wikiUrlencode( 'Test:A & B/Here' ), 'Test:A_%26_B/Here' );
                // See also wfUrlencodeTest.php#provideURLS
                $.each( {
                        '+': '%2B',
                        '<>': '%3C%3E',
                        '\'': '%27'
                }, function ( input, output ) {
-                       assert.equal( mw.util.wikiUrlencode( input ), output );
+                       assert.equal( util.wikiUrlencode( input ), output );
                } );
        } );
 
                        wgPageName: 'Foobar'
                } );
 
-               href = mw.util.getUrl( 'Sandbox' );
+               href = util.getUrl( 'Sandbox' );
                assert.equal( href, '/wiki/Sandbox', 'simple title' );
 
-               href = mw.util.getUrl( 'Foo:Sandbox? 5+5=10! (test)/sub ' );
+               href = util.getUrl( 'Foo:Sandbox? 5+5=10! (test)/sub ' );
                assert.equal( href, '/wiki/Foo:Sandbox%3F_5%2B5%3D10!_(test)/sub_', 'complex title' );
 
                // T149767
-               href = mw.util.getUrl( 'My$$test$$$$$title' );
+               href = util.getUrl( 'My$$test$$$$$title' );
                assert.equal( href, '/wiki/My$$test$$$$$title', 'title with multiple consecutive dollar signs' );
 
-               href = mw.util.getUrl();
+               href = util.getUrl();
                assert.equal( href, '/wiki/Foobar', 'default title' );
 
-               href = mw.util.getUrl( null, { action: 'edit' } );
+               href = util.getUrl( null, { action: 'edit' } );
                assert.equal( href, '/w/index.php?title=Foobar&action=edit', 'default title with query string' );
 
-               href = mw.util.getUrl( 'Sandbox', { action: 'edit' } );
+               href = util.getUrl( 'Sandbox', { action: 'edit' } );
                assert.equal( href, '/w/index.php?title=Sandbox&action=edit', 'simple title with query string' );
 
                // Test fragments
-               href = mw.util.getUrl( 'Foo:Sandbox#Fragment', { action: 'edit' } );
+               href = util.getUrl( 'Foo:Sandbox#Fragment', { action: 'edit' } );
                assert.equal( href, '/w/index.php?title=Foo:Sandbox&action=edit#Fragment', 'namespaced title with query string and fragment' );
 
-               href = mw.util.getUrl( 'Sandbox#', { action: 'edit' } );
+               href = util.getUrl( 'Sandbox#', { action: 'edit' } );
                assert.equal( href, '/w/index.php?title=Sandbox&action=edit', 'title with query string and empty fragment' );
 
-               href = mw.util.getUrl( 'Sandbox', {} );
+               href = util.getUrl( 'Sandbox', {} );
                assert.equal( href, '/wiki/Sandbox', 'title with empty query string' );
 
-               href = mw.util.getUrl( '#Fragment' );
+               href = util.getUrl( '#Fragment' );
                assert.equal( href, '/wiki/#Fragment', 'empty title with fragment' );
 
-               href = mw.util.getUrl( '#Fragment', { action: 'edit' } );
+               href = util.getUrl( '#Fragment', { action: 'edit' } );
                assert.equal( href, '/w/index.php?action=edit#Fragment', 'epmty title with query string and fragment' );
 
-               href = mw.util.getUrl( 'Foo:Sandbox \xC4#Fragment \xC4', { action: 'edit' } );
+               href = util.getUrl( 'Foo:Sandbox \xC4#Fragment \xC4', { action: 'edit' } );
                assert.equal( href, '/w/index.php?title=Foo:Sandbox_%C3%84&action=edit#Fragment_.C3.84', 'title with query string, fragment, and special characters' );
 
-               href = mw.util.getUrl( 'Foo:%23#Fragment', { action: 'edit' } );
+               href = util.getUrl( 'Foo:%23#Fragment', { action: 'edit' } );
                assert.equal( href, '/w/index.php?title=Foo:%2523&action=edit#Fragment', 'title containing %23 (#), fragment, and a query string' );
 
-               href = mw.util.getUrl( '#+&=:;@$-_.!*/[]<>\'§', { action: 'edit' } );
+               href = util.getUrl( '#+&=:;@$-_.!*/[]<>\'§', { action: 'edit' } );
                assert.equal( href, '/w/index.php?action=edit#.2B.26.3D:.3B.40.24-_..21.2A.2F.5B.5D.3C.3E.27.C2.A7', 'fragment with various characters' );
        } );
 
                        wgScriptPath: '/w'
                } );
 
-               assert.equal( mw.util.wikiScript(), mw.config.get( 'wgScript' ),
+               assert.equal( util.wikiScript(), mw.config.get( 'wgScript' ),
                        'wikiScript() returns wgScript'
                );
-               assert.equal( mw.util.wikiScript( 'index' ), mw.config.get( 'wgScript' ),
+               assert.equal( util.wikiScript( 'index' ), mw.config.get( 'wgScript' ),
                        'wikiScript( index ) returns wgScript'
                );
-               assert.equal( mw.util.wikiScript( 'load' ), mw.config.get( 'wgLoadScript' ),
+               assert.equal( util.wikiScript( 'load' ), mw.config.get( 'wgLoadScript' ),
                        'wikiScript( load ) returns wgLoadScript'
                );
-               assert.equal( mw.util.wikiScript( 'api' ), '/w/api.php', 'API path' );
+               assert.equal( util.wikiScript( 'api' ), '/w/api.php', 'API path' );
        } );
 
        QUnit.test( 'addCSS', function ( assert ) {
                var $el, style;
                $el = $( '<div>' ).attr( 'id', 'mw-addcsstest' ).appendTo( '#qunit-fixture' );
 
-               style = mw.util.addCSS( '#mw-addcsstest { visibility: hidden; }' );
+               style = util.addCSS( '#mw-addcsstest { visibility: hidden; }' );
                assert.equal( typeof style, 'object', 'addCSS returned an object' );
                assert.strictEqual( style.disabled, false, 'property "disabled" is available and set to false' );
 
                var url;
 
                url = 'http://example.org/?foo=wrong&foo=right#&foo=bad';
-               assert.equal( mw.util.getParamValue( 'foo', url ), 'right', 'Use latest one, ignore hash' );
-               assert.strictEqual( mw.util.getParamValue( 'bar', url ), null, 'Return null when not found' );
+               assert.equal( util.getParamValue( 'foo', url ), 'right', 'Use latest one, ignore hash' );
+               assert.strictEqual( util.getParamValue( 'bar', url ), null, 'Return null when not found' );
 
                url = 'http://example.org/#&foo=bad';
-               assert.strictEqual( mw.util.getParamValue( 'foo', url ), null, 'Ignore hash if param is not in querystring but in hash (T29427)' );
+               assert.strictEqual( util.getParamValue( 'foo', url ), null, 'Ignore hash if param is not in querystring but in hash (T29427)' );
 
                url = 'example.org?' + $.param( { TEST: 'a b+c' } );
-               assert.strictEqual( mw.util.getParamValue( 'TEST', url ), 'a b+c', 'T32441: getParamValue must understand "+" encoding of space' );
+               assert.strictEqual( util.getParamValue( 'TEST', url ), 'a b+c', 'T32441: getParamValue must understand "+" encoding of space' );
 
                url = 'example.org?' + $.param( { TEST: 'a b+c d' } ); // check for sloppy code from r95332 :)
-               assert.strictEqual( mw.util.getParamValue( 'TEST', url ), 'a b+c d', 'T32441: getParamValue must understand "+" encoding of space (multiple spaces)' );
+               assert.strictEqual( util.getParamValue( 'TEST', url ), 'a b+c d', 'T32441: getParamValue must understand "+" encoding of space (multiple spaces)' );
        } );
 
        QUnit.test( '$content', function ( assert ) {
-               assert.ok( mw.util.$content instanceof jQuery, 'mw.util.$content instance of jQuery' );
-               assert.strictEqual( mw.util.$content.length, 1, 'mw.util.$content must have length of 1' );
+               assert.ok( util.$content instanceof jQuery, 'mw.util.$content instance of jQuery' );
+               assert.strictEqual( util.$content.length, 1, 'mw.util.$content must have length of 1' );
        } );
 
        /**
 
                $( '#qunit-fixture' ).append( pTestTb, pCustom, vectorTabs );
 
-               tbRL = mw.util.addPortletLink( 'p-test-tb', '//mediawiki.org/wiki/ResourceLoader',
+               tbRL = util.addPortletLink( 'p-test-tb', '//mediawiki.org/wiki/ResourceLoader',
                        'ResourceLoader', 't-rl', 'More info about ResourceLoader on MediaWiki.org ', 'l'
                );
 
                assert.ok( tbRL && tbRL.nodeType, 'addPortletLink returns a DOM Node' );
 
-               tbMW = mw.util.addPortletLink( 'p-test-tb', '//mediawiki.org/',
+               tbMW = util.addPortletLink( 'p-test-tb', '//mediawiki.org/',
                        'MediaWiki.org', 't-mworg', 'Go to MediaWiki.org', 'm', tbRL );
                $tbMW = $( tbMW );
 
                assert.equal( $tbMW.closest( '.portlet' ).attr( 'id' ), 'p-test-tb', 'Link was inserted within correct portlet' );
                assert.strictEqual( $tbMW.next()[ 0 ], tbRL, 'Link is in the correct position (nextnode as Node object)' );
 
-               cuQuux = mw.util.addPortletLink( 'p-test-custom', '#', 'Quux', null, 'Example [shift-x]', 'q' );
+               cuQuux = util.addPortletLink( 'p-test-custom', '#', 'Quux', null, 'Example [shift-x]', 'q' );
                $cuQuux = $( cuQuux );
 
                assert.equal( $cuQuux.find( 'a' ).attr( 'title' ), 'Example [test-q]', 'Existing accesskey is stripped and updated' );
                        'addPortletLink did not add the item to all <ul> elements in the portlet (T37082)'
                );
 
-               tbRLDM = mw.util.addPortletLink( 'p-test-tb', '//mediawiki.org/wiki/RL/DM',
+               tbRLDM = util.addPortletLink( 'p-test-tb', '//mediawiki.org/wiki/RL/DM',
                        'Default modules', 't-rldm', 'List of all default modules ', 'd', '#t-rl' );
 
                assert.strictEqual( $( tbRLDM ).next()[ 0 ], tbRL, 'Link is in the correct position (CSS selector as nextnode)' );
 
-               caFoo = mw.util.addPortletLink( 'p-test-views', '#', 'Foo' );
+               caFoo = util.addPortletLink( 'p-test-views', '#', 'Foo' );
 
                assert.strictEqual( $tbMW.find( 'span' ).length, 0, 'No <span> element should be added for porlets without vectorTabs class.' );
                assert.strictEqual( $( caFoo ).find( 'span' ).length, 1, 'A <span> element should be added for porlets with vectorTabs class.' );
 
-               addedAfter = mw.util.addPortletLink( 'p-test-tb', '#', 'After foo', 'post-foo', 'After foo', null, $( tbRL ) );
+               addedAfter = util.addPortletLink( 'p-test-tb', '#', 'After foo', 'post-foo', 'After foo', null, $( tbRL ) );
                assert.strictEqual( $( addedAfter ).next()[ 0 ], tbRL, 'Link is in the correct position (jQuery object as nextnode)' );
 
                // test case - nonexistent id as next node
-               tbRLDMnonexistentid = mw.util.addPortletLink( 'p-test-tb', '//mediawiki.org/wiki/RL/DM',
+               tbRLDMnonexistentid = util.addPortletLink( 'p-test-tb', '//mediawiki.org/wiki/RL/DM',
                        'Default modules', 't-rldm-nonexistent', 'List of all default modules ', 'd', '#t-rl-nonexistent' );
 
                assert.equal( tbRLDMnonexistentid, $( '#p-test-tb li:last' )[ 0 ], 'Fallback to adding at the end (nextnode non-matching CSS selector)' );
 
                // test case - empty jquery object as next node
-               tbRLDMemptyjquery = mw.util.addPortletLink( 'p-test-tb', '//mediawiki.org/wiki/RL/DM',
+               tbRLDMemptyjquery = util.addPortletLink( 'p-test-tb', '//mediawiki.org/wiki/RL/DM',
                        'Default modules', 't-rldm-empty-jquery', 'List of all default modules ', 'd', $( '#t-rl-nonexistent' ) );
 
                assert.equal( tbRLDMemptyjquery, $( '#p-test-tb li:last' )[ 0 ], 'Fallback to adding at the end (nextnode as empty jQuery object)' );
        } );
 
        QUnit.test( 'validateEmail', function ( assert ) {
-               assert.strictEqual( mw.util.validateEmail( '' ), null, 'Should return null for empty string ' );
-               assert.strictEqual( mw.util.validateEmail( 'user@localhost' ), true, 'Return true for a valid e-mail address' );
+               assert.strictEqual( util.validateEmail( '' ), null, 'Should return null for empty string ' );
+               assert.strictEqual( util.validateEmail( 'user@localhost' ), true, 'Return true for a valid e-mail address' );
 
                // testEmailWithCommasAreInvalids
-               assert.strictEqual( mw.util.validateEmail( 'user,foo@example.org' ), false, 'Emails with commas are invalid' );
-               assert.strictEqual( mw.util.validateEmail( 'userfoo@ex,ample.org' ), false, 'Emails with commas are invalid' );
+               assert.strictEqual( util.validateEmail( 'user,foo@example.org' ), false, 'Emails with commas are invalid' );
+               assert.strictEqual( util.validateEmail( 'userfoo@ex,ample.org' ), false, 'Emails with commas are invalid' );
 
                // testEmailWithHyphens
-               assert.strictEqual( mw.util.validateEmail( 'user-foo@example.org' ), true, 'Emails may contain a hyphen' );
-               assert.strictEqual( mw.util.validateEmail( 'userfoo@ex-ample.org' ), true, 'Emails may contain a hyphen' );
+               assert.strictEqual( util.validateEmail( 'user-foo@example.org' ), true, 'Emails may contain a hyphen' );
+               assert.strictEqual( util.validateEmail( 'userfoo@ex-ample.org' ), true, 'Emails may contain a hyphen' );
        } );
 
        QUnit.test( 'isIPv6Address', function ( assert ) {
                $.each( IPV6_CASES, function ( i, ipCase ) {
-                       assert.strictEqual( mw.util.isIPv6Address( ipCase[ 1 ] ), ipCase[ 0 ], ipCase[ 2 ] );
+                       assert.strictEqual( util.isIPv6Address( ipCase[ 1 ] ), ipCase[ 0 ], ipCase[ 2 ] );
                } );
        } );
 
        QUnit.test( 'isIPv4Address', function ( assert ) {
                $.each( IPV4_CASES, function ( i, ipCase ) {
-                       assert.strictEqual( mw.util.isIPv4Address( ipCase[ 1 ] ), ipCase[ 0 ], ipCase[ 2 ] );
+                       assert.strictEqual( util.isIPv4Address( ipCase[ 1 ] ), ipCase[ 0 ], ipCase[ 2 ] );
                } );
        } );
 
        QUnit.test( 'isIPAddress', function ( assert ) {
                $.each( IPV4_CASES, function ( i, ipCase ) {
-                       assert.strictEqual( mw.util.isIPv4Address( ipCase[ 1 ] ), ipCase[ 0 ], ipCase[ 2 ] );
+                       assert.strictEqual( util.isIPv4Address( ipCase[ 1 ] ), ipCase[ 0 ], ipCase[ 2 ] );
                } );
 
                $.each( IPV6_CASES, function ( i, ipCase ) {
-                       assert.strictEqual( mw.util.isIPv6Address( ipCase[ 1 ] ), ipCase[ 0 ], ipCase[ 2 ] );
+                       assert.strictEqual( util.isIPv6Address( ipCase[ 1 ] ), ipCase[ 0 ], ipCase[ 2 ] );
                } );
        } );
 }( mediaWiki, jQuery ) );
index 02ca243..ee1340d 100644 (file)
                        'Mozilla/5.0 (Linux; U; Android 2.3.4; en-us; Kindle Fire Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Safari/533.1',
                        // Safari 5.0+
                        'Mozilla/5.0 (Macintosh; I; Intel Mac OS X 10_6_7; ru-ru) AppleWebKit/534.31+ (KHTML, like Gecko) Version/5.0.5 Safari/533.21.1',
-                       // Opera 12+ (Presto-based)
-                       'Opera/9.80 (Windows NT 6.1; U; es-ES) Presto/2.9.181 Version/12.00',
-                       'Opera/9.80 (Windows NT 5.1) Presto/2.12.388 Version/12.17',
                        // Opera 15+ (Chromium-based)
                        'Mozilla/5.0 (Windows NT 6.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36 OPR/15.0.1147.153',
                        'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.57 Safari/537.36 OPR/16.0.1196.62',
                        'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36 OPR/23.0.1522.75',
-                       // Internet Explorer 9+
-                       'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 7.1; Trident/5.0)',
+                       // Internet Explorer 10+
                        'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)',
                        'Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko',
                        // IE Mobile
@@ -52,7 +48,7 @@
 
                        /* Grade C */
 
-                       // Internet Explorer < 9
+                       // Internet Explorer < 10
                        'Mozilla/2.0 (compatible; MSIE 3.03; Windows 3.1)',
                        'Mozilla/4.0 (compatible; MSIE 4.01; Windows 95)',
                        'Mozilla/4.0 (compatible; MSIE 5.0; Windows 98;)',
                        'Mozilla/5.0 (compatible; MSIE 6.0; Windows NT 5.1)',
                        'Mozilla/5.0 (compatible; MSIE 7.0; Windows NT 6.0; en-US)',
                        'Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; Media Center PC 4.0; SLCC1; .NET CLR 3.0.04320)',
-                       // Firefox < 3
+                       'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 7.1; Trident/5.0)',
+                       // Firefox < 4
                        'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.2) Gecko/20060308 Firefox/1.5.0.2',
                        'Mozilla/5.0 (X11; U; Linux i686; nl; rv:1.8.1.1) Gecko/20070311 Firefox/2.0.0.1',
-                       // Opera < 12
+                       'Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3',
+                       // Opera < 15 (Presto-based)
                        'Mozilla/5.0 (Windows NT 5.0; U) Opera 7.54 [en]',
                        'Opera/7.54 (Windows NT 5.0; U) [en]',
                        'Mozilla/5.0 (Windows NT 5.1; U; en) Opera 8.0',
                        'Opera/9.80 (Windows NT 6.1; U; en) Presto/2.2.15 Version/10.00',
                        'Opera/9.80 (Windows NT 6.1; U; ru) Presto/2.8.131 Version/11.10',
                        'Opera/9.80 (Windows NT 6.1; WOW64; U; pt) Presto/2.10.229 Version/11.62',
+                       'Opera/9.80 (Windows NT 6.1; U; es-ES) Presto/2.9.181 Version/12.00',
+                       'Opera/9.80 (Windows NT 5.1) Presto/2.12.388 Version/12.17',
                        // BlackBerry < 6
                        'BlackBerry9300/5.0.0.716 Profile/MIDP-2.1 Configuration/CLDC-1.1 VendorID/133',
                        'BlackBerry7250/4.0.0 Profile/MIDP-2.0 Configuration/CLDC-1.1',
 
                        /* Grade X */
 
-                       // Firefox 3.6
-                       'Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3',
                        // Gecko
                        'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.7) Gecko/20060928 (Debian|Debian-1.8.0.7-1) Epiphany/2.14',
                        'Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.8.1.6) Gecko/20070817 IceWeasel/2.0.0.6-g2',
diff --git a/tests/selenium/.eslintrc.json b/tests/selenium/.eslintrc.json
new file mode 100644 (file)
index 0000000..b2d0bdd
--- /dev/null
@@ -0,0 +1,11 @@
+{
+       "extends": "../../.eslintrc.json",
+       "env": {
+               "es6": true,
+               "mocha": true,
+               "node": true
+       },
+       "globals": {
+               "browser": false
+       }
+}
diff --git a/tests/selenium/README.md b/tests/selenium/README.md
new file mode 100644 (file)
index 0000000..479b958
--- /dev/null
@@ -0,0 +1,52 @@
+# Selenium tests
+
+## Prerequisites
+
+- [Chrome](https://www.google.com/chrome/)
+- [ChromeDriver](https://sites.google.com/a/chromium.org/chromedriver/)
+- [Node.js](https://nodejs.org/en/)
+- [MediaWiki-Vagrant](https://www.mediawiki.org/wiki/MediaWiki-Vagrant)
+
+Set up MediaWiki-Vagrant:
+
+    cd mediawiki/vagrant
+    vagrant up
+
+## Installation
+
+    cd mediawiki
+    npm install
+
+## Usage
+
+    npm run selenium
+
+To run only one file (for example page.js), you first need to spawn the chromedriver:
+
+    chromedriver --url-base=/wd/hub --port=4444
+
+Then in another terminal:
+
+    cd mediawiki/tests/selenium
+    ../../node_modules/.bin/wdio --spec page.js
+
+The runner reads the config file `wdio.conf.js` and runs the spec listed in
+`page.js`.
+
+The defaults in the configuration files aim are targetting  a MediaWiki-Vagrant
+installation on installation on http://127.0.0.1:8080 with a user Admin and
+password 'vagrant'.  Those settings can be overriden using environment
+variables:
+
+`MW_SERVER`: to be set to the value of your $wgServer
+`MW_SCRIPT_PATH`: ditto with  $wgScriptPath
+`MEDIAWIKI_USER`: username of an account that can create users on the wiki.
+`MEDIAWIKI_PASSWORD`: password for above user
+
+Example:
+
+    MW_SERVER=http://example.org MW_SCRIPT_PATH=/dev/w npm run selenium
+
+## Links
+
+- [Selenium/Node.js](https://www.mediawiki.org/wiki/Selenium/Node.js)
diff --git a/tests/selenium/pageobjects/createaccount.page.js b/tests/selenium/pageobjects/createaccount.page.js
new file mode 100644 (file)
index 0000000..a0b9490
--- /dev/null
@@ -0,0 +1,25 @@
+'use strict';
+const Page = require( './page' );
+
+class CreateAccountPage extends Page {
+
+       get username() { return browser.element( '#wpName2' ); }
+       get password() { return browser.element( '#wpPassword2' ); }
+       get confirmPassword() { return browser.element( '#wpRetype' ); }
+       get create() { return browser.element( '#wpCreateaccount' ); }
+       get heading() { return browser.element( '#firstHeading' ); }
+
+       open() {
+               super.open( 'Special:CreateAccount' );
+       }
+
+       createAccount( username, password ) {
+               this.open();
+               this.username.setValue( username );
+               this.password.setValue( password );
+               this.confirmPassword.setValue( password );
+               this.create.click();
+       }
+
+}
+module.exports = new CreateAccountPage();
diff --git a/tests/selenium/pageobjects/edit.page.js b/tests/selenium/pageobjects/edit.page.js
new file mode 100644 (file)
index 0000000..819c546
--- /dev/null
@@ -0,0 +1,22 @@
+'use strict';
+const Page = require( './page' );
+
+class EditPage extends Page {
+
+       get content() { return browser.element( '#wpTextbox1' ); }
+       get displayedContent() { return browser.element( '#mw-content-text' ); }
+       get heading() { return browser.element( '#firstHeading' ); }
+       get save() { return browser.element( '#wpSave' ); }
+
+       open( name ) {
+               super.open( name + '&action=edit' );
+       }
+
+       edit( name, content ) {
+               this.open( name );
+               this.content.setValue( content );
+               this.save.click();
+       }
+
+}
+module.exports = new EditPage();
diff --git a/tests/selenium/pageobjects/history.page.js b/tests/selenium/pageobjects/history.page.js
new file mode 100644 (file)
index 0000000..869484e
--- /dev/null
@@ -0,0 +1,13 @@
+'use strict';
+const Page = require( './page' );
+
+class HistoryPage extends Page {
+
+       get comment() { return browser.element( '#pagehistory .comment' ); }
+
+       open( name ) {
+               super.open( name + '&action=history' );
+       }
+
+}
+module.exports = new HistoryPage();
diff --git a/tests/selenium/pageobjects/page.js b/tests/selenium/pageobjects/page.js
new file mode 100644 (file)
index 0000000..864bdae
--- /dev/null
@@ -0,0 +1,11 @@
+// From http://webdriver.io/guide/testrunner/pageobjects.html
+'use strict';
+class Page {
+       constructor() {
+               this.title = 'My Page';
+       }
+       open( path ) {
+               browser.url( '/index.php?title=' + path );
+       }
+}
+module.exports = Page;
diff --git a/tests/selenium/pageobjects/preferences.page.js b/tests/selenium/pageobjects/preferences.page.js
new file mode 100644 (file)
index 0000000..98b87fe
--- /dev/null
@@ -0,0 +1,20 @@
+'use strict';
+const Page = require( './page' );
+
+class PreferencesPage extends Page {
+
+       get realName() { return browser.element( '#mw-input-wprealname' ); }
+       get save() { return browser.element( '#prefcontrol' ); }
+
+       open() {
+               super.open( 'Special:Preferences' );
+       }
+
+       changeRealName( realName ) {
+               this.open();
+               this.realName.setValue( realName );
+               this.save.click();
+       }
+
+}
+module.exports = new PreferencesPage();
diff --git a/tests/selenium/pageobjects/userlogin.page.js b/tests/selenium/pageobjects/userlogin.page.js
new file mode 100644 (file)
index 0000000..bdbd41b
--- /dev/null
@@ -0,0 +1,23 @@
+'use strict';
+const Page = require( './page' );
+
+class UserLoginPage extends Page {
+
+       get username() { return browser.element( '#wpName1' ); }
+       get password() { return browser.element( '#wpPassword1' ); }
+       get loginButton() { return browser.element( '#wpLoginAttempt' ); }
+       get userPage() { return browser.element( '#pt-userpage' ); }
+
+       open() {
+               super.open( 'Special:UserLogin' );
+       }
+
+       login( username, password ) {
+               this.open();
+               this.username.setValue( username );
+               this.password.setValue( password );
+               this.loginButton.click();
+       }
+
+}
+module.exports = new UserLoginPage();
diff --git a/tests/selenium/pageobjects/userlogout.page.js b/tests/selenium/pageobjects/userlogout.page.js
new file mode 100644 (file)
index 0000000..e355fd5
--- /dev/null
@@ -0,0 +1,11 @@
+'use strict';
+const Page = require( './page' );
+
+class UserLogoutPage extends Page {
+
+       open() {
+               super.open( 'Special:UserLogout' );
+       }
+
+}
+module.exports = new UserLogoutPage();
diff --git a/tests/selenium/specs/page.js b/tests/selenium/specs/page.js
new file mode 100644 (file)
index 0000000..da80aaf
--- /dev/null
@@ -0,0 +1,54 @@
+'use strict';
+const assert = require( 'assert' ),
+       HistoryPage = require( '../pageobjects/history.page' ),
+       EditPage = require( '../pageobjects/edit.page' );
+
+describe( 'Page', function () {
+
+       var content,
+               name;
+
+       beforeEach( function () {
+               content = Math.random().toString();
+               name = Math.random().toString();
+       } );
+
+       it( 'should be creatable', function () {
+
+               // create
+               EditPage.edit( name, content );
+
+               // check
+               assert.equal( EditPage.heading.getText(), name );
+               assert.equal( EditPage.displayedContent.getText(), content );
+
+       } );
+
+       it( 'should be editable', function () {
+
+               var content2 = Math.random().toString();
+
+               // create
+               EditPage.edit( name, content );
+
+               // edit
+               EditPage.edit( name, content2 );
+
+               // check content
+               assert.equal( EditPage.heading.getText(), name );
+               assert.equal( EditPage.displayedContent.getText(), content2 );
+
+       } );
+
+       it( 'should have history', function () {
+
+               // create
+               EditPage.edit( name, content );
+
+               // check
+               HistoryPage.open( name );
+               assert.equal( HistoryPage.comment.getText(), `(Created page with "${content}")` );
+
+       } );
+
+} );
diff --git a/tests/selenium/specs/user.js b/tests/selenium/specs/user.js
new file mode 100644 (file)
index 0000000..6746c5b
--- /dev/null
@@ -0,0 +1,59 @@
+'use strict';
+const assert = require( 'assert' ),
+       CreateAccountPage = require( '../pageobjects/createaccount.page' ),
+       UserLoginPage = require( '../pageobjects/userlogin.page' ),
+       UserLogoutPage = require( '../pageobjects/userlogout.page' ),
+       PreferencesPage = require( '../pageobjects/preferences.page' );
+
+describe( 'User', function () {
+
+       var password,
+               username;
+
+       beforeEach( function () {
+               username = `User-${Math.random().toString()}`;
+               password = Math.random().toString();
+       } );
+
+       it( 'should be able to create account', function () {
+
+               // create
+               CreateAccountPage.createAccount( username, password );
+
+               // check
+               assert.equal( CreateAccountPage.heading.getText(), `Welcome, ${username}!` );
+
+       } );
+
+       it( 'should be able to log in', function () {
+
+               // create
+               CreateAccountPage.createAccount( username, password );
+
+               // logout
+               UserLogoutPage.open();
+
+               // log in
+               UserLoginPage.login( username, password );
+
+               // check
+               assert.equal( UserLoginPage.userPage.getText(), username );
+
+       } );
+
+       it( 'should be able to change preferences', function () {
+
+               var realName = Math.random().toString();
+
+               // create
+               CreateAccountPage.createAccount( username, password );
+
+               // change real name
+               PreferencesPage.changeRealName( realName );
+
+               // check
+               assert.equal( PreferencesPage.realName.getValue(), realName );
+
+       } );
+
+} );
diff --git a/tests/selenium/wdio.conf.jenkins.js b/tests/selenium/wdio.conf.jenkins.js
new file mode 100644 (file)
index 0000000..6049eb2
--- /dev/null
@@ -0,0 +1,20 @@
+/* eslint no-undef: "error" */
+/* eslint-env node */
+'use strict';
+var merge = require( 'deepmerge' ),
+       wdioConf = require( './wdio.conf.js' );
+
+// Overwrite default settings
+exports.config = merge( wdioConf.config, {
+       username: 'WikiAdmin',
+       password: 'testpass',
+       screenshotPath: '../log/',
+       baseUrl: process.env.MW_SERVER + process.env.MW_SCRIPT_PATH,
+
+       reporters: [ 'spec', 'junit' ],
+       reporterOptions: {
+               junit: {
+                       outputDir: '../log/'
+               }
+       }
+} );
diff --git a/tests/selenium/wdio.conf.js b/tests/selenium/wdio.conf.js
new file mode 100644 (file)
index 0000000..f132899
--- /dev/null
@@ -0,0 +1,228 @@
+/* eslint comma-dangle: 0 */
+/* eslint no-undef: "error" */
+/* eslint no-console: 0 */
+/* eslint-env node */
+'use strict';
+
+const path = require( 'path' );
+
+function relPath( foo ) {
+       return path.resolve( __dirname, '../..', foo );
+}
+
+exports.config = {
+
+       //
+       // ======
+       //
+       // ======
+       // Custom
+       // ======
+       // Define any custom variables.
+       // Example:
+       // username: 'Admin',
+       // Use if from tests with:
+       // browser.options.username
+       username: process.env.MEDIAWIKI_USER === undefined ?
+               'Admin' :
+               process.env.MEDIAWIKI_USER,
+       password: process.env.MEDIAWIKI_PASSWORD === undefined ?
+               'vagrant' :
+               process.env.MEDIAWIKI_PASSWORD,
+       //
+       // ==================
+       // Specify Test Files
+       // ==================
+       // Define which test specs should run. The pattern is relative to the directory
+       // from which `wdio` was called. Notice that, if you are calling `wdio` from an
+       // NPM script (see https://docs.npmjs.com/cli/run-script) then the current working
+       // directory is where your package.json resides, so `wdio` will be called from there.
+       //
+       specs: [
+               relPath( './tests/selenium/specs/**/*.js' ),
+               relPath( './extensions/*/tests/selenium/specs/**/*.js' ),
+               relPath( './extensions/VisualEditor/modules/ve-mw/tests/selenium/specs/**/*.js' )
+       ],
+       // Patterns to exclude.
+       exclude: [
+       // 'path/to/excluded/files'
+       ],
+       //
+       // ============
+       // Capabilities
+       // ============
+       // Define your capabilities here. WebdriverIO can run multiple capabilities at the same
+       // time. Depending on the number of capabilities, WebdriverIO launches several test
+       // sessions. Within your capabilities you can overwrite the spec and exclude options in
+       // order to group specific specs to a specific capability.
+       //
+       // First, you can define how many instances should be started at the same time. Let's
+       // say you have 3 different capabilities (Chrome, Firefox, and Safari) and you have
+       // set maxInstances to 1; wdio will spawn 3 processes. Therefore, if you have 10 spec
+       // files and you set maxInstances to 10, all spec files will get tested at the same time
+       // and 30 processes will get spawned. The property handles how many capabilities
+       // from the same test should run tests.
+       //
+       maxInstances: 1,
+       //
+       // If you have trouble getting all important capabilities together, check out the
+       // Sauce Labs platform configurator - a great tool to configure your capabilities:
+       // https://docs.saucelabs.com/reference/platforms-configurator
+       //
+       // For Chrome/Chromium https://sites.google.com/a/chromium.org/chromedriver/capabilities
+       capabilities: [ {
+               // maxInstances can get overwritten per capability. So if you have an in-house Selenium
+               // grid with only 5 firefox instances available you can make sure that not more than
+               // 5 instances get started at a time.
+               maxInstances: 1,
+               //
+               browserName: 'chrome',
+               // Since Chrome v57 https://bugs.chromium.org/p/chromedriver/issues/detail?id=1625
+               chromeOptions: {
+                       args: [ '--enable-automation' ]
+               }
+       } ],
+       //
+       // ===================
+       // Test Configurations
+       // ===================
+       // Define all options that are relevant for the WebdriverIO instance here
+       //
+       // By default WebdriverIO commands are executed in a synchronous way using
+       // the wdio-sync package. If you still want to run your tests in an async way
+       // e.g. using promises you can set the sync option to false.
+       sync: true,
+       //
+       // Level of logging verbosity: silent | verbose | command | data | result | error
+       logLevel: 'error',
+       //
+       // Enables colors for log output.
+       coloredLogs: true,
+       //
+       // Saves a screenshot to a given path if a command fails.
+       screenshotPath: './log/',
+       //
+       // Set a base URL in order to shorten url command calls. If your url parameter starts
+       // with "/", then the base url gets prepended.
+       baseUrl: (
+               process.env.MW_SERVER === undefined ?
+               'http://127.0.0.1:8080' :
+               process.env.MW_SERVER
+       ) + (
+               process.env.MW_SCRIPT_PATH === undefined ?
+               '/w' :
+               process.env.MW_SCRIPT_PATH
+       ),
+       //
+       // Default timeout for all waitFor* commands.
+       waitforTimeout: 20000,
+       //
+       // Default timeout in milliseconds for request
+       // if Selenium Grid doesn't send response
+       connectionRetryTimeout: 90000,
+       //
+       // Default request retries count
+       connectionRetryCount: 3,
+       //
+       // Initialize the browser instance with a WebdriverIO plugin. The object should have the
+       // plugin name as key and the desired plugin options as properties. Make sure you have
+       // the plugin installed before running any tests. The following plugins are currently
+       // available:
+       // WebdriverCSS: https://github.com/webdriverio/webdrivercss
+       // WebdriverRTC: https://github.com/webdriverio/webdriverrtc
+       // Browserevent: https://github.com/webdriverio/browserevent
+       // plugins: {
+       //     webdrivercss: {
+       //         screenshotRoot: 'my-shots',
+       //         failedComparisonsRoot: 'diffs',
+       //         misMatchTolerance: 0.05,
+       //         screenWidth: [320,480,640,1024]
+       //     },
+       //     webdriverrtc: {},
+       //     browserevent: {}
+       // },
+       //
+       // Test runner services
+       // Services take over a specific job you don't want to take care of. They enhance
+       // your test setup with almost no effort. Unlike plugins, they don't add new
+       // commands. Instead, they hook themselves up into the test process.
+       // services: [],//
+       // Framework you want to run your specs with.
+       // The following are supported: Mocha, Jasmine, and Cucumber
+       // see also: http://webdriver.io/guide/testrunner/frameworks.html
+       //
+       // Make sure you have the wdio adapter package for the specific framework installed
+       // before running any tests.
+       framework: 'mocha',
+
+       // Test reporter for stdout.
+       // The only one supported by default is 'dot'
+       // see also: http://webdriver.io/guide/testrunner/reporters.html
+       reporters: [ 'spec' ],
+       //
+       // Options to be passed to Mocha.
+       // See the full list at http://mochajs.org/
+       mochaOpts: {
+               ui: 'bdd',
+               timeout: 20000
+       },
+       //
+       // =====
+       // Hooks
+       // =====
+       // WebdriverIO provides several hooks you can use to interfere with the test process in order to enhance
+       // it and to build services around it. You can either apply a single function or an array of
+       // methods to it. If one of them returns with a promise, WebdriverIO will wait until that promise got
+       // resolved to continue.
+       //
+       // Gets executed once before all workers get launched.
+       // onPrepare: function ( config, capabilities ) {
+       // }
+       //
+       // Gets executed before test execution begins. At this point you can access all global
+       // variables, such as `browser`. It is the perfect place to define custom commands.
+       // before: function (capabilities, specs) {
+       // },
+       //
+       // Hook that gets executed before the suite starts
+       // beforeSuite: function (suite) {
+       // },
+       //
+       // Hook that gets executed _before_ a hook within the suite starts (e.g. runs before calling
+       // beforeEach in Mocha)
+       // beforeHook: function () {
+       // },
+       //
+       // Hook that gets executed _after_ a hook within the suite starts (e.g. runs after calling
+       // afterEach in Mocha)
+       //
+       // Function to be executed before a test (in Mocha/Jasmine) or a step (in Cucumber) starts.
+       // beforeTest: function (test) {
+       // },
+       //
+       // Runs before a WebdriverIO command gets executed.
+       // beforeCommand: function (commandName, args) {
+       // },
+       //
+       // Runs after a WebdriverIO command gets executed
+       // afterCommand: function (commandName, args, result, error) {
+       // },
+       //
+       // Function to be executed after a test (in Mocha/Jasmine) or a step (in Cucumber) starts.
+       // afterTest: function (test) {
+       // },
+       //
+       // Hook that gets executed after the suite has ended
+       // afterSuite: function (suite) {
+       // },
+       //
+       // Gets executed after all tests are done. You still have access to all global variables from
+       // the test.
+       // after: function (result, capabilities, specs) {
+       // },
+       //
+       // Gets executed after all workers got shut down and the process is about to exit. It is not
+       // possible to defer the end of the process using a promise.
+       // onComplete: function(exitCode) {
+       // }
+};
index de201b9..d97f8e8 100644 (file)
--- a/thumb.php
+++ b/thumb.php
@@ -22,6 +22,7 @@
  */
 
 use MediaWiki\Logger\LoggerFactory;
+use MediaWiki\MediaWikiServices;
 
 define( 'MW_NO_OUTPUT_COMPRESSION', 1 );
 require __DIR__ . '/includes/WebStart.php';
@@ -317,7 +318,9 @@ function wfStreamThumb( array $params ) {
                $streamtime = microtime( true ) - $starttime;
 
                if ( $status->isOK() ) {
-                       RequestContext::getMain()->getStats()->timing( 'media.thumbnail.stream', $streamtime );
+                       MediaWikiServices::getInstance()->getStatsdDataFactory()->timing(
+                               'media.thumbnail.stream', $streamtime
+                       );
                } else {
                        wfThumbError( 500, 'Could not stream the file', null, [ 'file' => $thumbName,
                                'path' => $thumbPath, 'error' => $status->getWikiText( false, false, 'en' ) ] );